[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [patch 3/5] kexec: Add explicit kexec_load_unload_compat()



Add an explicit kexec_load_unload_compat() using the same method
that was used to create kexec_range_compat()

Signed-off-by: Simon Horman <horms@xxxxxxxxxxxx>

--- 

 xen/common/compat/kexec.c |    4 --
 xen/common/kexec.c        |   63 ++++++++++++++++++++++++++++++---------------
 2 files changed, 42 insertions(+), 25 deletions(-)

Index: xen-unstable.hg/xen/common/kexec.c
===================================================================
--- xen-unstable.hg.orig/xen/common/kexec.c     2008-02-29 15:13:43.000000000 
+0900
+++ xen-unstable.hg/xen/common/kexec.c  2008-02-29 15:19:16.000000000 +0900
@@ -272,11 +272,6 @@ static int kexec_get_range_compat(XEN_GU
 }
 #endif /* CONFIG_COMPAT */
 
-#endif /* COMPAT */
-
-
-#ifndef COMPAT
-
 static int kexec_load_get_bits(int type, int *base, int *bit)
 {
     switch ( type )
@@ -295,19 +290,13 @@ static int kexec_load_get_bits(int type,
     return 0;
 }
 
-#endif
-
-static int kexec_load_unload(unsigned long op, XEN_GUEST_HANDLE(void) uarg)
+static int kexec_load_unload_internal(unsigned long op, xen_kexec_load_t *load)
 {
-    xen_kexec_load_t load;
     xen_kexec_image_t *image;
     int base, bit, pos;
     int ret = 0;
 
-    if ( unlikely(copy_from_guest(&load, uarg, 1)) )
-        return -EFAULT;
-
-    if ( kexec_load_get_bits(load.type, &base, &bit) )
+    if ( kexec_load_get_bits(load->type, &base, &bit) )
         return -EINVAL;
 
     pos = (test_bit(bit, &kexec_flags) != 0);
@@ -319,13 +308,9 @@ static int kexec_load_unload(unsigned lo
 
         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
+        memcpy(image, &load->image, sizeof(*image));
 
-        if ( !(ret = machine_kexec_load(load.type, base + !pos, image)) )
+        if ( !(ret = machine_kexec_load(load->type, base + !pos, image)) )
         {
             /* Set image present bit */
             set_bit((base + !pos), &kexec_flags);
@@ -341,14 +326,46 @@ static int kexec_load_unload(unsigned lo
         if ( test_and_clear_bit((base + pos), &kexec_flags) )
         {
             image = &kexec_image[base + pos];
-            machine_kexec_unload(load.type, base + pos, image);
+            machine_kexec_unload(load->type, base + pos, image);
         }
     }
 
     return ret;
 }
 
-#ifndef COMPAT
+static int kexec_load_unload(unsigned long op, XEN_GUEST_HANDLE(void) uarg)
+{
+    xen_kexec_load_t load;
+
+    if ( unlikely(copy_from_guest(&load, uarg, 1)) )
+        return -EFAULT;
+
+    return kexec_load_unload_internal(op, &load);
+}
+
+#ifdef CONFIG_COMPAT
+static int kexec_load_unload_compat(unsigned long op,
+                                    XEN_GUEST_HANDLE(void) uarg)
+{
+    compat_kexec_load_t compat_load;
+    xen_kexec_load_t load;
+
+    if ( unlikely(copy_from_guest(&compat_load, uarg, 1)) )
+        return -EFAULT;
+
+    /* This is a bit dodgy, load.image is inside load,
+     * but XLAT_kexec_load (which is automatically generated)
+     * doesn't translate load.image (correctly)
+     * Just copy load->type, the only other member, manually instead.
+     *
+     * XLAT_kexec_load(&load, &compat_load);
+     */
+    load.type = compat_load.type;
+    XLAT_kexec_image(&load.image, &compat_load.image);
+
+    return kexec_load_unload_internal(op, &load);
+}
+#endif
 
 static int kexec_exec(XEN_GUEST_HANDLE(void) uarg)
 {
@@ -411,7 +428,11 @@ ret_t do_kexec_op(unsigned long op, XEN_
         spin_lock_irqsave(&kexec_lock, flags);
         if (!test_bit(KEXEC_FLAG_IN_PROGRESS, &kexec_flags))
         {
+#ifndef COMPAT
             ret = kexec_load_unload(op, uarg);
+#else
+            ret = kexec_load_unload_compat(op, uarg);
+#endif
         }
         spin_unlock_irqrestore(&kexec_lock, flags);
         break;
Index: xen-unstable.hg/xen/common/compat/kexec.c
===================================================================
--- xen-unstable.hg.orig/xen/common/compat/kexec.c      2008-02-29 
15:08:01.000000000 +0900
+++ xen-unstable.hg/xen/common/compat/kexec.c   2008-02-29 15:19:16.000000000 
+0900
@@ -9,10 +9,6 @@
 
 #define do_kexec_op compat_kexec_op
 
-#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"

-- 

-- 
Horms


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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.