WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-ppc-devel

[XenPPC] [linux-ppc-2.6] [POWERPC] DomU shutdown and reboot

To: xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
Subject: [XenPPC] [linux-ppc-2.6] [POWERPC] DomU shutdown and reboot
From: Xen patchbot-linux-ppc-2.6 <patchbot-linux-ppc-2.6@xxxxxxxxxxxxxxxxxxx>
Date: Mon, 07 Aug 2006 21:41:48 +0000
Delivery-date: Mon, 07 Aug 2006 14:48:40 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-ppc-devel-request@lists.xensource.com?subject=help>
List-id: Xen PPC development <xen-ppc-devel.lists.xensource.com>
List-post: <mailto:xen-ppc-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ppc-devel>, <mailto:xen-ppc-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ppc-devel>, <mailto:xen-ppc-devel-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-ppc-devel-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
# Node ID dd0958aa23228c7210162d1a728ba5fb5b6965b6
# Parent  7680b29c03a6dbc15a1394ebe1467c46bdab9a39
[POWERPC] DomU shutdown and reboot

This patch allows for DomUs to shutdown and reboot.
Along the way we:
 - updated def and use HYPERVISOR_sched_op() to use the xencomm when needed.
 - consolodated externs in arch/powerpc/platforms/xen/*.c into "setup.h"

Signed-off-by: Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
---
 arch/powerpc/platforms/xen/Makefile     |    2 -
 arch/powerpc/platforms/xen/evtchn.c     |    3 -
 arch/powerpc/platforms/xen/hcall.c      |   50 ++++++++++++++++++++++++++++++++
 arch/powerpc/platforms/xen/reboot.c     |   33 +++++++++++++++++++++
 arch/powerpc/platforms/xen/setup.c      |   13 ++++----
 arch/powerpc/platforms/xen/setup.h      |    6 +++
 include/asm-powerpc/xen/asm/hypercall.h |   11 +++++--
 7 files changed, 107 insertions(+), 11 deletions(-)

diff -r 7680b29c03a6 -r dd0958aa2322 arch/powerpc/platforms/xen/Makefile
--- a/arch/powerpc/platforms/xen/Makefile       Sat Aug 05 11:33:24 2006 -0400
+++ b/arch/powerpc/platforms/xen/Makefile       Mon Aug 07 17:37:23 2006 -0400
@@ -1,4 +1,4 @@ obj-y   += setup.o evtchn.o hcall.o udbg_x
-obj-y  += setup.o evtchn.o hcall.o udbg_xen.o xen_guest.o
+obj-y  += setup.o evtchn.o hcall.o udbg_xen.o xen_guest.o reboot.o
 
 ifndef CONFIG_XEN_BALLOON
 obj-y += balloon.o
diff -r 7680b29c03a6 -r dd0958aa2322 arch/powerpc/platforms/xen/evtchn.c
--- a/arch/powerpc/platforms/xen/evtchn.c       Sat Aug 05 11:33:24 2006 -0400
+++ b/arch/powerpc/platforms/xen/evtchn.c       Mon Aug 07 17:37:23 2006 -0400
@@ -7,6 +7,7 @@
 #include <asm/machdep.h>
 #include <asm/of_device.h>
 #include <asm/udbg.h>
+#include "setup.h"
 
 #ifdef DEBUG
 #define DBG(fmt...) udbg_printf(fmt)
@@ -31,7 +32,6 @@ struct hw_interrupt_type *xen_pirq;
 struct hw_interrupt_type *xen_pirq;
 static struct hw_interrupt_type hc_irq;
 extern struct machdep_calls mach_maple_md;
-extern void evtchn_init_IRQ(void);
 
 int xen_get_irq(struct pt_regs *regs)
 {
@@ -80,7 +80,6 @@ static inline struct mpic *mpic_from_irq
        return container_of(irq_desc[irq].handler, struct mpic, hc_irq);
 }
 
-extern void xen_init_IRQ(void);
 void xen_maple_init_IRQ(void)
 {
        struct mpic *mpic;
diff -r 7680b29c03a6 -r dd0958aa2322 arch/powerpc/platforms/xen/hcall.c
--- a/arch/powerpc/platforms/xen/hcall.c        Sat Aug 05 11:33:24 2006 -0400
+++ b/arch/powerpc/platforms/xen/hcall.c        Mon Aug 07 17:37:23 2006 -0400
@@ -183,6 +183,55 @@ int HYPERVISOR_grant_table_op(unsigned i
        return rc;
 }
 EXPORT_SYMBOL(HYPERVISOR_grant_table_op);
+
+int HYPERVISOR_sched_op(int cmd, void *arg)
+{
+       int rc;
+       struct xencomm_desc *desc;
+       ulong argsize;
+
+       switch (cmd) {
+       case SCHEDOP_yield:
+       case SCHEDOP_block:
+               return plpar_hcall_norets(XEN_MARK(__HYPERVISOR_sched_op),
+                                         cmd, 0);
+               break;
+
+       case SCHEDOP_shutdown: {
+               /* we use a minicom area cuz we could be called from panic() */
+               char xc_area[XENCOMM_MINI_AREA];
+
+               rc = xencomm_create_mini(xc_area, XENCOMM_MINI_AREA,
+                                        arg, sizeof(sched_shutdown_t), &desc);
+               if (rc)
+                       return rc;
+
+               rc = plpar_hcall_norets(XEN_MARK(__HYPERVISOR_sched_op),
+                                       cmd, __pa(desc));
+               return rc;
+       }
+       case SCHEDOP_poll:
+               argsize = sizeof(sched_poll_t);
+               break;
+       case SCHEDOP_remote_shutdown:
+               argsize = sizeof(sched_remote_shutdown_t);
+               break;
+       default:
+               printk("%s: unknown sched op %d\n", __func__, cmd);
+               return -ENOSYS;
+       }
+
+       rc = xencomm_create(arg, argsize, &desc, GFP_KERNEL);
+       if (rc)
+               return rc;
+
+       rc = plpar_hcall_norets(XEN_MARK(__HYPERVISOR_sched_op),
+                               cmd, __pa(desc));
+       xencomm_free(desc);
+
+       return rc;
+}
+EXPORT_SYMBOL(HYPERVISOR_sched_op);
 
 int HYPERVISOR_multicall(void *call_list, int nr_calls)
 {
@@ -463,3 +512,4 @@ int arch_privcmd_hypercall(privcmd_hyper
                                hypercall->arg[4]);
        }
 }
