WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] [XEN] localtime support for paravirtualiz

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] [XEN] localtime support for paravirtualized guests
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Fri, 23 Jun 2006 12:40:23 +0000
Delivery-date: Fri, 23 Jun 2006 05:42:37 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 12aaf4a2486b1cd1bce78292491258ef170970ba
# Parent  79ea1d8a5bb210f8b0b258fdc72229450b417507
[XEN] localtime support for paravirtualized guests

It is quite minimal
in its approach, satisfying the purposes of the paravirtualized
NetWare operating system as well as any others that expect the time
base to be provided in localtime.

Signed-off-by: Bruce Rogers <brogers@xxxxxxxxxx>
---
 tools/libxc/xc_domain.c                 |   11 +++++++++++
 tools/libxc/xenctrl.h                   |    4 ++++
 tools/python/xen/lowlevel/xc/xc.c       |   31 +++++++++++++++++++++++++++++++
 tools/python/xen/xend/XendDomainInfo.py |    5 +++++
 tools/python/xen/xm/create.py           |    2 ++
 xen/arch/x86/time.c                     |    2 +-
 xen/common/dom0_ops.c                   |   15 +++++++++++++++
 xen/include/public/dom0_ops.h           |    9 +++++++++
 xen/include/xen/sched.h                 |    1 +
 9 files changed, 79 insertions(+), 1 deletion(-)

diff -r 79ea1d8a5bb2 -r 12aaf4a2486b tools/libxc/xc_domain.c
--- a/tools/libxc/xc_domain.c   Wed Jun 21 16:55:25 2006 +0100
+++ b/tools/libxc/xc_domain.c   Wed Jun 21 17:09:14 2006 +0100
@@ -283,6 +283,17 @@ int xc_domain_setmaxmem(int xc_handle,
     op.cmd = DOM0_SETDOMAINMAXMEM;
     op.u.setdomainmaxmem.domain = (domid_t)domid;
     op.u.setdomainmaxmem.max_memkb = max_memkb;
+    return do_dom0_op(xc_handle, &op);
+}
+
+int xc_domain_set_time_offset(int xc_handle,
+                              uint32_t domid,
+                              int32_t time_offset_seconds)
+{
+    DECLARE_DOM0_OP;
+    op.cmd = DOM0_SETTIMEOFFSET;
+    op.u.settimeoffset.domain = (domid_t)domid;
+    op.u.settimeoffset.time_offset_seconds = time_offset_seconds;
     return do_dom0_op(xc_handle, &op);
 }
 
diff -r 79ea1d8a5bb2 -r 12aaf4a2486b tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h     Wed Jun 21 16:55:25 2006 +0100
+++ b/tools/libxc/xenctrl.h     Wed Jun 21 17:09:14 2006 +0100
@@ -410,6 +410,10 @@ int xc_domain_setmaxmem(int xc_handle,
                         uint32_t domid,
                         unsigned int max_memkb);
 
+int xc_domain_set_time_offset(int xc_handle,
+                              uint32_t domid,
+                              int32_t time_offset_seconds);
+
 int xc_domain_memory_increase_reservation(int xc_handle,
                                           uint32_t domid,
                                           unsigned long nr_extents,
diff -r 79ea1d8a5bb2 -r 12aaf4a2486b tools/python/xen/lowlevel/xc/xc.c
--- a/tools/python/xen/lowlevel/xc/xc.c Wed Jun 21 16:55:25 2006 +0100
+++ b/tools/python/xen/lowlevel/xc/xc.c Wed Jun 21 17:09:14 2006 +0100
@@ -869,6 +869,30 @@ static PyObject *pyxc_domain_iomem_permi
     return zero;
 }
 
+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;
+
+    if (!PyArg_ParseTuple(args, "i", &dom))
+        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;
+
+    Py_INCREF(zero);
+    return zero;
+}
 
 static PyObject *dom_op(XcObject *self, PyObject *args,
                         int (*fn)(int, uint32_t))
@@ -1207,6 +1231,13 @@ static PyMethodDef pyxc_methods[] = {
       METH_VARARGS, "\n"
       "Returns: [int]: The size in KiB of memory spanning the given number "
       "of pages.\n" },
+
+    { "domain_set_time_offset",
+      (PyCFunction)pyxc_domain_set_time_offset,
+      METH_VARARGS, "\n"
+      "Set a domain's time offset to Dom0's localtime\n"
+      " dom        [int]: Domain whose time offset is being set.\n"
+      "Returns: [int] 0 on success; -1 on error.\n" },
 
     { NULL, NULL, 0, NULL }
 };
diff -r 79ea1d8a5bb2 -r 12aaf4a2486b tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py   Wed Jun 21 16:55:25 2006 +0100
+++ b/tools/python/xen/xend/XendDomainInfo.py   Wed Jun 21 17:09:14 2006 +0100
@@ -135,6 +135,7 @@ ROUNDTRIPPING_CONFIG_ENTRIES = [
     ('bootloader', str),
     ('bootloader_args', str),
     ('features', str),
+    ('localtime', int),
     ]
 
 ROUNDTRIPPING_CONFIG_ENTRIES += VM_CONFIG_PARAMS
