[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [linux-2.6.18-xen] [IA64] Xenification of IA64 Kexec/kdump



# HG changeset patch
# User Alex Williamson <alex.williamson@xxxxxx>
# Date 1190994691 21600
# Node ID be065a274674c792a2bd5787c635d972d65770b7
# Parent  35f418758a773a5727bde40b87897a5497e81f5d
[IA64] Xenification of IA64 Kexec/kdump

Signed-off-by: Simon Horman <horms@xxxxxxxxxxxx>
---
 arch/ia64/kernel/crash.c           |   11 +++++------
 arch/ia64/kernel/relocate_kernel.S |   32 ++++++++++++++++++++++++++++++++
 arch/ia64/kernel/setup.c           |   12 ++++++++++++
 arch/ia64/xen/xcom_hcall.c         |   31 +++++++++++++++++++++++++++++++
 include/asm-ia64/hypercall.h       |    7 +++++++
 include/asm-ia64/xen/xcom_hcall.h  |    2 ++
 6 files changed, 89 insertions(+), 6 deletions(-)

diff -r 35f418758a77 -r be065a274674 arch/ia64/kernel/crash.c
--- a/arch/ia64/kernel/crash.c  Thu Sep 27 13:47:38 2007 -0600
+++ b/arch/ia64/kernel/crash.c  Fri Sep 28 09:51:31 2007 -0600
@@ -160,7 +160,6 @@ static int
 static int
 kdump_init_notifier(struct notifier_block *self, unsigned long val, void *data)
 {
-       struct ia64_mca_notify_die *nd;
        struct die_args *args = data;
 
        if (!kdump_on_init)
@@ -172,11 +171,11 @@ kdump_init_notifier(struct notifier_bloc
            val != DIE_MCA_MONARCH_LEAVE)
                return NOTIFY_DONE;
 
-       nd = (struct ia64_mca_notify_die *)args->err;
-       /* Reason code 1 means machine check rendezous*/
-       if ((val == DIE_INIT_MONARCH_ENTER || DIE_INIT_SLAVE_ENTER) &&
-                nd->sos->rv_rc == 1)
-               return NOTIFY_DONE;
+       /* There really ought to be a check here to see if this
+        * is a machine check rendevous. The kexec code that
+        * was merged around 2.6.20-rc1 includes such a check.
+        * But the check relies on infastructure that is not
+        * available in 2.6.16. */
 
        switch (val) {
                case DIE_INIT_MONARCH_ENTER:
diff -r 35f418758a77 -r be065a274674 arch/ia64/kernel/relocate_kernel.S
--- a/arch/ia64/kernel/relocate_kernel.S        Thu Sep 27 13:47:38 2007 -0600
+++ b/arch/ia64/kernel/relocate_kernel.S        Fri Sep 28 09:51:31 2007 -0600
@@ -20,7 +20,11 @@
         */
 GLOBAL_ENTRY(relocate_new_kernel)
        .prologue
+#ifdef CONFIG_XEN
+       alloc r31=ar.pfs,7,0,0,0
+#else
        alloc r31=ar.pfs,4,0,0,0
+#endif
         .body
 .reloc_entry:
 {
@@ -33,7 +37,11 @@ GLOBAL_ENTRY(relocate_new_kernel)
         srlz.i
 }
        ;;
+#ifdef CONFIG_XEN
+       dep r2=0,r2,60,4                //to physical address
+#else
        dep r2=0,r2,61,3                //to physical address
+#endif
        ;;
        //first switch to physical mode
        add r3=1f-.reloc_entry, r2
@@ -57,11 +65,19 @@ 1:
 1:
        //physical mode code begin
        mov b6=in1
+#ifdef CONFIG_XEN
+       dep r28=0,in2,60,4      //to physical address
+#else
        dep r28=0,in2,61,3      //to physical address
+#endif
 
        // purge all TC entries
 #define O(member)       IA64_CPUINFO_##member##_OFFSET
+#ifdef CONFIG_XEN
+       mov r2=in4                      // load phys addr of cpu_info into r2
+#else
         GET_THIS_PADDR(r2, cpu_info)    // load phys addr of cpu_info into r2
+#endif
         ;;
         addl r17=O(PTCE_STRIDE),r2
         addl r2=O(PTCE_BASE),r2
@@ -95,7 +111,11 @@ 4:
         srlz.i
         ;;
        //purge TR entry for kernel text and data
+#ifdef CONFIG_XEN
+       mov r16=in5
+#else
         movl r16=KERNEL_START
+#endif
         mov r18=KERNEL_TR_PAGE_SHIFT<<2
         ;;
         ptr.i r16, r18
@@ -126,7 +146,11 @@ 4:
         mov r16=IA64_KR(CURRENT_STACK)
         ;;
         shl r16=r16,IA64_GRANULE_SHIFT
+#ifdef CONFIG_XEN
+       mov r19=in6
+#else
         movl r19=PAGE_OFFSET
+#endif
         ;;
         add r16=r19,r16
         mov r18=IA64_GRANULE_SHIFT<<2
@@ -183,10 +207,18 @@ 1:
 
 .align  32
 memory_stack:
+#ifdef CONFIG_XEN
+       .fill           4096, 1, 0
+#else
        .fill           8192, 1, 0
+#endif
 memory_stack_end:
 register_stack:
+#ifdef CONFIG_XEN
+       .fill           4096, 1, 0
+#else
        .fill           8192, 1, 0
+#endif
 register_stack_end:
 relocate_new_kernel_end:
 END(relocate_new_kernel)
diff -r 35f418758a77 -r be065a274674 arch/ia64/kernel/setup.c
--- a/arch/ia64/kernel/setup.c  Thu Sep 27 13:47:38 2007 -0600
+++ b/arch/ia64/kernel/setup.c  Fri Sep 28 09:51:31 2007 -0600
@@ -307,6 +307,15 @@ reserve_memory (void)
        {
                char *from = strstr(saved_command_line, "crashkernel=");
                unsigned long base, size;
+#ifdef CONFIG_XEN
+               if (is_initial_xendomain()) {
+                       if (from)
+                               printk("Ignoring crashkernel command line, "
+                                      "parameter will be supplied by xen\n");
+                       xen_machine_kexec_setup_resources();
+               }
+               else {
+#endif
                if (from) {
                        size = memparse(from + 12, &from);
                        if (size) {
@@ -324,6 +333,9 @@ reserve_memory (void)
                                }
                        }
                }
+#ifdef CONFIG_XEN
+               }
+#endif
                efi_memmap_res.start = ia64_boot_param->efi_memmap;
                 efi_memmap_res.end = efi_memmap_res.start +
                         ia64_boot_param->efi_memmap_size;
diff -r 35f418758a77 -r be065a274674 arch/ia64/xen/xcom_hcall.c
--- a/arch/ia64/xen/xcom_hcall.c        Thu Sep 27 13:47:38 2007 -0600
+++ b/arch/ia64/xen/xcom_hcall.c        Fri Sep 28 09:51:31 2007 -0600
@@ -39,6 +39,7 @@
 #include <xen/interface/hvm/params.h>
 #include <xen/interface/xenoprof.h>
 #include <xen/interface/vcpu.h>
+#include <xen/interface/kexec.h>
 #include <asm/hypervisor.h>
 #include <asm/page.h>
 #include <asm/uaccess.h>
@@ -630,3 +631,33 @@ xencomm_hypercall_fpswa_revision(unsigne
        return xencomm_arch_hypercall_fpswa_revision(desc);
 }
 EXPORT_SYMBOL_GPL(xencomm_hypercall_fpswa_revision);
+
+int
+xencomm_hypercall_kexec_op(int cmd, void *arg)
+{
+       unsigned int argsize;
+       struct xencomm_handle *desc;
+
+       switch (cmd) {
+       case KEXEC_CMD_kexec_get_range:
+               argsize = sizeof(xen_kexec_range_t);
+               break;
+       case KEXEC_CMD_kexec_load:
+       case KEXEC_CMD_kexec_unload:
+               argsize = sizeof(xen_kexec_load_t);
+               break;
+       case KEXEC_CMD_kexec:
+               argsize = sizeof(xen_kexec_exec_t);
+               break;
+       default:
+               printk("%s:%d cmd %d isn't supported\n",
+                      __func__, __LINE__, cmd);
+               BUG();
+       }
+
+       desc = xencomm_map_no_alloc(arg, argsize);
+       if (desc == NULL)
+               return -EINVAL;
+
+       return xencomm_arch_hypercall_kexec_op(cmd, desc);
+}
diff -r 35f418758a77 -r be065a274674 include/asm-ia64/hypercall.h
--- a/include/asm-ia64/hypercall.h      Thu Sep 27 13:47:38 2007 -0600
+++ b/include/asm-ia64/hypercall.h      Fri Sep 28 09:51:31 2007 -0600
@@ -424,6 +424,12 @@ HYPERVISOR_add_io_space(unsigned long ph
 {
        return _hypercall4(int, ia64_dom0vp_op, IA64_DOM0VP_add_io_space,
                           phys_base, sparse, space_number);
+}
+
+static inline int
+xencomm_arch_hypercall_kexec_op(int cmd, struct xencomm_handle *arg)
+{
+       return _hypercall2(int, kexec_op, cmd, arg);
 }
 
 // for balloon driver
@@ -444,6 +450,7 @@ HYPERVISOR_add_io_space(unsigned long ph
 #define HYPERVISOR_suspend xencomm_hypercall_suspend
 #define HYPERVISOR_vcpu_op xencomm_hypercall_vcpu_op
 #define HYPERVISOR_opt_feature xencomm_hypercall_opt_feature
+#define HYPERVISOR_kexec_op xencomm_hypercall_kexec_op
 
 /* to compile gnttab_copy_grant_page() in drivers/xen/core/gnttab.c */
 #define HYPERVISOR_mmu_update(req, count, success_count, domid) ({BUG();0;})
diff -r 35f418758a77 -r be065a274674 include/asm-ia64/xen/xcom_hcall.h
--- a/include/asm-ia64/xen/xcom_hcall.h Thu Sep 27 13:47:38 2007 -0600
+++ b/include/asm-ia64/xen/xcom_hcall.h Fri Sep 28 09:51:31 2007 -0600
@@ -62,4 +62,6 @@ extern int privcmd_hypercall(struct priv
 
 extern int xen_foreign_p2m_expose(struct privcmd_hypercall *hypercall);
 
+extern int xencomm_hypercall_kexec_op(int cmd, void *arg);
+
 #endif /* _LINUX_XENCOMM_HCALL_H_ */

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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.