+
diff -r 7680b29c03a6 -r dd0958aa2322 arch/powerpc/platforms/xen/setup.c
--- a/arch/powerpc/platforms/xen/setup.c        Sat Aug 05 11:33:24 2006 -0400
+++ b/arch/powerpc/platforms/xen/setup.c        Mon Aug 07 17:37:23 2006 -0400
@@ -16,6 +16,7 @@
 #include <asm/machdep.h>
 #include <asm/hypervisor.h>
 #include <asm/time.h>
+#include "setup.h"
 
 #ifdef DEBUG
 #define DBG(fmt...) udbg_printf(fmt)
@@ -110,17 +111,19 @@ static void __init xen_init_early(void)
        DBG("    console_evtchn %x\n", xen_start_info->store_evtchn);
 
        is_dom0 = !!(xen_start_info->flags & SIF_INITDOMAIN);
+       
        if (is_dom0) {
+               xen_reboot_init(&mach_maple_md);
+
                ppc_md.pcibios_fixup            = mach_maple_md.pcibios_fixup;
                ppc_md.pci_get_legacy_ide_irq   = 
mach_maple_md.pci_get_legacy_ide_irq;
-               ppc_md.restart                  = mach_maple_md.restart;
-               ppc_md.power_off                = mach_maple_md.power_off;
-               ppc_md.halt                     = mach_maple_md.halt;
                ppc_md.get_boot_time            = mach_maple_md.get_boot_time;
                ppc_md.set_rtc_time             = mach_maple_md.set_rtc_time;
                ppc_md.get_rtc_time             = mach_maple_md.get_rtc_time;
 
                add_preferred_console("ttyS", 0, NULL);
+       } else {
+               xen_reboot_init(NULL);
        }
 
        DBG("Hello World I'm Maple Xen-LPAR!\n");
@@ -174,7 +177,7 @@ static void xen_idle(void)
                        rc = HYPERVISOR_set_timer_op(now_ns + offset_ns);
                        BUG_ON(rc != 0);
 
