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>
This commit is contained in:
committed by
Jeremy Fitzhardinge
parent
0d16021196
commit
fefa629abe
@@ -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 @@
|
|||||||
#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 = {
|
|||||||
};
|
};
|
||||||
#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)
|
|||||||
|
|
||||||
/* 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)
|
|||||||
|
|
||||||
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)
|
||||||
|
Reference in New Issue
Block a user