diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2011-09-15 00:48:25 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2011-09-15 00:48:25 +0000 |
commit | d01c124a9f964e11364ea050866a3f484542f7b5 (patch) | |
tree | d6cdfbd76fbc0bacc881e523fead3fdc42fb4f94 /sys | |
parent | dcd4e2631102842425eff8af339c2c99ea04bfd0 (diff) |
Switch vax to timecounters. There are three different clock sources:
- ICR/NICR on most systems (1MHz counter resolution).
- diagnostic timer on KA46/KA48 (1kHz counter resolution, counter is actually
running at around 1024 kHz but is not guaranteed to be monotonic at this
rate).
- 100Hz clock on VXT (nothing but the 100Hz clock interrupt).
Tested on KA49 (ICR style), KA46, KA48 (diagtmr style), VXT2000+ (VXT
{empty,hopeless}ness'r'us style).
Diffstat (limited to 'sys')
-rw-r--r-- | sys/arch/vax/include/_types.h | 5 | ||||
-rw-r--r-- | sys/arch/vax/include/clock.h | 11 | ||||
-rw-r--r-- | sys/arch/vax/include/cpu.h | 23 | ||||
-rw-r--r-- | sys/arch/vax/vax/clock.c | 262 | ||||
-rw-r--r-- | sys/arch/vax/vax/ka410.c | 4 | ||||
-rw-r--r-- | sys/arch/vax/vax/ka43.c | 4 | ||||
-rw-r--r-- | sys/arch/vax/vax/ka48.c | 12 | ||||
-rw-r--r-- | sys/arch/vax/vax/ka49.c | 4 | ||||
-rw-r--r-- | sys/arch/vax/vax/ka53.c | 4 | ||||
-rw-r--r-- | sys/arch/vax/vax/ka60.c | 17 | ||||
-rw-r--r-- | sys/arch/vax/vax/ka630.c | 4 | ||||
-rw-r--r-- | sys/arch/vax/vax/ka650.c | 16 | ||||
-rw-r--r-- | sys/arch/vax/vax/ka660.c | 4 | ||||
-rw-r--r-- | sys/arch/vax/vax/ka670.c | 4 | ||||
-rw-r--r-- | sys/arch/vax/vax/ka680.c | 4 | ||||
-rw-r--r-- | sys/arch/vax/vax/vxt.c | 9 |
16 files changed, 232 insertions, 155 deletions
diff --git a/sys/arch/vax/include/_types.h b/sys/arch/vax/include/_types.h index cbe54c2234e..c30c99e25f4 100644 --- a/sys/arch/vax/include/_types.h +++ b/sys/arch/vax/include/_types.h @@ -1,4 +1,4 @@ -/* $OpenBSD: _types.h,v 1.12 2011/09/08 03:40:32 guenther Exp $ */ +/* $OpenBSD: _types.h,v 1.13 2011/09/15 00:48:24 miod Exp $ */ /*- * Copyright (c) 1990, 1993 @@ -142,4 +142,7 @@ typedef int __rune_t; typedef void * __wctrans_t; typedef void * __wctype_t; +/* Feature test macros */ +#define __HAVE_TIMECOUNTER + #endif /* _MACHINE__TYPES_H_ */ diff --git a/sys/arch/vax/include/clock.h b/sys/arch/vax/include/clock.h index 00caf4d1c2a..971486834c7 100644 --- a/sys/arch/vax/include/clock.h +++ b/sys/arch/vax/include/clock.h @@ -1,4 +1,4 @@ -/* $OpenBSD: clock.h,v 1.8 2008/08/18 23:19:24 miod Exp $ */ +/* $OpenBSD: clock.h,v 1.9 2011/09/15 00:48:24 miod Exp $ */ /* $NetBSD: clock.h,v 1.4 1999/09/06 19:52:53 ragge Exp $ */ /* * Copyright (c) 1996 Ludd, University of Lule}, Sweden. @@ -42,10 +42,6 @@ #define DAYSPERYEAR(y) (IS_LEAPYEAR(y) ? 366 : 365) #define SECPERYEAR(y) (DAYSPERYEAR(y) * SEC_PER_DAY) -#define CLKREAD_OK 0 -#define CLKREAD_BAD -1 -#define CLKREAD_WARN -2 - #define TODRBASE (1 << 28) /* Rumours say it comes from VMS */ #define SEC_OFF 0 @@ -70,9 +66,10 @@ extern volatile short *clk_page; extern int clk_adrshift, clk_tweak; /* Prototypes */ -int generic_clkread(time_t); +void icr_hardclock(struct clockframe *); +int generic_clkread(struct timespec *, time_t); void generic_clkwrite(void); -int chip_clkread(time_t); +int chip_clkread(struct timespec *, time_t); void chip_clkwrite(void); int yeartonum(int); diff --git a/sys/arch/vax/include/cpu.h b/sys/arch/vax/include/cpu.h index 79b350094ac..d16676d7ad5 100644 --- a/sys/arch/vax/include/cpu.h +++ b/sys/arch/vax/include/cpu.h @@ -1,5 +1,5 @@ -/* $OpenBSD: cpu.h,v 1.39 2011/07/06 20:42:05 miod Exp $ */ -/* $NetBSD: cpu.h,v 1.41 1999/10/21 20:01:36 ragge Exp $ */ +/* $OpenBSD: cpu.h,v 1.40 2011/09/15 00:48:24 miod Exp $ */ +/* $NetBSD: cpu.h,v 1.41 1999/10/21 20:01:36 ragge Exp $ */ /* * Copyright (c) 1994 Ludd, University of Lule}, Sweden @@ -70,8 +70,8 @@ extern struct cpu_info cpu_info_store; #define cpu_unidle(ci) struct clockframe { - int pc; - int ps; + int pc; + int ps; }; /* @@ -79,12 +79,11 @@ struct clockframe { * struct for the current cpu is set up in locore.c. */ struct cpu_dep { - void (*cpu_init)(void); /* pmap init before mm is on */ - int (*cpu_mchk)(caddr_t); /* Machine check handling */ - void (*cpu_memerr)(void); /* Memory subsystem errors */ - /* Autoconfiguration */ - void (*cpu_conf)(void); - int (*cpu_clkread)(time_t); /* Read cpu clock time */ + void (*cpu_init)(void); /* pmap init before mm is on */ + int (*cpu_mchk)(caddr_t); /* Machine check handling */ + void (*cpu_memerr)(void); /* Memory subsystem errors */ + void (*cpu_conf)(void); /* Autoconfiguration */ + int (*cpu_clkread)(struct timespec *, time_t); /* Read cpu clock time */ void (*cpu_clkwrite)(void); /* Write system time to cpu */ short cpu_vups; /* speed of cpu */ short cpu_scbsz; /* (estimated) size of system control block */ @@ -116,9 +115,9 @@ extern int bootdev; * process as soon as possible. */ -#define signotify(p) mtpr(AST_OK,PR_ASTLVL); +#define signotify(p) mtpr(AST_OK,PR_ASTLVL); -extern int want_resched; /* resched() was called */ +extern int want_resched; /* resched() was called */ /* * This is used during profiling to integrate system time. diff --git a/sys/arch/vax/vax/clock.c b/sys/arch/vax/vax/clock.c index cfb9cdc904f..6344deede50 100644 --- a/sys/arch/vax/vax/clock.c +++ b/sys/arch/vax/vax/clock.c @@ -1,4 +1,4 @@ -/* $OpenBSD: clock.c,v 1.23 2011/07/06 18:32:59 miod Exp $ */ +/* $OpenBSD: clock.c,v 1.24 2011/09/15 00:48:24 miod Exp $ */ /* $NetBSD: clock.c,v 1.35 2000/06/04 06:16:58 matt Exp $ */ /* * Copyright (c) 1995 Ludd, University of Lule}, Sweden. @@ -35,6 +35,7 @@ #include <sys/kernel.h> #include <sys/systm.h> #include <sys/device.h> +#include <sys/timetc.h> #include <dev/clock_subr.h> @@ -45,62 +46,45 @@ #include <machine/uvax.h> struct evcount clock_intrcnt; +uint32_t icr_count; + +#if defined(VAX46) || defined(VAX48) +u_int vax_diagtmr_get_tc(struct timecounter *); /* - * microtime() should return number of usecs in struct timeval. - * We may get wrap-arounds, but that will be fixed with lasttime - * check. This may fault within 10 msecs. + * This counter is only reliable in millisecond units. See comments in + * vax_diagtmr_get_tc() for details. */ -void -microtime(tvp) - struct timeval *tvp; -{ - int s, i; - static struct timeval lasttime; +struct timecounter vax_diagtmr_tc = { + .tc_get_timecount = vax_diagtmr_get_tc, + .tc_counter_mask = 0xffff, /* 16 bits */ + .tc_frequency = 1000, /* 1kHz */ + /* tc_name will be filled in */ + .tc_quality = 100 +}; +#endif - s = splhigh(); - bcopy((caddr_t)&time, tvp, sizeof(struct timeval)); +#ifdef VXT +u_int vax_vxt_get_tc(struct timecounter *); - switch (vax_boardtype) { -#ifdef VAX46 - case VAX_BTYP_46: - { - extern struct vs_cpu *ka46_cpu; - i = *(volatile int *)(&ka46_cpu->vc_diagtimu); - i = (i >> 16) * 1024 + (i & 0x3ff); - } - break; -#endif -#if defined(VAX48) || defined(VXT) - case VAX_BTYP_48: - case VAX_BTYP_VXT: - /* - * PR_ICR doesn't exist. We could use the vc_diagtimu - * counter, saving the value on the timer interrupt and - * subtracting that from the current value. - */ - i = 0; - break; +struct timecounter vax_vxt_tc = { + .tc_get_timecount = vax_vxt_get_tc, + .tc_counter_mask = 0xffffffff, + .tc_frequency = 100, /* 100Hz */ + .tc_name = "vxt", + .tc_quality = 0 +}; #endif - default: - i = mfpr(PR_ICR); - break; - } - i += tick; /* Get current interval count */ - tvp->tv_usec += i; - while (tvp->tv_usec >= 1000000) { - tvp->tv_sec++; - tvp->tv_usec -= 1000000; - } - if (tvp->tv_sec == lasttime.tv_sec && - tvp->tv_usec <= lasttime.tv_usec && - (tvp->tv_usec = lasttime.tv_usec + 1) >= 1000000) { - tvp->tv_sec++; - tvp->tv_usec -= 1000000; - } - bcopy(tvp, &lasttime, sizeof(struct timeval)); - splx(s); -} + +u_int vax_icr_get_tc(struct timecounter *); + +struct timecounter vax_icr_tc = { + .tc_get_timecount = vax_icr_get_tc, + .tc_counter_mask = 0xffffffff, + .tc_frequency = 1000000, /* 1MHz */ + .tc_name = "icr", + .tc_quality = 100 +}; /* * Sets year to the year in fs_time and then calculates the number of @@ -112,38 +96,35 @@ microtime(tvp) */ void -inittodr(fs_time) - time_t fs_time; +inittodr(time_t fs_time) { int rv, deltat; + struct timespec ts; - rv = (*dep_call->cpu_clkread) (fs_time); - switch (rv) { - - case CLKREAD_BAD: /* No useable information from system clock */ - time.tv_sec = fs_time; + rv = (*dep_call->cpu_clkread)(&ts, fs_time); + if (rv != 0) { + /* No useable information from system clock */ + ts.tv_sec = fs_time; + ts.tv_nsec = 0; resettodr(); - break; - - case CLKREAD_WARN: /* Just give the warning */ - break; - - default: /* System clock OK, no warning if we don't want to. */ - deltat = time.tv_sec - fs_time; + } else { + /* System clock OK, no warning if we don't want to. */ + deltat = ts.tv_sec - fs_time; if (deltat < 0) deltat = -deltat; if (deltat >= 2 * SEC_PER_DAY) { - printf("Clock has %s %d days", - time.tv_sec < fs_time ? "lost" : "gained", + printf("clock has %s %d days", + ts.tv_sec < fs_time ? "lost" : "gained", deltat / SEC_PER_DAY); - rv = CLKREAD_WARN; + rv = EINVAL; } - break; } - if (rv < CLKREAD_OK) + if (rv != 0) printf(" -- CHECK AND RESET THE DATE!\n"); + + tc_setclock(&ts); } /* @@ -155,29 +136,73 @@ resettodr() { (*dep_call->cpu_clkwrite)(); } + /* * A delayloop that delays about the number of milliseconds that is * given as argument. */ void -delay(i) - int i; +delay(int i) { asm ("1: sobgtr %0, 1b" : : "r" (dep_call->cpu_vups * i)); } /* * On all VAXen there are a microsecond clock that should - * be used for interval interrupts. Some CPUs don't use the ICR interval - * register but it doesn't hurt to load it anyway. + * be used for interval interrupts. We have to be wary of the few CPUs + * which don't implement the ICR interval register. */ void cpu_initclocks() { + switch (vax_boardtype) { +#ifdef VAX46 + /* VAXstation 4000/60: no ICR register but a specific timer */ + case VAX_BTYP_46: + { + extern struct vs_cpu *ka46_cpu; + + vax_diagtmr_tc.tc_priv = ka46_cpu; + vax_diagtmr_tc.tc_name = "KA46"; + tc_init(&vax_diagtmr_tc); + } + break; +#endif +#ifdef VAX48 + /* VAXstation 4000/VLC: no ICR register but a specific timer */ + case VAX_BTYP_48: + { + extern struct vs_cpu *ka48_cpu; + + vax_diagtmr_tc.tc_priv = ka48_cpu; + vax_diagtmr_tc.tc_name = "KA48"; + tc_init(&vax_diagtmr_tc); + } + break; +#endif +#ifdef VXT + /* VXT2000: neither NICR nor ICR registers, no known other timer. */ + case VAX_BTYP_VXT: + tc_init(&vax_vxt_tc); + break; +#endif + /* all other systems: NICR+ICR registers implementing a 1MHz timer. */ + default: + tc_init(&vax_icr_tc); + break; + } + + evcount_attach(&clock_intrcnt, "clock", NULL); if (vax_boardtype != VAX_BTYP_VXT) - mtpr(-10000, PR_NICR); /* Load in count register */ + mtpr(-tick, PR_NICR); /* Load in count register */ mtpr(0x800000d1, PR_ICCS); /* Start clock and enable interrupt */ - evcount_attach(&clock_intrcnt, "clock", NULL); +} + +void +icr_hardclock(struct clockframe *cf) +{ + icr_count += 10000; /* tick */ + hardclock(cf); } /* @@ -191,8 +216,7 @@ cpu_initclocks() * Converts a year to corresponding number of ticks. */ int -yeartonum(y) - int y; +yeartonum(int y) { int n; @@ -205,8 +229,7 @@ yeartonum(y) * Converts tick number to a year 70 -> */ int -numtoyear(num) - int num; +numtoyear(int num) { int y = 70, j; while (num >= (j = SECPERYEAR(y))) { @@ -218,13 +241,12 @@ numtoyear(num) #if VAX650 || VAX660 || VAX670 || VAX680 || VAX53 /* - * Reads the TODR register; returns a (probably) true tick value, - * or CLKREAD_BAD if failed. The year is based on the argument - * year; the TODR doesn't hold years. + * Reads the TODR register; returns 0 if a valid time has been found, EINVAL + * otherwise. The year is based on the argument year; the TODR doesn't hold + * years. */ int -generic_clkread(base) - time_t base; +generic_clkread(struct timespec *ts, time_t base) { unsigned klocka = mfpr(PR_TODR); @@ -236,11 +258,13 @@ generic_clkread(base) printf("TODR stopped"); else printf("TODR too small"); - return CLKREAD_BAD; + return EINVAL; } - time.tv_sec = yeartonum(numtoyear(base)) + (klocka - TODRBASE) / 100; - return CLKREAD_OK; + ts->tv_sec = + yeartonum(numtoyear(base)) + (klocka - TODRBASE) / 100; + ts->tv_nsec = 0; + return 0; } /* @@ -249,7 +273,7 @@ generic_clkread(base) void generic_clkwrite() { - unsigned tid = time.tv_sec, bastid; + uint32_t tid = time_second, bastid; bastid = tid - yeartonum(numtoyear(tid)); mtpr((bastid * 100) + TODRBASE, PR_TODR); @@ -266,8 +290,7 @@ int clk_tweak; /* Offset of time into word. */ #define REGPOKE(off, v) (clk_page[off << clk_adrshift] = ((v) << clk_tweak)) int -chip_clkread(base) - time_t base; +chip_clkread(struct timespec *ts, time_t base) { struct clock_ymdhms c; int timeout = 1<<15, s; @@ -279,12 +302,12 @@ chip_clkread(base) if ((REGPEEK(CSRD_OFF) & CSRD_VRT) == 0) { printf("WARNING: TOY clock not marked valid"); - return CLKREAD_BAD; + return EINVAL; } while (REGPEEK(CSRA_OFF) & CSRA_UIP) if (--timeout == 0) { printf ("TOY clock timed out"); - return CLKREAD_BAD; + return EINVAL; } s = splhigh(); @@ -297,8 +320,9 @@ chip_clkread(base) c.dt_sec = REGPEEK(SEC_OFF); splx(s); - time.tv_sec = clock_ymdhms_to_secs(&c); - return CLKREAD_OK; + ts->tv_sec = clock_ymdhms_to_secs(&c); + ts->tv_nsec = 0; + return 0; } void @@ -313,7 +337,7 @@ chip_clkwrite() REGPOKE(CSRB_OFF, CSRB_SET); - clock_secs_to_ymdhms(time.tv_sec, &c); + clock_secs_to_ymdhms(time_second, &c); REGPOKE(YR_OFF, ((u_char)(c.dt_year - 1970))); REGPOKE(MON_OFF, c.dt_mon); @@ -326,3 +350,49 @@ chip_clkwrite() REGPOKE(CSRB_OFF, CSRB_DM|CSRB_24); }; #endif + +#if defined(VAX46) || defined(VAX48) +u_int +vax_diagtmr_get_tc(struct timecounter *tc) +{ + /* + * The diagnostic timer runs at about 1024kHz. + * The microsecond counter counts from 0 to 1023 inclusive (so it + * really is a 1/1024th millisecond counter) and increments the + * millisecond counter, which is a free-running 16 bit counter. + * + * To compensate for the timer not running at exactly 1024kHz, + * the microsecond counter is reset (to zero) every clock interrupt, + * i.e. every 10 millisecond. + * + * Without resetting the microsecond counter, experiments show that, + * on KA48, the millisecond counter increments of 960 in a second, + * instead of the expected 1000 (i.e. a 24/25 ratio). But resetting + * the microsecond counter (which does not affect the millisecond + * counter value) ought to make it __slower__ - who can explain + * this behaviour? + * + * Because we reset the ``binary microsecond'' counter and can not + * afford time moving backwards, we only return the millisecond + * counter here. + */ + struct vs_cpu *vscpu; + + vscpu = (struct vs_cpu *)tc->tc_priv; + return *(volatile uint16_t *)&vscpu->vc_diagtimm; +} +#endif + +#ifdef VXT +u_int +vax_vxt_get_tc(struct timecounter *tc) +{ + return (u_int)clock_intrcnt.ec_count; +} +#endif + +u_int +vax_icr_get_tc(struct timecounter *tc) +{ + return icr_count + (u_int)(tick + (int)mfpr(PR_ICR)); +} diff --git a/sys/arch/vax/vax/ka410.c b/sys/arch/vax/vax/ka410.c index a9a7093fb4f..ec8e9616ede 100644 --- a/sys/arch/vax/vax/ka410.c +++ b/sys/arch/vax/vax/ka410.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ka410.c,v 1.12 2011/07/06 20:42:05 miod Exp $ */ +/* $OpenBSD: ka410.c,v 1.13 2011/09/15 00:48:24 miod Exp $ */ /* $NetBSD: ka410.c,v 1.21 1999/09/06 19:52:53 ragge Exp $ */ /* * Copyright (c) 1996 Ludd, University of Lule}, Sweden. @@ -79,7 +79,7 @@ struct cpu_dep ka410_calls = { ka410_halt, ka410_reboot, ka410_clrf, - hardclock + icr_hardclock }; diff --git a/sys/arch/vax/vax/ka43.c b/sys/arch/vax/vax/ka43.c index 0ce094f900d..01f47cf3812 100644 --- a/sys/arch/vax/vax/ka43.c +++ b/sys/arch/vax/vax/ka43.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ka43.c,v 1.14 2011/09/13 21:25:23 miod Exp $ */ +/* $OpenBSD: ka43.c,v 1.15 2011/09/15 00:48:24 miod Exp $ */ /* $NetBSD: ka43.c,v 1.19 1999/09/06 19:52:53 ragge Exp $ */ /* * Copyright (c) 1996 Ludd, University of Lule}, Sweden. @@ -81,7 +81,7 @@ struct cpu_dep ka43_calls = { ka43_halt, ka43_reboot, ka43_clrf, - hardclock + icr_hardclock }; static volatile struct ka43_cpu *ka43_cpu = (void *)KA43_CPU_BASE; diff --git a/sys/arch/vax/vax/ka48.c b/sys/arch/vax/vax/ka48.c index e9b68951abe..66c455dbf9a 100644 --- a/sys/arch/vax/vax/ka48.c +++ b/sys/arch/vax/vax/ka48.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ka48.c,v 1.12 2011/08/31 21:32:44 miod Exp $ */ +/* $OpenBSD: ka48.c,v 1.13 2011/09/15 00:48:24 miod Exp $ */ /* * Copyright (c) 1998 Ludd, University of Lule}, Sweden. * All rights reserved. @@ -61,6 +61,7 @@ static int ka48_mchk(caddr_t); static void ka48_halt(void); static void ka48_reboot(int); static void ka48_cache_enable(void); +static void ka48_hardclock(struct clockframe *); struct vs_cpu *ka48_cpu; @@ -79,7 +80,7 @@ struct cpu_dep ka48_calls = { ka48_halt, ka48_reboot, NULL, - hardclock + ka48_hardclock }; @@ -170,3 +171,10 @@ ka48_reboot(arg) ((u_int8_t *) clk_page)[KA48_CPMBX] = KA48_HLT_BOOT; asm("halt"); } + +static void +ka48_hardclock(struct clockframe *cf) +{ + ka48_cpu->vc_diagtimu = 0; + hardclock(cf); +} diff --git a/sys/arch/vax/vax/ka49.c b/sys/arch/vax/vax/ka49.c index 313aa64daa7..fdc3784da54 100644 --- a/sys/arch/vax/vax/ka49.c +++ b/sys/arch/vax/vax/ka49.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ka49.c,v 1.10 2011/07/06 20:42:05 miod Exp $ */ +/* $OpenBSD: ka49.c,v 1.11 2011/09/15 00:48:24 miod Exp $ */ /* * Copyright (c) 1999 Ludd, University of Lule}, Sweden. * All rights reserved. @@ -65,7 +65,7 @@ struct cpu_dep ka49_calls = { ka49_halt, ka49_reboot, NULL, - hardclock + icr_hardclock }; diff --git a/sys/arch/vax/vax/ka53.c b/sys/arch/vax/vax/ka53.c index a5f7d11c045..7e0fca1eafa 100644 --- a/sys/arch/vax/vax/ka53.c +++ b/sys/arch/vax/vax/ka53.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ka53.c,v 1.8 2011/07/06 20:42:05 miod Exp $ */ +/* $OpenBSD: ka53.c,v 1.9 2011/09/15 00:48:24 miod Exp $ */ /* $NetBSD: ka53.c,v 1.2 2000/06/04 02:19:27 matt Exp $ */ /* * Copyright (c) 2002 Hugh Graham. @@ -66,7 +66,7 @@ struct cpu_dep ka53_calls = { generic_halt, generic_reboot, NULL, - hardclock + icr_hardclock }; void diff --git a/sys/arch/vax/vax/ka60.c b/sys/arch/vax/vax/ka60.c index b59621a0991..4896f44042c 100644 --- a/sys/arch/vax/vax/ka60.c +++ b/sys/arch/vax/vax/ka60.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ka60.c,v 1.2 2011/07/06 20:42:05 miod Exp $ */ +/* $OpenBSD: ka60.c,v 1.3 2011/09/15 00:48:24 miod Exp $ */ /* * Copyright (c) 2008 Miodrag Vallat. @@ -76,7 +76,7 @@ #include <vax/mbus/mbusvar.h> #include <vax/mbus/fwioreg.h> -int ka60_clkread(time_t); +int ka60_clkread(struct timespec *, time_t); void ka60_clkwrite(void); void ka60_clrf(void); void ka60_conf(void); @@ -273,7 +273,7 @@ ka60_mchk(caddr_t mcef) * Clock routines. They need to access the TODR through the SSC. */ int -ka60_clkread(time_t base) +ka60_clkread(struct timespec *ts, time_t base) { unsigned klocka = cvax_ssc_ptr->ssc_todr; @@ -286,17 +286,18 @@ ka60_clkread(time_t base) cvax_ssc_ptr->ssc_todr = 1; /* spin it */ } else printf("TODR too small"); - return CLKREAD_BAD; + return EINVAL; } - time.tv_sec = yeartonum(numtoyear(base)) + (klocka - TODRBASE) / 100; - return CLKREAD_OK; + ts->tv_sec = yeartonum(numtoyear(base)) + (klocka - TODRBASE) / 100; + ts->tv_nsec = 0; + return 0; } void ka60_clkwrite() { - unsigned tid = time.tv_sec, bastid; + uint32_t tid = time_second, bastid; bastid = tid - yeartonum(numtoyear(tid)); cvax_ssc_ptr->ssc_todr = (bastid * 100) + TODRBASE; @@ -352,6 +353,6 @@ ka60_hardclock(struct clockframe *cf) int s; s = splclock(); - hardclock(cf); + icr_hardclock(cf); splx(s); } diff --git a/sys/arch/vax/vax/ka630.c b/sys/arch/vax/vax/ka630.c index 6bcdf7a02c6..d420cecd880 100644 --- a/sys/arch/vax/vax/ka630.c +++ b/sys/arch/vax/vax/ka630.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ka630.c,v 1.11 2011/07/06 20:42:05 miod Exp $ */ +/* $OpenBSD: ka630.c,v 1.12 2011/09/15 00:48:24 miod Exp $ */ /* $NetBSD: ka630.c,v 1.17 1999/09/06 19:52:52 ragge Exp $ */ /*- * Copyright (c) 1982, 1988, 1990, 1993 @@ -67,7 +67,7 @@ struct cpu_dep ka630_calls = { ka630_halt, ka630_reboot, ka630_clrf, - hardclock + icr_hardclock }; /* diff --git a/sys/arch/vax/vax/ka650.c b/sys/arch/vax/vax/ka650.c index c3f42dbc06d..0174e1e5eaf 100644 --- a/sys/arch/vax/vax/ka650.c +++ b/sys/arch/vax/vax/ka650.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ka650.c,v 1.19 2011/07/06 20:42:05 miod Exp $ */ +/* $OpenBSD: ka650.c,v 1.20 2011/09/15 00:48:24 miod Exp $ */ /* $NetBSD: ka650.c,v 1.25 2001/04/27 15:02:37 ragge Exp $ */ /* * Copyright (c) 1988 The Regents of the University of California. @@ -79,7 +79,7 @@ struct cpu_dep ka650_calls = { cvax_halt, cvax_reboot, NULL, - hardclock + icr_hardclock }; /* @@ -127,11 +127,11 @@ uvaxIII_memerr() if (ka650cbd.cbd_cacr & CACR_CPE) { printf("cache 2 tag parity error: "); - if (time.tv_sec - cache2tag < 7) { + if (time_second - cache2tag < 7) { ka650setcache(CACHEOFF); printf("caching disabled\n"); } else { - cache2tag = time.tv_sec; + cache2tag = time_second; printf("flushing cache\n"); ka650setcache(CACHEON); } @@ -187,19 +187,19 @@ uvaxIII_mchk(cmcf) if (i & CAER_DAT) { printf("data"); i = cache1data; - cache1data = time.tv_sec; + cache1data = time_second; } if (i & CAER_TAG) { printf("tag"); i = cache1tag; - cache1tag = time.tv_sec; + cache1tag = time_second; } } else if ((i & CAER_MCD) || (ka650merr_ptr->merr_errstat & MEM_CDAL)) { printf("CDAL"); i = cdalerr; - cdalerr = time.tv_sec; + cdalerr = time_second; } - if (time.tv_sec - i < 7) { + if (time_second - i < 7) { ka650setcache(CACHEOFF); printf(" parity error: caching disabled\n"); } else { diff --git a/sys/arch/vax/vax/ka660.c b/sys/arch/vax/vax/ka660.c index 1405904550d..1d494421ab6 100644 --- a/sys/arch/vax/vax/ka660.c +++ b/sys/arch/vax/vax/ka660.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ka660.c,v 1.7 2011/07/06 20:42:05 miod Exp $ */ +/* $OpenBSD: ka660.c,v 1.8 2011/09/15 00:48:24 miod Exp $ */ /* $NetBSD: ka660.c,v 1.3 2000/06/29 07:14:27 mrg Exp $ */ /* * Copyright (c) 2000 Ludd, University of Lule}, Sweden. @@ -79,7 +79,7 @@ struct cpu_dep ka660_calls = { generic_halt, generic_reboot, NULL, - hardclock + icr_hardclock }; diff --git a/sys/arch/vax/vax/ka670.c b/sys/arch/vax/vax/ka670.c index a1ead555a0d..e3ca9800663 100644 --- a/sys/arch/vax/vax/ka670.c +++ b/sys/arch/vax/vax/ka670.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ka670.c,v 1.10 2011/07/06 20:42:05 miod Exp $ */ +/* $OpenBSD: ka670.c,v 1.11 2011/09/15 00:48:24 miod Exp $ */ /* $NetBSD: ka670.c,v 1.4 2000/03/13 23:52:35 soren Exp $ */ /* * Copyright (c) 1999 Ludd, University of Lule}, Sweden. @@ -69,7 +69,7 @@ struct cpu_dep ka670_calls = { generic_halt, generic_reboot, NULL, - hardclock + icr_hardclock }; #define KA670_MC_RESTART 0x00008000 /* Restart possible*/ diff --git a/sys/arch/vax/vax/ka680.c b/sys/arch/vax/vax/ka680.c index aaaf68f6ce8..4291e3ff18d 100644 --- a/sys/arch/vax/vax/ka680.c +++ b/sys/arch/vax/vax/ka680.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ka680.c,v 1.13 2011/07/06 20:42:05 miod Exp $ */ +/* $OpenBSD: ka680.c,v 1.14 2011/09/15 00:48:24 miod Exp $ */ /* $NetBSD: ka680.c,v 1.3 2001/01/28 21:01:53 ragge Exp $ */ /* * Copyright (c) 2002 Hugh Graham. @@ -97,7 +97,7 @@ struct cpu_dep ka680_calls = { generic_halt, generic_reboot, NULL, - hardclock + icr_hardclock }; void diff --git a/sys/arch/vax/vax/vxt.c b/sys/arch/vax/vax/vxt.c index 2ddc5a05375..2c8faf9230b 100644 --- a/sys/arch/vax/vax/vxt.c +++ b/sys/arch/vax/vax/vxt.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vxt.c,v 1.7 2011/08/31 21:33:26 miod Exp $ */ +/* $OpenBSD: vxt.c,v 1.8 2011/09/15 00:48:24 miod Exp $ */ /* * Copyright (c) 1998 Ludd, University of Lule}, Sweden. * All rights reserved. @@ -52,7 +52,7 @@ static int vxt_mchk(caddr_t); static void vxt_halt(void); static void vxt_reboot(int); static void vxt_cache_enable(void); -static int missing_clkread(time_t); +static int missing_clkread(struct timespec *, time_t); static void missing_clkwrite(void); /* @@ -137,11 +137,10 @@ vxt_reboot(arg) } int -missing_clkread(base) - time_t base; +missing_clkread(struct timespec *ts, time_t base) { printf("WARNING: no TOY clock"); - return CLKREAD_BAD; + return EINVAL; } void |