]> xenbits.xensource.com Git - people/vhanquez/xen.git/commitdiff
x86: use compat hypercall handlers for calls from 32-bit HVM guests
authorTim Deegan <Tim.Deegan@citrix.com>
Thu, 12 May 2011 08:19:29 +0000 (09:19 +0100)
committerTim Deegan <Tim.Deegan@citrix.com>
Thu, 12 May 2011 08:19:29 +0000 (09:19 +0100)
On 64-bit Xen, hypercalls from 32-bit HVM guests are handled as
a special case, but not all the hypercalls are corrently redirected
to their compat-mode wrappers.  Use compat_* for xen_version,
sched_op and set_timer_op for consistency.

Signed-off-by: Tim Deegan <Tim.Deegan@citrix.com>
xen-unstable changeset:   23333:fabdd682420c
xen-unstable date:        Thu May 12 09:13:18 2011 +0100

xen/arch/x86/hvm/hvm.c
xen/include/xen/hypercall.h

index 11f9392d608963360c93eeea3f711a5cbcd20e51..82aecbcc6cbaec071700739c21df0b8d4c9cdfc5 100644 (file)
@@ -2679,15 +2679,18 @@ static hvm_hypercall_t *hvm_hypercall64_table[NR_hypercalls] = {
     HYPERCALL(tmem_op)
 };
 
+#define COMPAT_CALL(x)                                        \
+    [ __HYPERVISOR_ ## x ] = (hvm_hypercall_t *) compat_ ## x
+
 static hvm_hypercall_t *hvm_hypercall32_table[NR_hypercalls] = {
     [ __HYPERVISOR_memory_op ] = (hvm_hypercall_t *)hvm_memory_op_compat32,
     [ __HYPERVISOR_grant_table_op ] = (hvm_hypercall_t *)hvm_grant_table_op_compat32,
     [ __HYPERVISOR_vcpu_op ] = (hvm_hypercall_t *)hvm_vcpu_op_compat32,
     [ __HYPERVISOR_physdev_op ] = (hvm_hypercall_t *)hvm_physdev_op_compat32,
-    HYPERCALL(xen_version),
+    COMPAT_CALL(xen_version),
     HYPERCALL(event_channel_op),
-    HYPERCALL(sched_op),
-    HYPERCALL(set_timer_op),
+    COMPAT_CALL(sched_op),
+    COMPAT_CALL(set_timer_op),
     HYPERCALL(hvm_op),
     HYPERCALL(sysctl),
     HYPERCALL(tmem_op)
index 3e1ada4bc91e113c66102f16b58287b4c08c67ad..40900a2001f471c24ebfe0abe6c96e1e82d84935 100644 (file)
@@ -146,6 +146,20 @@ compat_vcpu_op(
 extern int
 compat_xenoprof_op(int op, XEN_GUEST_HANDLE(void) arg);
 
+extern int
+compat_xen_version(
+    int cmd,
+    XEN_GUEST_HANDLE(void) arg);
+
+extern int
+compat_sched_op(
+    int cmd,
+    XEN_GUEST_HANDLE(void) arg);
+
+extern int
+compat_set_timer_op(
+    s_time_t timeout);
+
 #endif
 
 #endif /* __XEN_HYPERCALL_H__ */