Enable compatibility mode operation for HYPERVISOR_platformop.
authorEmmanuel Ackaouy <ack@xensource.com>
Fri, 5 Jan 2007 17:34:36 +0000 (17:34 +0000)
committerEmmanuel Ackaouy <ack@xensource.com>
Fri, 5 Jan 2007 17:34:36 +0000 (17:34 +0000)
Signed-off-by: Jan Beulich <jbeulich@novell.com>
xen/arch/x86/platform_hypercall.c
xen/arch/x86/x86_64/Makefile
xen/arch/x86/x86_64/compat/entry.S
xen/arch/x86/x86_64/platform_hypercall.c [new file with mode: 0644]

index 7d2ee6f49620e5e16d906c7f224d7db7e217e0d5..766a357e659a9331690e3770e1dd8ac504ea956a 100644 (file)
 #include <asm/mtrr.h>
 #include "cpu/mtrr/mtrr.h"
 
-long do_platform_op(XEN_GUEST_HANDLE(xen_platform_op_t) u_xenpf_op)
+#ifndef COMPAT
+typedef long ret_t;
+DEFINE_SPINLOCK(xenpf_lock);
+#else
+extern spinlock_t xenpf_lock;
+#endif
+
+ret_t do_platform_op(XEN_GUEST_HANDLE(xen_platform_op_t) u_xenpf_op)
 {
-    long ret = 0;
+    ret_t ret = 0;
     struct xen_platform_op curop, *op = &curop;
-    static DEFINE_SPINLOCK(xenpf_lock);
 
     if ( !IS_PRIV(current->domain) )
         return -EPERM;
@@ -105,8 +111,15 @@ long do_platform_op(XEN_GUEST_HANDLE(xen_platform_op_t) u_xenpf_op)
     case XENPF_microcode_update:
     {
         extern int microcode_update(XEN_GUEST_HANDLE(void), unsigned long len);
+#ifndef COMPAT
         ret = microcode_update(op->u.microcode.data,
                                op->u.microcode.length);
+#else
+        XEN_GUEST_HANDLE(void) data;
+
+        guest_from_compat_handle(data, op->u.microcode.data);
+        ret = microcode_update(data, op->u.microcode.length);
+#endif
     }
     break;
 
index 5709de36944728d7ba7263a82cca78bb0bfde337..509f442a3c7a24baf2ff3ae3728735f40ea61089 100644 (file)
@@ -6,6 +6,7 @@ obj-y += traps.o
 obj-$(CONFIG_COMPAT) += compat.o
 obj-$(CONFIG_COMPAT) += domain.o
 obj-$(CONFIG_COMPAT) += physdev.o
+obj-$(CONFIG_COMPAT) += platform_hypercall.o
 
 ifeq ($(CONFIG_COMPAT),y)
 # extra dependencies
@@ -13,5 +14,6 @@ compat.o:     ../compat.c
 entry.o:       compat/entry.S
 mm.o:          compat/mm.c
 physdev.o:     ../physdev.c
+platform_hypercall.o: ../platform_hypercall.c
 traps.o:       compat/traps.c
 endif
index d9d70a248c7547c32356d0c7de30ed48f72cc7ab..792854eb832d4e00a8aa3d50a280648c148f4948 100644 (file)
@@ -278,7 +278,6 @@ CFIX14:
 
 .section .rodata, "a", @progbits
 
-#define compat_platform_op domain_crash_synchronous
 #define compat_acm_op domain_crash_synchronous
 #define compat_xenoprof_op domain_crash_synchronous
 #define compat_sysctl domain_crash_synchronous
diff --git a/xen/arch/x86/x86_64/platform_hypercall.c b/xen/arch/x86/x86_64/platform_hypercall.c
new file mode 100644 (file)
index 0000000..2ce7c12
--- /dev/null
@@ -0,0 +1,29 @@
+/******************************************************************************
+ * platform_hypercall.c
+ *
+ */
+
+#include <xen/config.h>
+#include <xen/types.h>
+#include <compat/platform.h>
+
+DEFINE_XEN_GUEST_HANDLE(compat_platform_op_t);
+#define xen_platform_op     compat_platform_op
+#define xen_platform_op_t   compat_platform_op_t
+#define do_platform_op(x)   compat_platform_op(_##x)
+
+#define COMPAT
+#define _XEN_GUEST_HANDLE(t) XEN_GUEST_HANDLE(t)
+typedef int ret_t;
+
+#include "../platform_hypercall.c"
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */