diff options
author | Emmanuel Ackaouy <ack@xensource.com> | 2007-01-05 17:34:41 +0000 |
---|---|---|
committer | Emmanuel Ackaouy <ack@xensource.com> | 2007-01-05 17:34:41 +0000 |
commit | 8c7577f2c3bacb8b49205c6d4afb11d61be852db (patch) | |
tree | f8b1892cd37473b7286aaa0d436f9cb4972a2a87 /xen/common/kexec.c | |
parent | 70a6f21e0ffd2f369a175ce966d40dd517ba6354 (diff) | |
download | xen-8c7577f2c3bacb8b49205c6d4afb11d61be852db.tar.gz xen-8c7577f2c3bacb8b49205c6d4afb11d61be852db.tar.bz2 xen-8c7577f2c3bacb8b49205c6d4afb11d61be852db.zip |
Enable compatibility mode operation for kexec.
Signed-off-by: Jan Beulich <jbeulich@novell.com>
Diffstat (limited to 'xen/common/kexec.c')
-rw-r--r-- | xen/common/kexec.c | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/xen/common/kexec.c b/xen/common/kexec.c index 8f511608f5..1b470a5e50 100644 --- a/xen/common/kexec.c +++ b/xen/common/kexec.c @@ -22,6 +22,10 @@ #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 |