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

index 0684d951bce3d51da556c6cab52205daa26a7339..bc47636d2547f356fc0fb0106ecb663e3c4b0b2b 100644 (file)
@@ -316,6 +316,7 @@ ENTRY(compat_hypercall_table)
         .quad compat_ni_hypercall
         .quad compat_sysctl             /* 35 */
         .quad compat_domctl
+        .quad compat_kexec_op
         .rept NR_hypercalls-((.-compat_hypercall_table)/8)
         .quad compat_ni_hypercall
         .endr
@@ -358,6 +359,7 @@ ENTRY(compat_hypercall_args_table)
         .byte 0 /* compat_ni_hypercall      */
         .byte 1 /* compat_sysctl            */  /* 35 */
         .byte 1 /* compat_domctl            */
+        .byte 2 /* compat_kexec_op          */
         .rept NR_hypercalls-(.-compat_hypercall_args_table)
         .byte 0 /* compat_ni_hypercall      */
         .endr
index 1997f461c20c1c8c848691446e4b50608a7b457f..0c9b9b2333189535fd629685c9143cc2d0f0a01a 100644 (file)
@@ -44,6 +44,7 @@ ifeq ($(CONFIG_COMPAT),y)
 # extra dependencies
 acm_ops.o: compat/acm_ops.c
 grant_table.o: compat/grant_table.c
+kexec.o: compat/kexec.c
 schedule.o: compat/schedule.c
 xenoprof.o: compat/xenoprof.c
 endif
diff --git a/xen/common/compat/kexec.c b/xen/common/compat/kexec.c
new file mode 100644 (file)
index 0000000..b167d8a
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * compat/kexec.c
+ */
+
+#include <compat/kexec.h>
+
+#define COMPAT
+#define ret_t int
+
+#define do_kexec_op compat_kexec_op
+
+#undef kexec_get
+#define kexec_get(x)      compat_kexec_get_##x
+#define xen_kexec_range   compat_kexec_range
+#define xen_kexec_range_t compat_kexec_range_t
+
+#define kexec_load_unload compat_kexec_load_unload
+#define xen_kexec_load    compat_kexec_load
+#define xen_kexec_load_t  compat_kexec_load_t
+
+CHECK_kexec_exec;
+
+#include "../kexec.c"
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
index 8f511608f5d962c602d79d63785b54d94fadd5b7..1b470a5e50ab08fcbb923e914c69eb8f88806039 100644 (file)
 #include <xen/version.h>
 #include <public/elfnote.h>
 
+#ifndef COMPAT
+
+typedef long ret_t;
+
 DEFINE_PER_CPU (crash_note_t, crash_notes);
 cpumask_t crash_saved_cpus;
 
@@ -143,21 +147,25 @@ static __init int register_crashdump_trigger(void)
 }
 __initcall(register_crashdump_trigger);
 
-static int kexec_get_reserve(xen_kexec_range_t *range)
+#define kexec_get(x)      kexec_get_##x
+
+#endif
+
+static int kexec_get(reserve)(xen_kexec_range_t *range)
 {
     range->start = kexec_crash_area.start;
     range->size = kexec_crash_area.size;
     return 0;
 }
 
-static int kexec_get_xen(xen_kexec_range_t *range)
+static int kexec_get(xen)(xen_kexec_range_t *range)
 {
     range->start = virt_to_maddr(_start);
     range->size = (unsigned long)_end - (unsigned long)_start;
     return 0;
 }
 
-static int kexec_get_cpu(xen_kexec_range_t *range)
+static int kexec_get(cpu)(xen_kexec_range_t *range)
 {
     if ( range->nr < 0 || range->nr >= num_present_cpus() )
         return -EINVAL;
@@ -167,7 +175,7 @@ static int kexec_get_cpu(xen_kexec_range_t *range)
     return 0;
 }
 
