diff options
author | Jeff Johnston <jjohnstn@redhat.com> | 2009-04-22 19:48:07 +0000 |
---|---|---|
committer | Jeff Johnston <jjohnstn@redhat.com> | 2009-04-22 19:48:07 +0000 |
commit | bc6b90cc1046dbb18f9a7c2b7411e91593d4b175 (patch) | |
tree | 570c8d89f63ad8f8784b735fb2c019ca15cce289 /libgloss/moxie/qemu-time.c | |
parent | 96baa3e74ab8bacb3ba3caa6863dfcc01e542883 (diff) | |
download | cygnal-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.c | 116 |
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; +} |