From 735e7778ea8c9feb4e8e91cc0af877a06e188340 Mon Sep 17 00:00:00 2001 From: cheloha Date: Mon, 22 Jun 2020 18:25:58 +0000 Subject: 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@ --- sys/kern/kern_time.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'sys/kern/kern_time.c') 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); -- cgit v1.2.3