Home
Reading
Searching
Subscribe
Sponsors
Statistics
Posting
Contact
Spam
Lists
Links
About
Hosting
Filtering
Features Download
Marketing
Archives
FAQ
Blog
 
Gmane
From: Theo de Raadt <deraadt <at> cvs.openbsd.org>
Subject: Making time_t deal with the coming epoch
Newsgroups: gmane.os.openbsd.tech
Date: Sunday 1st April 2012 07:05:05 UTC (over 5 years ago)
The epoch isn't far that away and we need to prepare OpenBSD for it.

I had a little free time, so I wrote a diff to simulate the behaviour
so that we can test how parts of OpenBSD cope with it.

Index: sys/sysctl.h
===================================================================
RCS file: /cvs/src/sys/sys/sysctl.h,v
retrieving revision 1.121
diff -u -p -u -r1.121 sysctl.h
--- sys/sysctl.h	23 Mar 2012 15:51:26 -0000	1.121
+++ sys/sysctl.h	1 Apr 2012 04:27:45 -0000
@@ -184,7 +184,8 @@ struct ctlname {
 #define	KERN_NETLIVELOCKS	76	/* int: number of network livelocks */
 #define	KERN_POOL_DEBUG		77	/* int: enable pool_debug */
 #define	KERN_PROC_CWD		78      /* node: proc cwd */
-#define	KERN_MAXID		79	/* number of valid kern ids */
+#define	KERN_EMULATEMAYANPROPHESY 79	/* int: prevent the first epoch */
+#define	KERN_MAXID		80	/* number of valid kern ids */
 
 #define	CTL_KERN_NAMES { \
 	{ 0, 0 }, \
@@ -266,6 +267,7 @@ struct ctlname {
 	{ "netlivelocks", CTLTYPE_INT }, \
 	{ "pool_debug", CTLTYPE_INT }, \
 	{ "proc_cwd", CTLTYPE_NODE }, \
+	{ "emulatemayanprophesy", CTLTYPE_INT }, \
 }
 
 /*
Index: sys/time.h
===================================================================
RCS file: /cvs/src/sys/sys/time.h,v
retrieving revision 1.26
diff -u -p -u -r1.26 time.h
--- sys/time.h	27 Nov 2009 19:45:54 -0000	1.26
+++ sys/time.h	1 Apr 2012 06:32:21 -0000
@@ -270,6 +270,17 @@ extern volatile time_t time_second;	/* S
 extern volatile time_t time_uptime;	/* Seconds since reboot. */
 
 /*
+ * Wikipedia: "The current (13th) b'ak'tun will end, or be completed, on
+ * 13.0.0.0.0 (December 21, 2012 using the GMT correlation".  GMT or
+ * Mexico/General? What's 6 hours between Mayans friends.. let's follow
+ * 'Mexican time' rules.  You might get 6 more hours of reading your
+ * mail, but don't count on it.
+ */
+#define END_13BAKTUN	1356069600
+extern int	emulatemayanprophecy;	/* End time before the Mayans do */
+
+
+/*
  * Functions for looking at our clock: [get]{bin,nano,micro}[up]time()
  *
  * Functions without the "get" prefix returns the best timestamp
Index: kern/kern_clock.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_clock.c,v
retrieving revision 1.73
diff -u -p -u -r1.73 kern_clock.c
--- kern/kern_clock.c	23 Mar 2012 15:51:26 -0000	1.73
+++ kern/kern_clock.c	1 Apr 2012 06:21:53 -0000
@@ -108,6 +108,8 @@ int	psratio;			/* ratio: prof / stat */
 
 long cp_time[CPUSTATES];
 
+int	emulatemayanprophecy;	/* sysctl: stop time at end of 13th b'ak'tun */
+
 #ifndef __HAVE_TIMECOUNTER
 int	tickfix, tickfixinterval;	/* used if tick not really integral */
 static int tickfixcnt;			/* accumulated fractional error */
@@ -292,8 +294,16 @@ hardclock(struct clockframe *frame)
 
 	BUMPTIME(&time, delta);
 	BUMPTIME(&mono_time, delta);
-	time_second = time.tv_sec;
-	time_uptime = mono_time.tv_sec;
+	if (emulatemayanprophecy) {
+		if (time.tv_sec < END_13BAKTUN) {
+			time_second = time.tv_sec;
+			time_uptime = mono_time.tv_sec;
+		}
+	} else {
+		time_second = time.tv_sec;
+		time_uptime = mono_time.tv_sec;
+	}
+
 #else
 	tc_ticktock();
 #endif
Index: kern/kern_sysctl.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_sysctl.c,v
retrieving revision 1.218
diff -u -p -u -r1.218 kern_sysctl.c
--- kern/kern_sysctl.c	28 Mar 2012 16:01:30 -0000	1.218
+++ kern/kern_sysctl.c	1 Apr 2012 04:27:45 -0000
@@ -55,6 +55,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -607,6 +608,9 @@ kern_sysctl(int *name, u_int namelen, vo
 			pool_reclaim_all();
 		return (error);
 	}
+	case KERN_EMULATEMAYANPROPHESY:
+		return (sysctl_int(oldp, oldlenp, newp, newlen,
+		    &emulatemayanprophecy));
 	default:
 		return (EOPNOTSUPP);
 	}
Index: kern/kern_tc.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_tc.c,v
retrieving revision 1.16
diff -u -p -u -r1.16 kern_tc.c
--- kern/kern_tc.c	24 Sep 2010 07:29:30 -0000	1.16
+++ kern/kern_tc.c	1 Apr 2012 06:49:06 -0000
@@ -16,6 +16,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -381,6 +382,14 @@ tc_windup(void)
 		i = 2;
 	for (; i > 0; i--)
 		ntp_update_second(&th->th_adjustment, &bt.sec);
+
+	if (emulatemayanprophecy) {
+		struct timeval tv;
+
+		bintime2timeval(&bt, &tv);
+		if (tv.tv_sec >= END_13BAKTUN)
+			return;
+	}
 
 	/* Update the UTC timestamps used by the get*() functions. */
 	/* XXX shouldn't do this here.  Should force non-`get' versions. */
 
CD: 3ms