@@ -1259,6 +1260,10 @@ class XendDomainInfo:
             self.image = image.create(self,
                                       self.info['image'],
                                       self.info['device'])
+
+            localtime = self.info['localtime']
+            if localtime is not None and localtime == 1:
+                xc.domain_set_time_offset(self.domid)
 
             xc.domain_setcpuweight(self.domid, self.info['cpu_weight'])
 
diff -r 79ea1d8a5bb2 -r 12aaf4a2486b tools/python/xen/xm/create.py
--- a/tools/python/xen/xm/create.py     Wed Jun 21 16:55:25 2006 +0100
+++ b/tools/python/xen/xm/create.py     Wed Jun 21 17:09:14 2006 +0100
@@ -672,6 +672,8 @@ def make_config(vals):
         config.append(['backend', ['netif']])
     if vals.tpmif:
         config.append(['backend', ['tpmif']])
+    if vals.localtime:
+        config.append(['localtime', vals.localtime])
 
     config_image = configure_image(vals)
     if vals.bootloader:
diff -r 79ea1d8a5bb2 -r 12aaf4a2486b xen/arch/x86/time.c
--- a/xen/arch/x86/time.c       Wed Jun 21 16:55:25 2006 +0100
+++ b/xen/arch/x86/time.c       Wed Jun 21 17:09:14 2006 +0100
@@ -699,7 +699,7 @@ void update_domain_wallclock_time(struct
 {
     spin_lock(&wc_lock);
     version_update_begin(&d->shared_info->wc_version);
-    d->shared_info->wc_sec  = wc_sec;
+    d->shared_info->wc_sec  = wc_sec + d->time_offset_seconds;
     d->shared_info->wc_nsec = wc_nsec;
     version_update_end(&d->shared_info->wc_version);
     spin_unlock(&wc_lock);
diff -r 79ea1d8a5bb2 -r 12aaf4a2486b xen/common/dom0_ops.c
--- a/xen/common/dom0_ops.c     Wed Jun 21 16:55:25 2006 +0100
+++ b/xen/common/dom0_ops.c     Wed Jun 21 17:09:14 2006 +0100
@@ -693,6 +693,21 @@ long do_dom0_op(XEN_GUEST_HANDLE(dom0_op
     break;
 #endif
 
+    case DOM0_SETTIMEOFFSET:
+    {
+        struct domain *d;
+
+        ret = -ESRCH;
+        d = find_domain_by_id(op->u.settimeoffset.domain);
+        if ( d != NULL )
+        {
+            d->time_offset_seconds = op->u.settimeoffset.time_offset_seconds;
+            put_domain(d);
+            ret = 0;
+        }
+    }
+    break;
+
     default:
         ret = arch_do_dom0_op(op, u_dom0_op);
         break;
diff -r 79ea1d8a5bb2 -r 12aaf4a2486b xen/include/public/dom0_ops.h
--- a/xen/include/public/dom0_ops.h     Wed Jun 21 16:55:25 2006 +0100
+++ b/xen/include/public/dom0_ops.h     Wed Jun 21 17:09:14 2006 +0100
@@ -526,6 +526,14 @@ typedef struct dom0_domain_setup {
 #endif
 } dom0_domain_setup_t;
 DEFINE_XEN_GUEST_HANDLE(dom0_domain_setup_t);
+
+#define DOM0_SETTIMEOFFSET    50
+struct dom0_settimeoffset {
+    domid_t  domain;
+    int32_t  time_offset_seconds; /* applied to domain wallclock time */
+};
+typedef struct dom0_settimeoffset dom0_settimeoffset_t;
+DEFINE_XEN_GUEST_HANDLE(dom0_settimeoffset_t);
 
 struct dom0_op {
     uint32_t cmd;
@@ -569,6 +577,7 @@ struct dom0_op {
         struct dom0_iomem_permission  iomem_permission;
         struct dom0_hypercall_init    hypercall_init;
         struct dom0_domain_setup      domain_setup;
+        struct dom0_settimeoffset     settimeoffset;
         uint8_t                       pad[128];
     } u;
 };
diff -r 79ea1d8a5bb2 -r 12aaf4a2486b xen/include/xen/sched.h
--- a/xen/include/xen/sched.h   Wed Jun 21 16:55:25 2006 +0100
+++ b/xen/include/xen/sched.h   Wed Jun 21 17:09:14 2006 +0100
@@ -159,6 +159,7 @@ struct domain
 
     /* OProfile support. */
     struct xenoprof *xenoprof;
+    int32_t time_offset_seconds;
 };
 
 struct domain_setup_info

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] [XEN] localtime support for paravirtualized guests, Xen patchbot-unstable <=