Commit fefa629a authored by Jeremy Fitzhardinge's avatar Jeremy Fitzhardinge Committed by Jeremy Fitzhardinge

xen: machine operations

Make the appropriate hypercalls to halt and reboot the virtual machine.
Signed-off-by: default avatarJeremy Fitzhardinge <jeremy@xensource.com>
Acked-by: default avatarChris Wright <chrisw@sous-sol.org>
parent 0d160211
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <xen/interface/xen.h> #include <xen/interface/xen.h>
#include <xen/interface/physdev.h> #include <xen/interface/physdev.h>
#include <xen/interface/vcpu.h> #include <xen/interface/vcpu.h>
#include <xen/interface/sched.h>
#include <xen/features.h> #include <xen/features.h>
#include <xen/page.h> #include <xen/page.h>
...@@ -43,6 +44,7 @@ ...@@ -43,6 +44,7 @@
#include <asm/desc.h> #include <asm/desc.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/tlbflush.h> #include <asm/tlbflush.h>
#include <asm/reboot.h>
#include "xen-ops.h" #include "xen-ops.h"
#include "mmu.h" #include "mmu.h"
...@@ -900,6 +902,45 @@ static const struct smp_ops xen_smp_ops __initdata = { ...@@ -900,6 +902,45 @@ static const struct smp_ops xen_smp_ops __initdata = {
}; };
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
static void xen_reboot(int reason)
{
#ifdef CONFIG_SMP
smp_send_stop();
#endif
if (HYPERVISOR_sched_op(SCHEDOP_shutdown, reason))
BUG();
}
static void xen_restart(char *msg)
{
xen_reboot(SHUTDOWN_reboot);
}
static void xen_emergency_restart(void)
{
xen_reboot(SHUTDOWN_reboot);
}
static void xen_machine_halt(void)
{
xen_reboot(SHUTDOWN_poweroff);
}
static void xen_crash_shutdown(struct pt_regs *regs)
{
xen_reboot(SHUTDOWN_crash);
}
static const struct machine_ops __initdata xen_machine_ops = {
.restart = xen_restart,
.halt = xen_machine_halt,
.power_off = xen_machine_halt,
.shutdown = xen_machine_halt,
.crash_shutdown = xen_crash_shutdown,
.emergency_restart = xen_emergency_restart,
};
/* First C function to be called on Xen boot */ /* First C function to be called on Xen boot */
asmlinkage void __init xen_start_kernel(void) asmlinkage void __init xen_start_kernel(void)
{ {
...@@ -912,6 +953,8 @@ asmlinkage void __init xen_start_kernel(void) ...@@ -912,6 +953,8 @@ asmlinkage void __init xen_start_kernel(void)
/* Install Xen paravirt ops */ /* Install Xen paravirt ops */
paravirt_ops = xen_paravirt_ops; paravirt_ops = xen_paravirt_ops;
machine_ops = xen_machine_ops;
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
smp_ops = xen_smp_ops; smp_ops = xen_smp_ops;
#endif #endif
......
...@@ -311,9 +311,7 @@ static void stop_self(void *v) ...@@ -311,9 +311,7 @@ static void stop_self(void *v)
void xen_smp_send_stop(void) void xen_smp_send_stop(void)
{ {
cpumask_t mask = cpu_online_map; smp_call_function(stop_self, NULL, 0, 0);
cpu_clear(smp_processor_id(), mask);
xen_smp_call_function_mask(mask, stop_self, NULL, 0);
} }
void xen_smp_send_reschedule(int cpu) void xen_smp_send_reschedule(int cpu)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment