Subject: Re: A Timecounter for Xen
To: None <port-xen@NetBSD.org>
From: Jed Davis <jdev@panix.com>
List: port-xen
Date: 07/01/2007 03:47:01
--=-=-=

yamt@mwd.biglobe.ne.jp (YAMAMOTO Takashi) writes:

[...]
> is it correct for XEN3?
> see clock.c rev.1.27 and xen c/s 43564304cf94.

Indeed, you're right; I don't know how I missed that.  Thanks for
pointing it out.

The attached should take care of that (tested for Xen3, compile-tested
only for Xen2).

-- 
(let ((C call-with-current-continuation)) (apply (lambda (x y) (x y)) (map
((lambda (r) ((C C) (lambda (s) (r (lambda l (apply (s s) l))))))  (lambda
(f) (lambda (l) (if (null? l) C (lambda (k) (display (car l)) ((f (cdr l))
(C k)))))))    '((#\J #\d #\D #\v #\s) (#\e #\space #\a #\i #\newline)))))

--=-=-=
Content-Type: text/x-patch
Content-Disposition: attachment; filename=xen-wall-time-refix.diff
Content-Description: re-fix wall time reading, and factor it out of inittodr

Index: sys/arch/xen/xen/clock.c
===================================================================
RCS file: /lfs/nb/repo/src/sys/arch/xen/xen/clock.c,v
retrieving revision 1.36
diff -u -p -r1.36 clock.c
--- sys/arch/xen/xen/clock.c	25 Jun 2007 19:57:32 -0000	1.36
+++ sys/arch/xen/xen/clock.c	1 Jul 2007 06:59:28 -0000
@@ -276,11 +276,32 @@ get_system_time(void)
 	return stime;
 }
 
+static void
+xen_wall_time(struct timespec *wt)
+{
+	uint64_t nsec;
+	int s;
+
+	s = splhigh();
+	get_time_values_from_xen();
+	*wt = shadow_ts;
+	nsec = wt->tv_nsec;
+#ifdef XEN3
+	/* Under Xen3, this is the wall time less system time */
+	nsec += get_system_time();
+	splx(s);
+	wt->tv_sec += nsec / 1000000000L;
+	wt->tv_nsec = nsec % 1000000000L;
+#else
+	/* Under Xen2 , this is the current wall time. */
+	splx(s);
+#endif
+}
+
 void
 inittodr(time_t base)
 {
-	struct timespec sts;
-	int s;
+	struct timespec wt;
 
 	/*
 	 * if the file system time is more than a year older than the
@@ -291,12 +312,8 @@ inittodr(time_t base)
 		base = CONFIG_TIME;
 	}
 
-	s = splhigh();
-	get_time_values_from_xen();
-	sts = shadow_ts;
-	splx(s);
-
-	tc_setclock(&sts); /* XXX what about rtc_offset? */
+	xen_wall_time(&wt);
+	tc_setclock(&wt); /* XXX what about rtc_offset? */
 	
 	if (base != 0 && base < time_second - 5*SECYR)
 		printf("WARNING: file system time much less than clock time\n");
@@ -311,8 +328,8 @@ inittodr(time_t base)
 
 fstime:
 	timeset = 1;
-	sts.tv_sec = base;
-	tc_setclock(&sts);
+	wt.tv_sec = base;
+	tc_setclock(&wt);
 	printf("WARNING: CHECK AND RESET THE DATE!\n");
 }
 

--=-=-=--