diff options
author | cheloha <cheloha@cvs.openbsd.org> | 2020-06-22 18:25:58 +0000 |
---|---|---|
committer | cheloha <cheloha@cvs.openbsd.org> | 2020-06-22 18:25:58 +0000 |
commit | 735e7778ea8c9feb4e8e91cc0af877a06e188340 (patch) | |
tree | 9f4f89e92c9fdaa01f063f01f5b599ebbbaa938e | |
parent | 968ef9b13a5a1bd03cd9bfe3bcd6181fe56b9720 (diff) |
inittodr(9): introduce dedicated flag to enable writes from resettodr(9)
We don't want resettodr(9) to write the RTC until inittodr(9) has
actually run. Until inittodr(9) calls tc_setclock() the system UTC
clock will contain a meaningless value and there's no sense in
overwriting a good value with a value we know is nonsense.
This is not an uncommon problem if you're debugging a problem in early
boot, e.g. a panic that occurs prior to inittodr(9).
Currently we use the following logic in resettodr(9) to inhibit writes:
if (time_second == 1)
return;
... this is too magical.
A better way to accomplish the same thing is to introduce a dedicated
flag set from inittodr(9). Hence, "inittodr_done".
Suggested by visa@.
ok kettenis@
-rw-r--r-- | sys/kern/kern_time.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/sys/kern/kern_time.c b/sys/kern/kern_time.c index 6be556ecf2a..741bc2b9650 100644 --- a/sys/kern/kern_time.c +++ b/sys/kern/kern_time.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_time.c,v 1.130 2020/05/20 17:23:01 cheloha Exp $ */ +/* $OpenBSD: kern_time.c,v 1.131 2020/06/22 18:25:57 cheloha Exp $ */ /* $NetBSD: kern_time.c,v 1.20 1996/02/18 11:57:06 fvdl Exp $ */ /* @@ -778,6 +778,7 @@ ppsratecheck(struct timeval *lasttime, int *curpps, int maxpps) } todr_chip_handle_t todr_handle; +int inittodr_done; #define MINYEAR ((OpenBSD / 100) - 1) /* minimum plausible year */ @@ -794,6 +795,8 @@ inittodr(time_t base) struct timespec ts; int badbase; + inittodr_done = 1; + if (base < (MINYEAR - 1970) * SECYR) { printf("WARNING: preposterous time in file system\n"); /* read the system clock anyway */ @@ -856,7 +859,11 @@ resettodr(void) { struct timeval rtctime; - if (time_second == 1) + /* + * Skip writing the RTC if inittodr(9) never ran. We don't + * want to overwrite a reasonable value with a nonsense value. + */ + if (!inittodr_done) return; microtime(&rtctime); |