-                       HYPERVISOR_sched_op(SCHEDOP_block, 0);
+                       HYPERVISOR_sched_op(SCHEDOP_block, NULL);
                }
                local_irq_enable();
 
@@ -298,8 +301,6 @@ void xen_machine_crash_shutdown(struct p
 }       
 #endif
 
-extern void xen_maple_init_IRQ(void);
-extern int xen_get_irq(struct pt_regs *regs);
 define_machine(xen) {
        .name                   = "Xen-Maple",
        .probe                  = xen_probe,
diff -r 7680b29c03a6 -r dd0958aa2322 include/asm-powerpc/xen/asm/hypercall.h
--- a/include/asm-powerpc/xen/asm/hypercall.h   Sat Aug 05 11:33:24 2006 -0400
+++ b/include/asm-powerpc/xen/asm/hypercall.h   Mon Aug 07 17:37:23 2006 -0400
@@ -34,6 +34,7 @@
 #include <asm/page.h>
 #include <xen/xencomm.h>
 #include <xen/interface/xen.h>
+#include <xen/interface/sched.h>
 
 #define XEN_MARK(a)((a) | (~0UL << 16))
 
@@ -46,9 +47,14 @@ extern int HYPERVISOR_memory_op(unsigned
 extern int HYPERVISOR_memory_op(unsigned int cmd, void *arg);
 extern int HYPERVISOR_multicall(void *call_list, int nr_calls);
 
-static inline int HYPERVISOR_sched_op(int cmd, unsigned long arg)
+extern int HYPERVISOR_sched_op(int cmd, void *arg);
+static inline int HYPERVISOR_shutdown(unsigned int reason)
 {
-       return plpar_hcall_norets(XEN_MARK(__HYPERVISOR_sched_op), cmd, arg);
+       struct sched_shutdown sched_shutdown = {
+               .reason = reason
+       };
+
+       return HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown);
 }
 
 static inline int HYPERVISOR_set_timer_op(unsigned long arg)
@@ -56,4 +62,5 @@ static inline int HYPERVISOR_set_timer_o
        return plpar_hcall_norets(XEN_MARK(__HYPERVISOR_set_timer_op), arg);
 }
 
+
 #endif /*  __HYPERCALL_H__ */
diff -r 7680b29c03a6 -r dd0958aa2322 arch/powerpc/platforms/xen/reboot.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/arch/powerpc/platforms/xen/reboot.c       Mon Aug 07 17:37:23 2006 -0400
@@ -0,0 +1,33 @@
+#include <linux/module.h>
+#include <xen/interface/xen.h>
+#include <xen/interface/io/console.h>
+#include <xen/xencons.h>
+#include <asm/hypervisor.h>
+#include <asm/machdep.h>
+
+static void domain_machine_restart(char * __unused)
+{
+       /* We really want to get pending console data out before we die. */
+       xencons_force_flush();
+       HYPERVISOR_shutdown(SHUTDOWN_reboot);
+}
+
+static void domain_machine_power_off(void)
+{
+       /* We really want to get pending console data out before we die. */
+       xencons_force_flush();
+       HYPERVISOR_shutdown(SHUTDOWN_poweroff);
+}
+
+void xen_reboot_init(struct machdep_calls *md)
+{
+       if (md != NULL) {
+               ppc_md.restart   = md->restart;
+               ppc_md.power_off = md->power_off;
+               ppc_md.halt      = md->halt;
+       } else {
+               ppc_md.restart   = domain_machine_restart;
+               ppc_md.power_off = domain_machine_power_off;
+               ppc_md.halt      = domain_machine_power_off;
+       }
+}
diff -r 7680b29c03a6 -r dd0958aa2322 arch/powerpc/platforms/xen/setup.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/arch/powerpc/platforms/xen/setup.h        Mon Aug 07 17:37:23 2006 -0400
@@ -0,0 +1,6 @@
+
+extern void evtchn_init_IRQ(void);
+extern void xen_init_IRQ(void);
+extern void xen_reboot_init(struct machdep_calls *);
+extern void xen_maple_init_IRQ(void);
+extern int xen_get_irq(struct pt_regs *regs);

_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ppc-devel

<Prev in Thread] Current Thread [Next in Thread>
  • [XenPPC] [linux-ppc-2.6] [POWERPC] DomU shutdown and reboot, Xen patchbot-linux-ppc-2 . 6 <=