summaryrefslogtreecommitdiffstats
path: root/libgloss/moxie/qemu-time.c
diff options
context:
space:
mode:
authorJeff Johnston <jjohnstn@redhat.com>2009-04-22 19:48:07 +0000
committerJeff Johnston <jjohnstn@redhat.com>2009-04-22 19:48:07 +0000
commitbc6b90cc1046dbb18f9a7c2b7411e91593d4b175 (patch)
tree570c8d89f63ad8f8784b735fb2c019ca15cce289 /libgloss/moxie/qemu-time.c
parent96baa3e74ab8bacb3ba3caa6863dfcc01e542883 (diff)
downloadcygnal-bc6b90cc1046dbb18f9a7c2b7411e91593d4b175.tar.gz
cygnal-bc6b90cc1046dbb18f9a7c2b7411e91593d4b175.tar.bz2
cygnal-bc6b90cc1046dbb18f9a7c2b7411e91593d4b175.zip
2009-04-22 Anthony Green <green@moxielogic.com>
* configure.in: Add moxie support. * configure: Regenerate. * moxie/aclocal.m4, moxie/configure, moxie/configure.in, moxie/crt0.S, moxie/fstat.c, moxie/getpid.c, isatty.c, moxie/kill.c, moxie/Makefile.in, moxie/moxie-elf-common.ld, moxie/print.c, moxie/putnum.c, moxie/qemu.ld, moxie/qemu-time.c, moxie/qemu-write.c, moxie/sbrk.c, moxie/sim-close.S, moxie/sim-exit.S, moxie/sim-inbyte.c, moxie/sim.ld, moxie/sim-lseek.c, moxie/sim-lseek.S, moxie/sim-open.S, moxie/sim-read.S, moxie/sim-time.c, moxie/sim-unlink.S, moxie/sim-write.S, moxie/stat.c: New files.
Diffstat (limited to 'libgloss/moxie/qemu-time.c')
-rw-r--r--libgloss/moxie/qemu-time.c116
1 files changed, 116 insertions, 0 deletions
diff --git a/libgloss/moxie/qemu-time.c b/libgloss/moxie/qemu-time.c
new file mode 100644
index 000000000..4b0920994
--- /dev/null
+++ b/libgloss/moxie/qemu-time.c
@@ -0,0 +1,116 @@
+/* qemu-time.c -- stubs so clock can be linked in.
+ *
+ * Copyright (c) 2008 Anthony Green
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+#include <errno.h>
+#include <time.h>
+#include <sys/time.h>
+#include <sys/times.h>
+#include "glue.h"
+
+/* This is the base address of the mc146818 RTC i/o port. */
+#define RTC_PORT 0x400
+
+#define RTC_SECONDS 0x00
+#define RTC_SECONDS_ALARM 0x01
+#define RTC_MINUTES 0x02
+#define RTC_MINUTES_ALARM 0x03
+#define RTC_HOURS 0x04
+#define RTC_HOURS_ALARM 0x05
+#define RTC_DAY_OF_WEEK 0x06
+#define RTC_DATE_OF_MONTH 0x07
+#define RTC_MONTH 0x08
+#define RTC_YEAR 0x09
+#define RTC_CONFIG_A 0x0A
+#define RTC_CONFIG_B 0x0B
+#define RTC_CONFIG_C 0x0C
+#define RTC_CONFIG_D 0x0D
+
+/*
+ * _times -- FIXME
+ */
+int
+_DEFUN (_times, _times (buf),
+ struct tms *buf)
+{
+ errno = EINVAL;
+ return (-1);
+}
+
+/* Read a value from the RTC port. */
+static unsigned char
+rtc_read (unsigned char reg)
+{
+ *(volatile unsigned char *)(RTC_PORT) = reg;
+ return *(volatile unsigned char *)(RTC_PORT + 1);
+}
+
+/* Write a value to the RTC port. */
+static void
+rtc_write (unsigned char reg, unsigned char val)
+{
+ *(volatile unsigned char *)(RTC_PORT) = reg;
+ *(volatile unsigned char *)(RTC_PORT + 1) = val;
+}
+
+/* Convert BCD to Decimal. */
+#define BCD2DEC(BYTE) ((((BYTE >> 4) & 0xF) * 10) + (BYTE & 0xF))
+
+/*
+ * time -- return current time in seconds.
+ */
+time_t
+_DEFUN (time, time (t),
+ time_t *t)
+{
+ struct tm tm;
+ time_t ret;
+
+ tm.tm_sec = BCD2DEC(rtc_read(RTC_SECONDS));
+ tm.tm_min = BCD2DEC(rtc_read(RTC_MINUTES));
+ tm.tm_hour = BCD2DEC(rtc_read(RTC_HOURS));
+ tm.tm_wday = BCD2DEC(rtc_read(RTC_DAY_OF_WEEK)) - 1;
+ tm.tm_mday = BCD2DEC(rtc_read(RTC_DATE_OF_MONTH));
+ tm.tm_mon = BCD2DEC(rtc_read(RTC_MONTH)) - 1;
+ tm.tm_year = BCD2DEC(rtc_read(RTC_YEAR)) + 100;
+
+ /* FIXME. Not really sure how to handle this. */
+ tm.tm_isdst = 1;
+
+ ret = mktime(&tm);
+
+ if (t)
+ *t = ret;
+
+ return ret;
+}
+
+/*
+ * _gettimeofday -- implement in terms of time, which means we can't
+ * return the microseconds.
+ */
+int
+_DEFUN (_gettimeofday, _gettimeofday (tv, tz),
+ struct timeval *tv _AND
+ void *tzvp)
+{
+ struct timezone *tz = tzvp;
+ struct tm tm;
+ if (tz)
+ tz->tz_minuteswest = tz->tz_dsttime = 0;
+
+ tv->tv_usec = 0;
+ tv->tv_sec = time(0);
+
+ return 0;
+}