> Hello,
> 
> I have an old Sun Ultra 10 with a dead motherboard battery.  After
> cold-starting the machine the hardware clock now always indicates the
> date as being January 1 1968.  Strange things then happen when I boot
> OpenBSD (10.10.6.10 and 10.10.6.11 are my local time servers):

[...]

> The warning to check the date is clear enough, though I was still a
> bit surprised to see both named and ntpd fail.  I don't know why named
> cares so much about the date but I'll assume there's a good reason.  I
> also don't know why or how OpenBSD transforms 01/01/1968 into November
> 26 1931, but then again, once the battery is dead I guess the hardware
> can be considered broken and all bets are off.
> 
> Note that the initial warning indicates that the clock lost 21038
> days, which is about 57.6 years.  2010.4 (~ today) + 57.6 = 2068 =
> 1968 + 100, so it looks like the computation is done modulo 100.  I
> would have expected to see a value like (2010.4 - 1931.8)*365 = 28689
> days lost.

A bug causes the initial time to be interpreted as 2068 instead of 1968.
And then 2068 causes a 32 bit time_t wraparound, which causes the kernel
to believe that you are in late 1931 instead.

The following diff should fix this issue, can you give it a try? (apply
in sys/dev/ic/)

Index: mk48txx.c
===================================================================
RCS file: /cvs/src/sys/dev/ic/mk48txx.c,v
retrieving revision 1.5
diff -u -p -r1.5 mk48txx.c
--- mk48txx.c   26 Jun 2008 05:42:15 -0000      1.5
+++ mk48txx.c   7 Jun 2010 20:56:06 -0000
@@ -156,7 +156,8 @@ mk48txx_gettime(handle, tv)
        year = FROMBCD(bus_space_read_1(bt, bh, clkoff + MK48TXX_IYEAR));
 
        year += mk->mk_year0;
-       if (year < POSIX_BASE_YEAR && mk48txx_auto_century_adjust != 0)
+       if (year < POSIX_BASE_YEAR && mk48txx_auto_century_adjust != 0 &&
+           mk->mk_year0 >= POSIX_BASE_YEAR)
                year += 100;
 
        dt.dt_year = year;

Reply via email to