diff options
author | Tobias Weingartner <weingart@cvs.openbsd.org> | 1997-04-28 07:39:02 +0000 |
---|---|---|
committer | Tobias Weingartner <weingart@cvs.openbsd.org> | 1997-04-28 07:39:02 +0000 |
commit | 4ef6cdf0befb6c0f6216955125f8fd6d6baea02b (patch) | |
tree | d0a9420019dcc83c39ce68afde0645bb60f89e55 /sys/arch/i386/stand | |
parent | c941e38f34044523866fe64fcdcee65a8d1d2a77 (diff) |
Add getsecs(). Use biostime & biosdate routines.
Parse and convert to seconds since epoch. Please
test, there is a new command "time", which should
print the current time (according to the BIOS) on
the console.
Diffstat (limited to 'sys/arch/i386/stand')
-rw-r--r-- | sys/arch/i386/stand/boot/cmd.c | 16 | ||||
-rw-r--r-- | sys/arch/i386/stand/libsa/Makefile | 5 | ||||
-rw-r--r-- | sys/arch/i386/stand/libsa/biosdev.h | 8 | ||||
-rw-r--r-- | sys/arch/i386/stand/libsa/biostime.S | 66 | ||||
-rw-r--r-- | sys/arch/i386/stand/libsa/time.c | 141 |
5 files changed, 229 insertions, 7 deletions
diff --git a/sys/arch/i386/stand/boot/cmd.c b/sys/arch/i386/stand/boot/cmd.c index 7d196c09859..2dd7a222cdb 100644 --- a/sys/arch/i386/stand/boot/cmd.c +++ b/sys/arch/i386/stand/boot/cmd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd.c,v 1.12 1997/04/26 17:50:07 mickey Exp $ */ +/* $OpenBSD: cmd.c,v 1.13 1997/04/28 07:39:00 weingart Exp $ */ /* * Copyright (c) 1997 Michael Shalayeff @@ -63,6 +63,7 @@ static int Xregs __P((register struct cmd_state *)); static int Xset __P((register struct cmd_state *)); static int Xhowto __P((register struct cmd_state *)); static int Xtty __P((register struct cmd_state *)); +static int Xtime __P((register struct cmd_state *)); struct cmd_table { char *cmd_name; @@ -92,6 +93,7 @@ static const struct cmd_table cmd_table[] = { {"reboot", Xreboot}, {"regs", Xregs}, {"set", Xset, cmd_set}, + {"time", Xtime}, {NULL, 0}, }; @@ -413,6 +415,18 @@ Xtty(cmd) } static int +Xtime(cmd) + register struct cmd_state *cmd; +{ + if (cmd->argc == 1) + time_print(); + else { + } + + return 0; +} + +static int Xls(cmd) register struct cmd_state *cmd; { diff --git a/sys/arch/i386/stand/libsa/Makefile b/sys/arch/i386/stand/libsa/Makefile index e51dd626693..aba5ea1a4ee 100644 --- a/sys/arch/i386/stand/libsa/Makefile +++ b/sys/arch/i386/stand/libsa/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.10 1997/04/18 02:14:28 mickey Exp $ +# $OpenBSD: Makefile,v 1.11 1997/04/28 07:39:00 weingart Exp $ LIB= sa @@ -16,7 +16,8 @@ AS+= -R # i386 stuff (so, it will possibly load in the same 64k) SRCS= unixsys.S bioscom.S biosdisk.S bioskbd.S biostime.S biosmem.S gidt.S \ - debug_i386.S dev_i386.c exec_i386.c biosdev.c gateA20.c memprobe.c + debug_i386.S dev_i386.c exec_i386.c biosdev.c gateA20.c memprobe.c \ + time.c # stand routines SRCS+= alloc.c exit.c exec.c getfile.c gets.c globals.c strcmp.c strlen.c \ diff --git a/sys/arch/i386/stand/libsa/biosdev.h b/sys/arch/i386/stand/libsa/biosdev.h index fd556f44e3a..3fca437122a 100644 --- a/sys/arch/i386/stand/libsa/biosdev.h +++ b/sys/arch/i386/stand/libsa/biosdev.h @@ -1,4 +1,4 @@ -/* $OpenBSD: biosdev.h,v 1.7 1997/04/23 14:49:23 weingart Exp $ */ +/* $OpenBSD: biosdev.h,v 1.8 1997/04/28 07:39:01 weingart Exp $ */ /* * Copyright (c) 1996 Michael Shalayeff @@ -69,6 +69,12 @@ int com_ischar __P((void)); /* biosmem.S */ u_int biosmem __P((void)); +/* time.c */ +void time_print __P((void)); +time_t getsecs __P((void)); + /* biostime.S */ int usleep __P((u_long)); +int biostime __P((char *)); +int biosdate __P((char *)); #endif diff --git a/sys/arch/i386/stand/libsa/biostime.S b/sys/arch/i386/stand/libsa/biostime.S index 0640542fce5..0a0ddf86820 100644 --- a/sys/arch/i386/stand/libsa/biostime.S +++ b/sys/arch/i386/stand/libsa/biostime.S @@ -1,4 +1,4 @@ -/* $OpenBSD: biostime.S,v 1.5 1997/04/21 20:20:28 mickey Exp $ */ +/* $OpenBSD: biostime.S,v 1.6 1997/04/28 07:39:01 weingart Exp $ */ /* * Copyright (c) 1997 Michael Shalayeff @@ -58,9 +58,69 @@ ENTRY(usleep) popl %ecx ret + /* - * + * int biostime(char buf[4]) */ -ENTRY(getsecs) +ENTRY(biostime) + pushl %ebp + movl %esp, %ebp + + pushl %ecx + pushl %ebx + + /* Get address of buffer */ + movl 8(%ebp), %ebx + + movb $0x02, %ah + BIOSINT(0x1a) + jc 1f + + movl $0x0, %eax + movb %ch, 0(%ebx) + movb %cl, 1(%ebx) + movb %dh, 2(%ebx) + movb %dl, 3(%ebx) + + jmp 2f + +1: movl $0x01, %eax + +2: popl %ebx + popl %ecx + popl %ebp + ret + + +/* + * int biosdate(char buf[4]) + */ +ENTRY(biosdate) + pushl %ebp + movl %esp, %ebp + + pushl %ecx + pushl %ebx + + /* Get address of buffer */ + movl 8(%ebp), %ebx + + movb $0x04, %ah + BIOSINT(0x1a) + jc 1f + + movl $0x0, %eax + movb %ch, 0(%ebx) + movb %cl, 1(%ebx) + movb %dh, 2(%ebx) + movb %dl, 3(%ebx) + + jmp 2f + +1: movl $0x01, %eax + +2: popl %ebx + popl %ecx + popl %ebp ret diff --git a/sys/arch/i386/stand/libsa/time.c b/sys/arch/i386/stand/libsa/time.c new file mode 100644 index 00000000000..8438a3b3f2a --- /dev/null +++ b/sys/arch/i386/stand/libsa/time.c @@ -0,0 +1,141 @@ +/* $OpenBSD: time.c,v 1.1 1997/04/28 07:39:01 weingart Exp $ */ + +#include <libsa.h> +#include <sys/time.h> +#include "biosdev.h" + +#define isleap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0) + + +/* + * Convert from bcd (packed) to int + */ +static int bcdtoint(char c){ + int tens; + int ones; + + tens = (c & 0xf0) >> 4; + tens *= 10; + ones = c & 0x0f; + + return (tens + ones); +} + + +/* Number of days per month */ +static int monthcount[] = { + 31, 28, 31, 30, 31, 30, 31, + 31, 30, 31, 30, 31, 30, 31 +}; + +/* + * Quick compute of time in seconds since the Epoch + */ +static time_t +compute(int year, int month, int day, int hour, int min, int sec){ + int yearsec, daysec, timesec; + int i; + + /* Compute years of seconds */ + yearsec = year - 1970; + yearsec *= (365 * 24 * 60 * 60); + + /* Compute days of seconds */ + daysec = 0; + for(i = 1; i < month; i++){ + daysec += monthcount[i]; + } + daysec += day; + + /* Compute for leap year */ + for(i = 1970; i < year; i++){ + if(isleap(i)) + daysec += 1; + } + daysec *= (24 * 60 * 60); + + /* Plus the time */ + timesec = sec; + timesec += (min * 60); + timesec += (hour * 60 * 60); + + /* Return sum */ + return (yearsec + daysec + timesec); +} + + +/* + * Return time since epoch + */ +time_t getsecs(void){ + char timebuf[4], datebuf[4]; + int st1, st2; + time_t tt = 0; + + /* Query BIOS for time & date */ + st1 = biostime(timebuf); + st2 = biosdate(datebuf); + + /* Convert to seconds since Epoch */ + if(!st1 && !st2){ + int year, month, day; + int hour, min, sec; + int dst; + + dst = bcdtoint(timebuf[3]); + sec = bcdtoint(timebuf[2]); + min = bcdtoint(timebuf[1]); + hour = bcdtoint(timebuf[0]); + + year = bcdtoint(datebuf[0]); + year *= 100; + year += bcdtoint(datebuf[1]); + month = bcdtoint(datebuf[2]); + day = bcdtoint(datebuf[3]); + + printf("%d/%d/%d - %d:%d:%d\n", day, month, year, hour, min, sec); + + tt = compute(year, month, day, hour, min, sec); + return(tt); + } + + return(1); +} + + +/* + * Return time since epoch + */ +void time_print(void){ + char timebuf[4], datebuf[4]; + int st1, st2; + + /* Query BIOS for time & date */ + st1 = biostime(timebuf); + st2 = biosdate(datebuf); + + /* Convert to sane values */ + if (!st1 && !st2) { + int year, month, day; + int hour, min, sec; + int dst; + + dst = bcdtoint(timebuf[3]); + sec = bcdtoint(timebuf[2]); + min = bcdtoint(timebuf[1]); + hour = bcdtoint(timebuf[0]); + + year = bcdtoint(datebuf[0]); + year *= 100; + year += bcdtoint(datebuf[1]); + month = bcdtoint(datebuf[2]); + day = bcdtoint(datebuf[3]); + + printf("%d/%d/%d - %d:%d:%d\n", day, month, year, hour, min, sec); + + } else + printf("Error in biostime() or biosdate().\n"); + + return; +} + |