aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Deegan <Tim.Deegan@citrix.com>2011-05-12 09:23:21 +0100
committerTim Deegan <Tim.Deegan@citrix.com>2011-05-12 09:23:21 +0100
commitc3ff6874136a037b9b76d7b2502294e3a2b6fea9 (patch)
treedcf3e558e650024396a0cb1bba49c6d5d9cb5f93
parent8e9046f49be32c02ce7687def9978375f1824db1 (diff)
downloadxen-c3ff6874136a037b9b76d7b2502294e3a2b6fea9.tar.gz
xen-c3ff6874136a037b9b76d7b2502294e3a2b6fea9.tar.bz2
xen-c3ff6874136a037b9b76d7b2502294e3a2b6fea9.zip
x86: use compat hypercall handlers for calls from 32-bit HVM guests
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
-rw-r--r--xen/arch/x86/hvm/hvm.c9
-rw-r--r--xen/include/xen/hypercall.h14
2 files changed, 20 insertions, 3 deletions
diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index 4be6bcd814..e089365964 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -2304,14 +2304,17 @@ 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,
- 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(tmem_op)
};
diff --git a/xen/include/xen/hypercall.h b/xen/include/xen/hypercall.h
index 3e1ada4bc9..40900a2001 100644
--- a/xen/include/xen/hypercall.h
+++ b/xen/include/xen/hypercall.h
@@ -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__ */