lkml.org 
[lkml]   [2007]   [May]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 25/28]xen: 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>

    ---
    arch/i386/xen/enlighten.c | 43 +++++++++++++++++++++++++++++++++++++++++++
    arch/i386/xen/smp.c | 4 +---
    2 files changed, 44 insertions(+), 3 deletions(-)

    ===================================================================
    --- a/arch/i386/xen/enlighten.c
    +++ b/arch/i386/xen/enlighten.c
    @@ -14,6 +14,7 @@

    #include <xen/interface/xen.h>
    #include <xen/interface/vcpu.h>
    +#include <xen/interface/sched.h>
    #include <xen/features.h>
    #include <xen/page.h>

    @@ -28,6 +29,7 @@
    #include <asm/pgtable.h>
    #include <asm/smp.h>
    #include <asm/tlbflush.h>
    +#include <asm/reboot.h>

    #include "xen-ops.h"
    #include "mmu.h"
    @@ -787,6 +789,45 @@ static const struct smp_ops xen_smp_ops
    };
    #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 */
    static asmlinkage void __init xen_start_kernel(void)
    {
    @@ -800,6 +841,8 @@ static asmlinkage void __init xen_start_

    /* Install Xen paravirt ops */
    paravirt_ops = xen_paravirt_ops;
    + machine_ops = xen_machine_ops;
    +
    #ifdef CONFIG_SMP
    smp_ops = xen_smp_ops;
    #endif
    ===================================================================
    --- a/arch/i386/xen/smp.c
    +++ b/arch/i386/xen/smp.c
    @@ -303,9 +303,7 @@ static void stop_self(void *v)

    void xen_smp_send_stop(void)
    {
    - cpumask_t mask = cpu_online_map;
    - cpu_clear(smp_processor_id(), mask);
    - xen_smp_call_function_mask(mask, stop_self, NULL, 0);
    + smp_call_function(stop_self, NULL, 0, 0);
    }

    void xen_smp_send_reschedule(int cpu)
    --

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-05-11 21:17    [W:0.025 / U:244.680 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site