xend: Obey localtime config option for HVM guests as well as PV guests.
authorKeir Fraser <keir.fraser@citrix.com>
Tue, 29 Jan 2008 15:15:51 +0000 (15:15 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Tue, 29 Jan 2008 15:15:51 +0000 (15:15 +0000)
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
tools/python/xen/lowlevel/xc/xc.c
tools/python/xen/xend/XendDomainInfo.py
tools/python/xen/xend/image.py

index f766d28e7702c90a273360f7dc7280759d01a025..425ed7b0fee6021636e1d55dc80827710e57583d 100644 (file)
@@ -1155,23 +1155,13 @@ static PyObject *pyxc_domain_iomem_permission(PyObject *self,
 static PyObject *pyxc_domain_set_time_offset(XcObject *self, PyObject *args)
 {
     uint32_t dom;
-    int32_t time_offset_seconds;
-    time_t calendar_time;
-    struct tm local_time;
-    struct tm utc_time;
+    int32_t offset;
 
-    if (!PyArg_ParseTuple(args, "i", &dom))
+    if (!PyArg_ParseTuple(args, "ii", &dom, &offset))
         return NULL;
 
-    calendar_time = time(NULL);
-    localtime_r(&calendar_time, &local_time);
-    gmtime_r(&calendar_time, &utc_time);
-    /* set up to get calendar time based on utc_time, with local dst setting */
-    utc_time.tm_isdst = local_time.tm_isdst;
-    time_offset_seconds = (int32_t)difftime(calendar_time, mktime(&utc_time));
-
-    if (xc_domain_set_time_offset(self->xc_handle, dom, time_offset_seconds) != 0)
-        return NULL;
+    if (xc_domain_set_time_offset(self->xc_handle, dom, offset) != 0)
+        return pyxc_error_to_exception();
 
     Py_INCREF(zero);
     return zero;
@@ -1620,6 +1610,7 @@ static PyMethodDef pyxc_methods[] = {
       METH_VARARGS, "\n"
       "Set a domain's time offset to Dom0's localtime\n"
       " dom        [int]: Domain whose time offset is being set.\n"
+      " offset     [int]: Time offset from UTC in seconds.\n"
       "Returns: [int] 0 on success; -1 on error.\n" },
 
     { "domain_send_trigger",
index 0f866f02a62f6e9542364fe054056e5b9df32d25..ca3083bae2f65d95507a72e5b7864935dcef2c66 100644 (file)
@@ -1733,10 +1733,14 @@ class XendDomainInfo:
         self._configureBootloader()
 
         try:
-            self.image = image.create(self, self.info)
-
             if self.info['platform'].get('localtime', 0):
-                xc.domain_set_time_offset(self.domid)
+                t = time.time()
+                loc = time.localtime(t)
+                utc = time.gmtime(t)
+                timeoffset = int(time.mktime(loc) - time.mktime(utc))
+                self.info['platform']['rtc_timeoffset'] = timeoffset
+
+            self.image = image.create(self, self.info)
 
             xc.domain_setcpuweight(self.domid, \
                                    self.info['vcpus_params']['weight'])
index 793c2b9aa86a01abbc82270749a4dfe0e68ae13b..80252345c1147ff6280420c3f4a3986177240629 100644 (file)
@@ -346,6 +346,12 @@ class LinuxImageHandler(ImageHandler):
     flags = 0
     vhpt = 0
 
+    def configure(self, vmConfig):
+        ImageHandler.configure(self, vmConfig)
+        rtc_timeoffset = vmConfig['platform'].get('rtc_timeoffset')
+        if rtc_timeoffset is not None:
+            xc.domain_set_time_offset(self.vm.getDomid(), rtc_timeoffset)
+
     def buildDomain(self):
         store_evtchn = self.vm.getStorePort()
         console_evtchn = self.vm.getConsolePort()