-static int kexec_get_range(XEN_GUEST_HANDLE(void) uarg)
+static int kexec_get(range)(XEN_GUEST_HANDLE(void) uarg)
 {
     xen_kexec_range_t range;
     int ret = -EINVAL;
@@ -178,13 +186,13 @@ static int kexec_get_range(XEN_GUEST_HANDLE(void) uarg)
     switch ( range.range )
     {
     case KEXEC_RANGE_MA_CRASH:
-        ret = kexec_get_reserve(&range);
+        ret = kexec_get(reserve)(&range);
         break;
     case KEXEC_RANGE_MA_XEN:
-        ret = kexec_get_xen(&range);
+        ret = kexec_get(xen)(&range);
         break;
     case KEXEC_RANGE_MA_CPU:
-        ret = kexec_get_cpu(&range);
+        ret = kexec_get(cpu)(&range);
         break;
     }
 
@@ -194,6 +202,8 @@ static int kexec_get_range(XEN_GUEST_HANDLE(void) uarg)
     return ret;
 }
 
+#ifndef COMPAT
+
 static int kexec_load_get_bits(int type, int *base, int *bit)
 {
     switch ( type )
@@ -212,6 +222,8 @@ static int kexec_load_get_bits(int type, int *base, int *bit)
     return 0;
 }
 
+#endif
+
 static int kexec_load_unload(unsigned long op, XEN_GUEST_HANDLE(void) uarg)
 {
     xen_kexec_load_t load;
@@ -234,7 +246,11 @@ static int kexec_load_unload(unsigned long op, XEN_GUEST_HANDLE(void) uarg)
 
         BUG_ON(test_bit((base + !pos), &kexec_flags)); /* must be free */
 
+#ifndef COMPAT
         memcpy(image, &load.image, sizeof(*image));
+#else
+        XLAT_kexec_image(image, &load.image);
+#endif
 
         if ( !(ret = machine_kexec_load(load.type, base + !pos, image)) )
         {
@@ -259,6 +275,8 @@ static int kexec_load_unload(unsigned long op, XEN_GUEST_HANDLE(void) uarg)
     return ret;
 }
 
+#ifndef COMPAT
+
 static int kexec_exec(XEN_GUEST_HANDLE(void) uarg)
 {
     xen_kexec_exec_t exec;
@@ -292,7 +310,9 @@ static int kexec_exec(XEN_GUEST_HANDLE(void) uarg)
     return -EINVAL; /* never reached */
 }
 
-long do_kexec_op(unsigned long op, XEN_GUEST_HANDLE(void) uarg)
+#endif
+
+ret_t do_kexec_op(unsigned long op, XEN_GUEST_HANDLE(void) uarg)
 {
     unsigned long flags;
     int ret = -EINVAL;
@@ -303,7 +323,7 @@ long do_kexec_op(unsigned long op, XEN_GUEST_HANDLE(void) uarg)
     switch ( op )
     {
     case KEXEC_CMD_kexec_get_range:
-        ret = kexec_get_range(uarg);
+        ret = kexec_get(range)(uarg);
         break;
     case KEXEC_CMD_kexec_load:
     case KEXEC_CMD_kexec_unload:
@@ -322,6 +342,10 @@ long do_kexec_op(unsigned long op, XEN_GUEST_HANDLE(void) uarg)
     return ret;
 }
 
+#if defined(CONFIG_COMPAT) && !defined(COMPAT)
+#include "compat/kexec.c"
+#endif
+
 /*
  * Local variables:
  * mode: C
index 89af2d3fb1c2060b5ccf7ba2f5e538230927c4e7..950f60b2f4ed2cc7b3a0998ce2bc82dbbf233aca 100644 (file)
@@ -32,6 +32,8 @@
 !      gnttab_transfer                 grant_table.h
 ?      gnttab_unmap_grant_ref          grant_table.h
 ?      grant_entry                     grant_table.h
+?      kexec_exec                      kexec.h
+!      kexec_image                     kexec.h
 !      add_to_physmap                  memory.h
 !      foreign_memory_map              memory.h
 !      memory_exchange                 memory.h