diff -urN 2.2.20pre8/arch/alpha/kernel/time.c z/arch/alpha/kernel/time.c --- 2.2.20pre8/arch/alpha/kernel/time.c Mon Dec 11 16:57:43 2000 +++ z/arch/alpha/kernel/time.c Tue Aug 7 16:19:57 2001 @@ -236,7 +236,7 @@ time_init(void) { void (*irq_handler)(int, void *, struct pt_regs *); - unsigned int year, mon, day, hour, min, sec, cc1, cc2; + unsigned int year, mon, day, hour, min, sec, cc1, cc2, epoch; unsigned long cycle_freq, ppm_error; long diff; @@ -311,16 +311,23 @@ BCD_TO_BIN(mon); BCD_TO_BIN(year); } -#ifdef ALPHA_PRE_V1_2_SRM_CONSOLE - /* - * The meaning of life, the universe, and everything. Plus - * this makes the year come out right on SRM consoles earlier - * than v1.2. - */ - year -= 42; -#endif - if ((year += 1900) < 1970) + + /* PC-like is standard; used for year < 20 || year >= 70 */ + epoch = 1900; + if (year < 20) + epoch = 2000; + else if (year >= 20 && year < 48) + /* NT epoch */ + epoch = 1980; + else if (year >= 48 && year < 70) + /* Digital UNIX epoch */ + epoch = 1952; + + printk(KERN_INFO "Using epoch = %d\n", epoch); + + if ((year += epoch) < 1970) year += 100; + xtime.tv_sec = mktime(year, mon, day, hour, min, sec); xtime.tv_usec = 0; diff -urN 2.2.20pre8/drivers/char/rtc.c z/drivers/char/rtc.c --- 2.2.20pre8/drivers/char/rtc.c Mon Dec 11 16:57:50 2000 +++ z/drivers/char/rtc.c Tue Aug 7 16:19:55 2001 @@ -554,12 +554,24 @@ if (!(ctrl & RTC_DM_BINARY) || RTC_ALWAYS_BCD) BCD_TO_BIN(year); /* This should never happen... */ - if (year > 10 && year < 44) { + if (year < 20) { + epoch = 2000; + guess = "SRM (post-2000)"; + } else if (year >= 20 && year < 48) { epoch = 1980; guess = "ARC console"; - } else if (year < 96) { + } else if (year >= 48 && year < 70) { epoch = 1952; guess = "Digital UNIX"; +#if defined(__mips__) + } else if (year >= 70 && year < 100) { + epoch = 1928; + guess = "Digital DECstation"; +#else + } else if (year >= 70) { + epoch = 1900; + guess = "Standard PC (1900)"; +#endif } if (guess) printk("rtc: %s epoch (%lu) detected\n", guess, epoch);