diff options
| -rw-r--r-- | arch/i386/xen/enlighten.c | 43 | ||||
| -rw-r--r-- | arch/i386/xen/smp.c | 4 |
2 files changed, 44 insertions, 3 deletions
diff --git a/arch/i386/xen/enlighten.c b/arch/i386/xen/enlighten.c index 42756771b8eb..142e74891344 100644 --- a/arch/i386/xen/enlighten.c +++ b/arch/i386/xen/enlighten.c | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | #include <xen/interface/xen.h> | 30 | #include <xen/interface/xen.h> |
| 31 | #include <xen/interface/physdev.h> | 31 | #include <xen/interface/physdev.h> |
| 32 | #include <xen/interface/vcpu.h> | 32 | #include <xen/interface/vcpu.h> |
| 33 | #include <xen/interface/sched.h> | ||
| 33 | #include <xen/features.h> | 34 | #include <xen/features.h> |
| 34 | #include <xen/page.h> | 35 | #include <xen/page.h> |
| 35 | 36 | ||
| @@ -43,6 +44,7 @@ | |||
| 43 | #include <asm/desc.h> | 44 | #include <asm/desc.h> |
| 44 | #include <asm/pgtable.h> | 45 | #include <asm/pgtable.h> |
| 45 | #include <asm/tlbflush.h> | 46 | #include <asm/tlbflush.h> |
| 47 | #include <asm/reboot.h> | ||
| 46 | 48 | ||
| 47 | #include "xen-ops.h" | 49 | #include "xen-ops.h" |
| 48 | #include "mmu.h" | 50 | #include "mmu.h" |
| @@ -900,6 +902,45 @@ static const struct smp_ops xen_smp_ops __initdata = { | |||
| 900 | }; | 902 | }; |
| 901 | #endif /* CONFIG_SMP */ | 903 | #endif /* CONFIG_SMP */ |
| 902 | 904 | ||
| 905 | static void xen_reboot(int reason) | ||
| 906 | { | ||
| 907 | #ifdef CONFIG_SMP | ||
| 908 | smp_send_stop(); | ||
| 909 | #endif | ||
| 910 | |||
| 911 | if (HYPERVISOR_sched_op(SCHEDOP_shutdown, reason)) | ||
| 912 | BUG(); | ||
| 913 | } | ||
| 914 | |||
| 915 | static void xen_restart(char *msg) | ||
| 916 | { | ||
| 917 | xen_reboot(SHUTDOWN_reboot); | ||
| 918 | } | ||
| 919 | |||
| 920 | static void xen_emergency_restart(void) | ||
| 921 | { | ||
| 922 | xen_reboot(SHUTDOWN_reboot); | ||
| 923 | } | ||
| 924 | |||
| 925 | static void xen_machine_halt(void) | ||
| 926 | { | ||
| 927 | xen_reboot(SHUTDOWN_poweroff); | ||
| 928 | } | ||
| 929 | |||
| 930 | static void xen_crash_shutdown(struct pt_regs *regs) | ||
| 931 | { | ||
| 932 | xen_reboot(SHUTDOWN_crash); | ||
| 933 | } | ||
| 934 | |||
| 935 | static const struct machine_ops __initdata xen_machine_ops = { | ||
| 936 | .restart = xen_restart, | ||
| 937 | .halt = xen_machine_halt, | ||
| 938 | .power_off = xen_machine_halt, | ||
| 939 | .shutdown = xen_machine_halt, | ||
| 940 | .crash_shutdown = xen_crash_shutdown, | ||
| 941 | .emergency_restart = xen_emergency_restart, | ||
| 942 | }; | ||
| 943 | |||
| 903 | /* First C function to be called on Xen boot */ | 944 | /* First C function to be called on Xen boot */ |
| 904 | asmlinkage void __init xen_start_kernel(void) | 945 | asmlinkage void __init xen_start_kernel(void) |
| 905 | { | 946 | { |
| @@ -912,6 +953,8 @@ asmlinkage void __init xen_start_kernel(void) | |||
| 912 | 953 | ||
| 913 | /* Install Xen paravirt ops */ | 954 | /* Install Xen paravirt ops */ |
| 914 | paravirt_ops = xen_paravirt_ops; | 955 | paravirt_ops = xen_paravirt_ops; |
| 956 | machine_ops = xen_machine_ops; | ||
| 957 | |||
| 915 | #ifdef CONFIG_SMP | 958 | #ifdef CONFIG_SMP |
| 916 | smp_ops = xen_smp_ops; | 959 | smp_ops = xen_smp_ops; |
| 917 | #endif | 960 | #endif |
diff --git a/arch/i386/xen/smp.c b/arch/i386/xen/smp.c index a91587fbf5c2..a620918f87ee 100644 --- a/arch/i386/xen/smp.c +++ b/arch/i386/xen/smp.c | |||
| @@ -311,9 +311,7 @@ static void stop_self(void *v) | |||
| 311 | 311 | ||
| 312 | void xen_smp_send_stop(void) | 312 | void xen_smp_send_stop(void) |
| 313 | { | 313 | { |
| 314 | cpumask_t mask = cpu_online_map; | 314 | smp_call_function(stop_self, NULL, 0, 0); |
| 315 | cpu_clear(smp_processor_id(), mask); | ||
| 316 | xen_smp_call_function_mask(mask, stop_self, NULL, 0); | ||
| 317 | } | 315 | } |
| 318 | 316 | ||
| 319 | void xen_smp_send_reschedule(int cpu) | 317 | void xen_smp_send_reschedule(int cpu) |
