diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2011-09-13 05:01:22 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2011-09-13 05:01:22 +0000 |
commit | 6fbae48bb69bb3c93ca0701289e1ad7286f014ea (patch) | |
tree | 4fbe6f3cd36174787afe6525a4e1232e96a27a5a | |
parent | 0bec1ebc98a41d4d88704037456bed0698dec0c5 (diff) |
Do not invoke hardclock() until cpu_initclocks() has been invoked; avoids
a NULL pointer dereference because the softclock interrupt handler cookie
is not initialized yet.
Found the hard way and fix tested by aoyama@
-rw-r--r-- | sys/arch/luna88k/luna88k/clock.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/sys/arch/luna88k/luna88k/clock.c b/sys/arch/luna88k/luna88k/clock.c index 1d2f248fbfe..97eb4ab3a02 100644 --- a/sys/arch/luna88k/luna88k/clock.c +++ b/sys/arch/luna88k/luna88k/clock.c @@ -1,4 +1,4 @@ -/* $OpenBSD: clock.c,v 1.6 2006/01/09 21:01:45 miod Exp $ */ +/* $OpenBSD: clock.c,v 1.7 2011/09/13 05:01:21 miod Exp $ */ /* $NetBSD: clock.c,v 1.2 2000/01/11 10:29:35 nisimura Exp $ */ /* @@ -59,7 +59,7 @@ struct device *clockdev; const struct clockfns *clockfns; struct evcount *clockevc; -int clockinitted; +int clockinitted, todrvalid; void clockattach(dev, fns, evc) @@ -104,6 +104,8 @@ cpu_initclocks() #endif tick = 1000000 / hz; /* number of microseconds between interrupts */ + + clockinitted = 1; } /* @@ -140,7 +142,7 @@ inittodr(base) badbase = 0; (*clockfns->cf_get)(clockdev, base, &dt); - clockinitted = 1; + todrvalid = 1; /* simple sanity checks */ if (dt.dt_year < 1970 || dt.dt_mon < 1 || dt.dt_mon > 12 || dt.dt_day < 1 || dt.dt_day > 31 @@ -189,7 +191,7 @@ resettodr() { struct clock_ymdhms dt; - if (!clockinitted) + if (!todrvalid) return; clock_secs_to_ymdhms(time.tv_sec, &dt); (*clockfns->cf_set)(clockdev, &dt); @@ -207,6 +209,7 @@ clockintr(void *eframe) clockevc->ec_count++; *clock_reg[cpu] = 0xffffffff; - hardclock(eframe); + if (clockinitted) + hardclock(eframe); return 1; } |