diff options
author | Jeremy Fitzhardinge <jeremy@xensource.com> | 2007-07-17 21:37:07 -0400 |
---|---|---|
committer | Jeremy Fitzhardinge <jeremy@goop.org> | 2007-07-18 11:47:45 -0400 |
commit | fefa629abebe328cf6d07f99fe5796dbfc3e4981 (patch) | |
tree | 81308b3c852a0fa8344fd017ebf2a7f9f19ed042 /arch/i386 | |
parent | 0d160211965b79de989cf2d170985abeb8da5ec6 (diff) |
xen: machine operations
Make the appropriate hypercalls to halt and reboot the virtual machine.
Signed-off-by: Jeremy Fitzhardinge <jeremy@xensource.com>
Acked-by: Chris Wright <chrisw@sous-sol.org>
Diffstat (limited to 'arch/i386')
-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) |