public inbox for linux-ia64@vger.kernel.org
 help / color / mirror / Atom feed
* IA64 Kexec-Kdump kernel patch
@ 2006-08-14  6:47 Zou Nan hai
  2006-08-14 21:24 ` Bob Montgomery
                   ` (16 more replies)
  0 siblings, 17 replies; 18+ messages in thread
From: Zou Nan hai @ 2006-08-14  6:47 UTC (permalink / raw)
  To: linux-ia64

This patch is the kexec-kdump patch re-based to 2.6.18-rc4 kernel.

Changes since last patch include:

1. re-base the patch to 2.6.18-rc4
2. per-cpu register dumping, so that user space tool can unwind kernel stack.
   This should really done by INIT event. But unfortunately it seems that the 
   firmware on the machine I am using does not handle INIT event correctly...
   So current I dump per-cpu registers by simple IPI. 
	
3. fix on_line_cpu issue, 
   previous patch stop APs by smp_send_stop. AP will clear his bit in 
   cpu_online_map, then crash tools will see a cpu_online_map which only 
   contains 1 cpu in vmcore file.

4. reserve efi memmap area and ia64 boot param area for the first kernel.

To test crash dump.

Compile a kernel with CONFIG_KEXEC CONFIG_CRASH_DUMP 
CONFIG_PROC_VMCORE enabled.

using this kernel for both host kernel and crash dumping kernel.

Boot this kernel with kernel parameter "crashkernel=XXX@YYY".
XXX should be a size big enough for crash kernel to run, YYY should 
be a physical address which contains more than XXX memory and aligned to 64M.
you can check it in /proc/iomem.
Be careful of choosing the size and address to reserve.
The second kernel may hang silently if there is too few memory to use.

After the first kernel boots, the "Crash kernel" region will show in /proc/iomem.
then load the same kernel with command.

kexec -p vmlinux.gz --initrd=initrd --append="root=... maxcpus=1"

trigger a crash with echo c > /proc/sysrq-trigger

after the crash kernel boots, 
copy /proc/vmcore to disk

gdb vmlinux-of-first-kernel vmcore
then you can check the stack and variables of first kernel.

kexec -l + kexec -e may not work.
That is because of a recent change in mpt-fusion driver 
shutdown code. 
There was some delay in mptscsih_remove path. 
the code was removed in 2.6.17, that cause MPT fusion driver unable to reinitialize.
add a delay back to mptscsih_remove can solve this problem.


Signed-off-by:
 Zou Nan hai <nanhai.zou@intel.com>


diff -Nraup a/arch/ia64/hp/common/sba_iommu.c b/arch/ia64/hp/common/sba_iommu.c
--- a/arch/ia64/hp/common/sba_iommu.c	2006-08-15 05:52:14.000000000 +0800
+++ b/arch/ia64/hp/common/sba_iommu.c	2006-08-15 09:50:03.000000000 +0800
@@ -1623,6 +1623,28 @@ ioc_iova_init(struct ioc *ioc)
 	READ_REG(ioc->ioc_hpa + IOC_IBASE);
 }
 
+#ifdef CONFIG_KEXEC
+void
+ioc_iova_disable(void)
+{
+	struct ioc *ioc;
+
+	ioc = ioc_list;
+
+	while (ioc != NULL) {
+		/* Disable IOVA translation */
+		WRITE_REG(ioc->ibase & 0xfffffffffffffffe, ioc->ioc_hpa + IOC_IBASE);
+		READ_REG(ioc->ioc_hpa + IOC_IBASE);
+
+		/* Clear I/O TLB of any possible entries */
+		WRITE_REG(ioc->ibase | (get_iovp_order(ioc->iov_size) + iovp_shift), ioc->ioc_hpa + IOC_PCOM);
+		READ_REG(ioc->ioc_hpa + IOC_PCOM);
+
+		ioc = ioc->next;
+	}
+}
+#endif
+
 static void __init
 ioc_resource_init(struct ioc *ioc)
 {
diff -Nraup a/arch/ia64/Kconfig b/arch/ia64/Kconfig
--- a/arch/ia64/Kconfig	2006-08-15 05:52:14.000000000 +0800
+++ b/arch/ia64/Kconfig	2006-08-15 09:50:03.000000000 +0800
@@ -427,6 +427,29 @@ config SGI_SN
 
 source "drivers/sn/Kconfig"
 
+config KEXEC
+	bool "kexec system call (EXPERIMENTAL)"
+	depends on EXPERIMENTAL
+	help
+	  kexec is a system call that implements the ability to shutdown your
+	  current kernel, and to start another kernel.  It is like a reboot
+	  but it is indepedent of the system firmware.   And like a reboot
+	  you can start any kernel with it, not just Linux.
+
+	  The name comes from the similiarity to the exec system call.
+
+	  It is an ongoing process to be certain the hardware in a machine
+	  is properly shutdown, so do not be surprised if this code does not
+	  initially work for you.  It may help to enable device hotplugging
+	  support.  As of this writing the exact hardware interface is
+	  strongly in flux, so no good recommendation can be made.
+
+config CRASH_DUMP
+	  bool "kernel crash dumps (EXPERIMENTAL)"
+	  depends on EXPERIMENTAL
+	  help
+	    Generate crash dump after being started by kexec.
+
 source "drivers/firmware/Kconfig"
 
 source "fs/Kconfig.binfmt"
diff -Nraup a/arch/ia64/kernel/crash.c b/arch/ia64/kernel/crash.c
--- a/arch/ia64/kernel/crash.c	1970-01-01 08:00:00.000000000 +0800
+++ b/arch/ia64/kernel/crash.c	2006-08-15 09:50:03.000000000 +0800
@@ -0,0 +1,129 @@
+/*
+ * arch/ia64/kernel/crash.c
+ *
+ * Architecture specific (ia64) functions for kexec based crash dumps.
+ *
+ * Created by: Khalid Aziz <khalid.aziz@hp.com>
+ * Copyright (C) 2005 Hewlett-Packard Development Company, L.P.
+ * Copyright (C) 2005 Intel Corp	Zou Nan hai <nanhai.zou@intel.com>
+ *
+ */
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/smp.h>
+#include <linux/irq.h>
+#include <linux/pci.h>
+#include <linux/reboot.h>
+#include <linux/kexec.h>
+#include <linux/irq.h>
+#include <linux/delay.h>
+#include <linux/elf.h>
+#include <linux/elfcore.h>
+#include <linux/device.h>
+#include <asm/uaccess.h>
+
+size_t copy_oldmem_page(unsigned long pfn, char *buf,
+                               size_t csize, unsigned long offset, int userbuf)
+{
+        void  *vaddr;
+
+        if (!csize)
+                return 0;
+        vaddr = page_address(pfn_to_page(pfn));
+
+        if (userbuf) {
+                if (copy_to_user(buf, (vaddr + offset), csize)) {
+                        return -EFAULT;
+                }
+        } else
+                memcpy(buf, (vaddr + offset), csize);
+        return csize;
+}
+
+static void device_shootdown(void)
+{
+	irq_desc_t *idesc;
+	int irq;
+	for (irq = 0; irq < NR_IRQS; irq++) {
+		idesc = irq_desc + irq;
+		if (!idesc || !idesc->action)
+			continue;
+		disable_irq_nosync(irq);
+		idesc->chip->end(irq);
+		idesc->chip->shutdown(irq);
+	}
+
+#ifdef CONFIG_IA64_HP_ZX1
+	ioc_iova_disable();
+#endif
+}
+
+static inline Elf64_Word
+*append_elf_note(Elf64_Word *buf, char *name, unsigned type, void *data,
+		size_t data_len)
+{
+	struct elf_note *note = (struct elf_note *)buf;
+	note->n_namesz = strlen(name) + 1;
+	note->n_descsz = data_len;
+	note->n_type   = type;
+	buf += (sizeof(*note) + 3)/4;
+	memcpy(buf, name, note->n_namesz);
+	buf += (note->n_namesz + 3)/4;
+	memcpy(buf, data, data_len);
+	buf += (data_len + 3)/4;
+	return buf;
+}
+
+static void
+final_note(void *buf)
+{
+	memset(buf, 0, sizeof(struct elf_note));
+}
+
+extern void ia64_dump_cpu_regs(void *);
+
+void
+crash_save_this_cpu()
+{
+	void *buf;
+	struct elf_prstatus prstatus;
+	int cpu = smp_processor_id();
+	unsigned long cfm, sof, sol;
+	elf_greg_t *dst = (elf_greg_t *)&prstatus.pr_reg;
+	memset(&prstatus, 0, sizeof(prstatus));
+	prstatus.pr_pid = current->pid;
+
+	ia64_dump_cpu_regs(dst);
+        cfm = dst[43];
+        sol = (cfm >> 7) & 0x7f;
+        sof = cfm & 0x7f;
+        dst[46] = (unsigned long)ia64_rse_skip_regs((unsigned long *)dst[46],
+                        sof - sol);
+
+        buf = (u64 *) per_cpu_ptr(crash_notes, cpu);
+	if (!buf)
+		return;
+	buf = append_elf_note(buf, "CORE", NT_PRSTATUS, &prstatus,
+		sizeof(prstatus));
+	final_note(buf);
+}
+
+void
+machine_crash_shutdown(struct pt_regs *pt)
+{
+	/* This function is only called after the system
+	 * has paniced or is otherwise in a critical state.
+	 * The minimum amount of code to allow a kexec'd kernel
+	 * to run successfully needs to happen here.
+	 *
+	 * In practice this means shooting down the other cpus in
+	 * an SMP system.
+	 */
+	if (in_interrupt())
+		ia64_eoi();
+	device_shootdown();
+#ifdef CONFIG_SMP
+	kdump_smp_send_stop();
+#endif
+}
diff -Nraup a/arch/ia64/kernel/efi.c b/arch/ia64/kernel/efi.c
--- a/arch/ia64/kernel/efi.c	2006-08-15 05:52:14.000000000 +0800
+++ b/arch/ia64/kernel/efi.c	2006-08-15 09:50:03.000000000 +0800
@@ -26,6 +26,7 @@
 #include <linux/types.h>
 #include <linux/time.h>
 #include <linux/efi.h>
+#include <linux/kexec.h>
 
 #include <asm/io.h>
 #include <asm/kregs.h>
@@ -41,7 +42,7 @@ extern efi_status_t efi_call_phys (void 
 struct efi efi;
 EXPORT_SYMBOL(efi);
 static efi_runtime_services_t *runtime;
-static unsigned long mem_limit = ~0UL, max_addr = ~0UL;
+static unsigned long mem_limit = ~0UL, max_addr = ~0UL, min_addr = 0UL;
 
 #define efi_call_virt(f, args...)	(*(f))(args)
 
@@ -421,6 +422,8 @@ efi_init (void)
 			mem_limit = memparse(cp + 4, &cp);
 		} else if (memcmp(cp, "max_addr=", 9) = 0) {
 			max_addr = GRANULEROUNDDOWN(memparse(cp + 9, &cp));
+		} else if (memcmp(cp, "min_addr=", 9) = 0) {
+			min_addr = GRANULEROUNDDOWN(memparse(cp + 9, &cp));
 		} else {
 			while (*cp != ' ' && *cp)
 				++cp;
@@ -428,6 +431,8 @@ efi_init (void)
 				++cp;
 		}
 	}
+	if (min_addr != 0UL)
+		printk(KERN_INFO "Ignoring memory below %luMB\n", min_addr >> 20);
 	if (max_addr != ~0UL)
 		printk(KERN_INFO "Ignoring memory above %luMB\n", max_addr >> 20);
 
@@ -894,7 +899,8 @@ find_memmap_space (void)
 		as = max(contig_low, md->phys_addr);
 		ae = min(contig_high, efi_md_end(md));
 
-		/* keep within max_addr= command line arg */
+		/* keep within max_addr= and min_addr= command line arg */
+		as = max(as, min_addr);
 		ae = min(ae, max_addr);
 		if (ae <= as)
 			continue;
@@ -1004,7 +1010,8 @@ efi_memmap_init(unsigned long *s, unsign
 		} else
 			ae = efi_md_end(md);
 
-		/* keep within max_addr= command line arg */
+		/* keep within max_addr= and min_addr= command line arg */
+		as = max(as, min_addr);
 		ae = min(ae, max_addr);
 		if (ae <= as)
 			continue;
@@ -1116,6 +1123,12 @@ efi_initialize_iomem_resources(struct re
 			 */
 			insert_resource(res, code_resource);
 			insert_resource(res, data_resource);
+#ifdef CONFIG_KEXEC
+                        insert_resource(res, &efi_memmap_res);
+                        insert_resource(res, &boot_param_res);
+			if (crashk_res.end > crashk_res.start)
+				insert_resource(res, &crashk_res);
+#endif
 		}
 	}
 }
diff -Nraup a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S
--- a/arch/ia64/kernel/entry.S	2006-08-15 05:52:14.000000000 +0800
+++ b/arch/ia64/kernel/entry.S	2006-08-15 09:50:03.000000000 +0800
@@ -1575,7 +1575,7 @@ sys_call_table:
 	data8 sys_mq_timedreceive		// 1265
 	data8 sys_mq_notify
 	data8 sys_mq_getsetattr
-	data8 sys_ni_syscall			// reserved for kexec_load
+	data8 sys_kexec_load
 	data8 sys_ni_syscall			// reserved for vserver
 	data8 sys_waitid			// 1270
 	data8 sys_add_key
diff -Nraup a/arch/ia64/kernel/machine_kexec.c b/arch/ia64/kernel/machine_kexec.c
--- a/arch/ia64/kernel/machine_kexec.c	1970-01-01 08:00:00.000000000 +0800
+++ b/arch/ia64/kernel/machine_kexec.c	2006-08-15 10:12:00.000000000 +0800
@@ -0,0 +1,131 @@
+/*
+ * arch/ia64/kernel/machine_kexec.c
+ *
+ * Handle transition of Linux booting another kernel
+ * Copyright (C) 2005 Hewlett-Packard Development Comapny, L.P.
+ * Copyright (C) 2005 Khalid Aziz <khalid.aziz@hp.com>
+ * Copyright (C) 2006 Intel Corp, Zou Nan hai <nanhai.zou@intel.com>
+ *
+ * This source code is licensed under the GNU General Public License,
+ * Version 2.  See the file COPYING for more details.
+ */
+
+#include <linux/kernel.h>
+#include <linux/config.h>
+#include <linux/mm.h>
+#include <linux/kexec.h>
+#include <linux/pci.h>
+#include <linux/cpu.h>
+#include <asm/mmu_context.h>
+#include <asm/setup.h>
+#include <asm/mca.h>
+#include <asm/page.h>
+#include <asm/bitops.h>
+#include <asm/tlbflush.h>
+#include <asm/delay.h>
+#include <asm/meminit.h>
+
+typedef void (*relocate_new_kernel_t)(unsigned long, unsigned long,
+		struct ia64_boot_param *, unsigned long);
+static struct kimage *ia64_kimage;
+struct resource efi_memmap_res = {
+        .name  = "EFI Memory Map",
+        .start = 0,
+        .end   = 0,
+        .flags = IORESOURCE_BUSY | IORESOURCE_MEM
+};
+
+struct resource boot_param_res = {
+        .name  = "Boot parameter",
+        .start = 0,
+        .end   = 0,
+        .flags = IORESOURCE_BUSY | IORESOURCE_MEM
+};
+
+
+/*
+ * Do what every setup is needed on image and the
+ * reboot code buffer to allow us to avoid allocations
+ * later.
+ */
+int machine_kexec_prepare(struct kimage *image)
+{
+	void *control_code_buffer;
+	const unsigned long *func;
+
+	func = (unsigned long *)&relocate_new_kernel;
+	/* Pre-load control code buffer to minimize work in kexec path */
+	control_code_buffer = page_address(image->control_code_page);
+	memcpy((void *)control_code_buffer, (const void *)func[0],
+			relocate_new_kernel_size);
+	flush_icache_range((unsigned long)control_code_buffer,
+			(unsigned long)control_code_buffer + relocate_new_kernel_size);
+	ia64_kimage = image;
+
+	return 0;
+}
+
+void machine_kexec_cleanup(struct kimage *image)
+{
+}
+
+void machine_shutdown(void)
+{
+#ifdef CONFIG_HOTPLUG_CPU
+	{
+		int cpu;
+
+		for_each_online_cpu(cpu) {
+			if (cpu != smp_processor_id())
+				cpu_down(cpu);
+		}
+	}
+#elif defined(CONFIG_SMP)
+	smp_call_function(kexec_stop_this_cpu, (void *)ia64_kimage->start, 0, 0);
+#endif
+#ifdef CONFIG_PCI
+	{
+		struct pci_dev *dev = NULL;
+		irq_desc_t *idesc;
+		/* Disable all PCI devices */
+		while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
+			if (!(dev->is_enabled))
+				continue;
+			idesc = irq_desc + dev->irq;
+			if (!idesc||!idesc->chip)
+				continue;
+			disable_irq_nosync(dev->irq);
+			idesc->chip->end(dev->irq);
+			idesc->action = NULL;
+			pci_disable_device(dev);
+		}
+	}
+#endif
+
+
+#ifdef CONFIG_IA64_HP_ZX1
+	ioc_iova_disable();
+#endif
+}
+
+/*
+ * Do not allocate memory (or fail in any way) in machine_kexec().
+ * We are past the point of no return, committed to rebooting now.
+ */
+extern void *efi_get_pal_addr(void);
+void machine_kexec(struct kimage *image)
+{
+	relocate_new_kernel_t rnk;
+	void *pal_addr = efi_get_pal_addr();
+	unsigned long code_addr = (unsigned long)page_address(image->control_code_page);
+	if (image->type = KEXEC_TYPE_CRASH)
+		crash_save_this_cpu();
+	/* Interrupts aren't acceptable while we reboot */
+	ia64_set_itv(1<<16);
+	local_irq_disable();
+	rnk = (relocate_new_kernel_t)&code_addr;
+	(*rnk)(image->head, image->start, ia64_boot_param,
+		     GRANULEROUNDDOWN((unsigned long) pal_addr));
+	BUG();
+	for (;;);
+}
diff -Nraup a/arch/ia64/kernel/Makefile b/arch/ia64/kernel/Makefile
--- a/arch/ia64/kernel/Makefile	2006-08-15 05:52:14.000000000 +0800
+++ b/arch/ia64/kernel/Makefile	2006-08-15 09:50:03.000000000 +0800
@@ -28,6 +28,7 @@ obj-$(CONFIG_IA64_CYCLONE)	+= cyclone.o
 obj-$(CONFIG_CPU_FREQ)		+= cpufreq/
 obj-$(CONFIG_IA64_MCA_RECOVERY)	+= mca_recovery.o
 obj-$(CONFIG_KPROBES)		+= kprobes.o jprobes.o
+obj-$(CONFIG_KEXEC)		+= machine_kexec.o relocate_kernel.o crash.o
 obj-$(CONFIG_IA64_UNCACHED_ALLOCATOR)	+= uncached.o
 obj-$(CONFIG_AUDIT)		+= audit.o
 mca_recovery-y			+= mca_drv.o mca_drv_asm.o
diff -Nraup a/arch/ia64/kernel/relocate_kernel.S b/arch/ia64/kernel/relocate_kernel.S
--- a/arch/ia64/kernel/relocate_kernel.S	1970-01-01 08:00:00.000000000 +0800
+++ b/arch/ia64/kernel/relocate_kernel.S	2006-08-15 09:50:03.000000000 +0800
@@ -0,0 +1,490 @@
+/*
+ * arch/ia64/kernel/relocate_kernel.S
+ *
+ * Relocate kexec'able kernel and start it
+ *
+ * Copyright (C) 2005 Hewlett-Packard Development Company, L.P.
+ * Copyright (C) 2005 Khalid Aziz  <khalid.aziz@hp.com>
+ * Copyright (C) 2005 Intel Corp,  Zou Nan hai <nanhai.zou@intel.com>
+ *
+ * This source code is licensed under the GNU General Public License,
+ * Version 2.  See the file COPYING for more details.
+ */
+#include <linux/config.h>
+#include <asm/asmmacro.h>
+#include <asm/kregs.h>
+#include <asm/page.h>
+#include <asm/pgtable.h>
+#include <asm/mca_asm.h>
+
+       /* Must be relocatable PIC code callable as a C function
+        */
+GLOBAL_ENTRY(relocate_new_kernel)
+	.prologue
+	alloc r31=ar.pfs,4,0,0,0
+        .body
+.reloc_entry:
+{
+	rsm psr.i| psr.ic
+	mov r2=ip
+}
+	;;
+{
+        flushrs                         // must be first insn in group
+        srlz.i
+}
+	;;
+	dep r2=0,r2,61,3		//to physical address
+	;;
+	//first switch to physical mode
+	add r3\x1f-.reloc_entry, r2
+	movl r16 = IA64_PSR_AC|IA64_PSR_BN|IA64_PSR_IC
+	mov ar.rsc=0	          	// put RSE in enforced lazy mode
+	;;
+	add sp=(memory_stack_end - 16 - .reloc_entry),r2
+	add r8=(register_stack - .reloc_entry),r2
+	;;
+	mov r18=ar.rnat
+	mov ar.bspstore=r8
+	;;
+        mov cr.ipsr=r16
+        mov cr.iip=r3
+        mov cr.ifs=r0
+	srlz.i
+	;;
+	mov ar.rnat=r18
+	rfi
+	;;
+1:
+	//physical mode code begin
+	mov b6=in1
+	dep r28=0,in2,61,3	//to physical address
+
+	// purge all TC entries
+#define O(member)       IA64_CPUINFO_##member##_OFFSET
+        GET_THIS_PADDR(r2, cpu_info)    // load phys addr of cpu_info into r2
+        ;;
+        addl r17=O(PTCE_STRIDE),r2
+        addl r2=O(PTCE_BASE),r2
+        ;;
+        ld8 r18=[r2],(O(PTCE_COUNT)-O(PTCE_BASE));;    	// r18=ptce_base
+        ld4 r19=[r2],4                                  // r19=ptce_count[0]
+        ld4 r21=[r17],4                                 // r21=ptce_stride[0]
+        ;;
+        ld4 r20=[r2]                                    // r20=ptce_count[1]
+        ld4 r22=[r17]                                   // r22=ptce_stride[1]
+        mov r24=r0
+        ;;
+        adds r20=-1,r20
+        ;;
+#undef O
+2:
+        cmp.ltu p6,p7=r24,r19
+(p7)    br.cond.dpnt.few 4f
+        mov ar.lc=r20
+3:
+        ptc.e r18
+        ;;
+        add r18=r22,r18
+        br.cloop.sptk.few 3b
+        ;;
+        add r18=r21,r18
+        add r24=1,r24
+        ;;
+        br.sptk.few 2b
+4:
+        srlz.i
+        ;;
+	//purge TR entry for kernel text and data
+        movl r16=KERNEL_START
+        mov r18=KERNEL_TR_PAGE_SHIFT<<2
+        ;;
+        ptr.i r16, r18
+        ptr.d r16, r18
+        ;;
+        srlz.i
+        ;;
+
+	// purge TR entry for percpu data
+        movl r16=PERCPU_ADDR
+        mov r18=PERCPU_PAGE_SHIFT<<2
+        ;;
+        ptr.d r16,r18
+        ;;
+        srlz.d
+	;;
+
+        // purge TR entry for pal code
+        mov r16=in3
+        mov r18=IA64_GRANULE_SHIFT<<2
+        ;;
+        ptr.i r16,r18
+        ;;
+        srlz.i
+	;;
+
+        // purge TR entry for stack
+        mov r16=IA64_KR(CURRENT_STACK)
+        ;;
+        shl r16=r16,IA64_GRANULE_SHIFT
+        movl r19=PAGE_OFFSET
+        ;;
+        add r16=r19,r16
+        mov r18=IA64_GRANULE_SHIFT<<2
+        ;;
+        ptr.d r16,r18
+        ;;
+        srlz.i
+	;;
+
+	//copy segments
+	movl r16=PAGE_MASK
+        mov  r30=in0                    // in0 is page_list
+        br.sptk.few .dest_page
+	;;
+.loop:
+	ld8  r30=[in0], 8;;
+.dest_page:
+	tbit.z p0, p6=r30, 0;;    	// 0x1 dest page
+(p6)	and r17=r30, r16
+(p6)	br.cond.sptk.few .loop;;
+
+	tbit.z p0, p6=r30, 1;;		// 0x2 indirect page
+(p6)	and in0=r30, r16
+(p6)	br.cond.sptk.few .loop;;
+
+	tbit.z p0, p6=r30, 2;;		// 0x4 end flag
+(p6)	br.cond.sptk.few .end_loop;;
+
+	tbit.z p6, p0=r30, 3;;		// 0x8 source page
+(p6)	br.cond.sptk.few .loop
+
+	and r18=r30, r16
+
+	// simple copy page, may optimize later
+	movl r14=PAGE_SIZE/8 - 1;;
+	mov ar.lc=r14;;
+1:
+	ld8 r14=[r18], 8;;
+	st8 [r17]=r14, 8;;
+	fc.i r17
+	br.ctop.sptk.few 1b
+	br.sptk.few .loop
+	;;
+
+.end_loop:
+	sync.i			// for fc.i
+	;;
+	srlz.i
+	;;
+	srlz.d
+	;;
+	br.call.sptk.many b0¶;;
+
+.align  32
+memory_stack:
+	.fill           8192, 1, 0
+memory_stack_end:
+register_stack:
+	.fill           8192, 1, 0
+register_stack_end:
+relocate_new_kernel_end:
+END(relocate_new_kernel)
+
+GLOBAL_ENTRY(kexec_fake_sal_rendez)
+	.prologue
+	alloc r31=ar.pfs,3,0,0,0
+	.body
+.rendez_entry:
+	rsm	psr.i | psr.ic
+	mov r25=ip
+	;;
+	{
+		flushrs
+		srlz.i
+	}
+	;;
+       /* See where I am running, and compute gp */
+	{
+		mov     ar.rsc = 0      /* Put RSE in enforce lacy, LE mode */
+		mov     gp = ip         /* gp = relocate_new_kernel */
+	}
+
+	movl r8=0x00000100000000
+	;;
+	mov cr.iva=r8
+	/* Transition from virtual to physical mode */
+	srlz.i
+	;;
+	add	r17_-.rendez_entry, r25
+	movl	r16=(IA64_PSR_AC | IA64_PSR_BN | IA64_PSR_IC | IA64_PSR_MFL)
+	;;
+	tpa	r17=r17
+	mov	cr.ipsr=r16
+	;;
+	mov	cr.iip=r17
+	mov	cr.ifs=r0
+	;;
+	rfi
+	;;
+5:
+	mov     b6=in0			/* _start addr */
+	mov	r8=in1			/* ap_wakeup_vector */
+	mov	r26=in2			/* PAL addr */
+	;;
+	/* Purge kernel TRs */
+	movl	r16=KERNEL_START
+	mov	r18=KERNEL_TR_PAGE_SHIFT<<2
+	;;
+	ptr.i	r16,r18
+	ptr.d	r16,r18
+	;;
+	srlz.i
+	;;
+	srlz.d
+	;;
+	/* Purge percpu TR */
+	movl	r16=PERCPU_ADDR
+	mov	r18=PERCPU_PAGE_SHIFT<<2
+	;;
+	ptr.d	r16,r18
+	;;
+	srlz.d
+	;;
+	/* Purge PAL TR */
+	mov	r18=IA64_GRANULE_SHIFT<<2
+	;;
+	ptr.i	r26,r18
+	;;
+	srlz.i
+	;;
+	/* Purge stack TR */
+	mov	r16=IA64_KR(CURRENT_STACK)
+	;;
+	shl	r16=r16,IA64_GRANULE_SHIFT
+	movl	r19=PAGE_OFFSET
+	;;
+	add	r16=r19,r16
+	mov	r18=IA64_GRANULE_SHIFT<<2
+	;;
+	ptr.d	r16,r18
+	;;
+	srlz.i
+	;;
+
+	/* Ensure we can read and clear external interrupts */
+	mov	cr.tpr=r0
+	srlz.d
+
+	shr.u	r9=r8,6			/* which irr */
+	;;
+	and	r8c,r8		/* bit offset into irr */
+	;;
+	mov	r10=1;;
+	;;
+	shl	r10=r10,r8		/* bit mask off irr we want */
+	cmp.eq	p6,p0=0,r9
+	;;
+(p6)	br.cond.sptk.few        check_irr0
+	cmp.eq	p7,p0=1,r9
+	;;
+(p7)	br.cond.sptk.few        check_irr1
+	cmp.eq	p8,p0=2,r9
+	;;
+(p8)	br.cond.sptk.few        check_irr2
+	cmp.eq	p9,p0=3,r9
+	;;
+(p9)	br.cond.sptk.few        check_irr3
+
+check_irr0:
+	mov	r8=cr.irr0
+	;;
+	and	r8=r8,r10
+	;;
+	cmp.eq	p6,p0=0,r8
+(p6)	br.cond.sptk.few	check_irr0
+	br.few	call_start
+
+check_irr1:
+	mov	r8=cr.irr1
+	;;
+	and	r8=r8,r10
+	;;
+	cmp.eq	p6,p0=0,r8
+(p6)	br.cond.sptk.few	check_irr1
+	br.few	call_start
+
+check_irr2:
+	mov	r8=cr.irr2
+	;;
+	and	r8=r8,r10
+	;;
+	cmp.eq	p6,p0=0,r8
+(p6)	br.cond.sptk.few	check_irr2
+	br.few	call_start
+
+check_irr3:
+	mov	r8=cr.irr3
+	;;
+	and	r8=r8,r10
+	;;
+	cmp.eq	p6,p0=0,r8
+(p6)	br.cond.sptk.few	check_irr3
+	br.few	call_start
+
+call_start:
+	mov	cr.eoi=r0
+	;;
+	srlz.d
+	;;
+	mov	r8=cr.ivr
+	;;
+	srlz.d
+	;;
+	cmp.eq	p0,p6\x15,r8
+(p6)	br.cond.sptk.few	call_start
+	br.sptk.few		b6
+kexec_fake_sal_rendez_end:
+END(kexec_fake_sal_rendez)
+
+	.global relocate_new_kernel_size
+relocate_new_kernel_size:
+	data8	kexec_fake_sal_rendez_end - relocate_new_kernel
+
+GLOBAL_ENTRY(ia64_dump_cpu_regs)
+        .prologue
+        alloc loc0=ar.pfs,1,2,0,0
+        .body
+        mov     ar.rsc=0                // put RSE in enforced lazy mode
+        add     loc1=4*8, in0           // save r4 and r5 first
+        ;;
+{
+        flushrs                         // flush dirty regs to backing store
+        srlz.i
+}
+        st8 [loc1]=r4, 8
+        ;;
+        st8 [loc1]=r5, 8
+        ;;
+        add loc12*8, in0
+        mov r4=ar.rnat
+        ;;
+        st8 [in0]=r0, 8			// r0
+        st8 [loc1]=r4, 8		// rnat
+        mov r5=pr
+        ;;
+        st8 [in0]=r1, 8			// r1
+        st8 [loc1]=r5, 8		// pr
+        mov r4°
+        ;;
+        st8 [in0]=r2, 8			// r2
+        st8 [loc1]=r4, 8		// b0
+        mov r5±;
+        ;;
+        st8 [in0]=r3, 24		// r3
+        st8 [loc1]=r5, 8		// b1
+        mov r4²
+        ;;
+        st8 [in0]=r6, 8			// r6
+        st8 [loc1]=r4, 8		// b2
+	mov r5³
+        ;;
+        st8 [in0]=r7, 8			// r7
+        st8 [loc1]=r5, 8		// b3
+        mov r4´
+        ;;
+        st8 [in0]=r8, 8			// r8
+        st8 [loc1]=r4, 8		// b4
+        mov r5µ
+        ;;
+        st8 [in0]=r9, 8			// r9
+        st8 [loc1]=r5, 8		// b5
+        mov r4¶
+        ;;
+        st8 [in0]=r10, 8		// r10
+        st8 [loc1]=r5, 8		// b6
+        mov r5·
+        ;;
+        st8 [in0]=r11, 8		// r11
+        st8 [loc1]=r5, 8		// b7
+        mov r4°
+        ;;
+        st8 [in0]=r12, 8		// r12
+        st8 [loc1]=r4, 8		// ip
+        mov r5=loc0
+	;;
+        st8 [in0]=r13, 8		// r13
+        extr.u r5=r5, 0, 38		// ar.pfs.pfm
+	mov r4=r0			// user mask
+        ;;
+        st8 [in0]=r14, 8		// r14
+        st8 [loc1]=r5, 8		// cfm
+        ;;
+        st8 [in0]=r15, 8		// r15
+        st8 [loc1]=r4, 8        	// user mask
+	mov r5=ar.rsc
+        ;;
+        st8 [in0]=r16, 8		// r16
+        st8 [loc1]=r5, 8        	// ar.rsc
+        mov r4=ar.bsp
+        ;;
+        st8 [in0]=r17, 8		// r17
+        st8 [loc1]=r4, 8        	// ar.bsp
+        mov r5=ar.bspstore
+        ;;
+        st8 [in0]=r18, 8		// r18
+        st8 [loc1]=r5, 8        	// ar.bspstore
+        mov r4=ar.rnat
+        ;;
+        st8 [in0]=r19, 8		// r19
+        st8 [loc1]=r4, 8        	// ar.rnat
+        mov r5=ar.ccv
+        ;;
+        st8 [in0]=r20, 8		// r20
+	st8 [loc1]=r5, 8        	// ar.ccv
+        mov r4=ar.unat
+        ;;
+        st8 [in0]=r21, 8		// r21
+        st8 [loc1]=r4, 8        	// ar.unat
+        mov r5 = ar.fpsr
+        ;;
+        st8 [in0]=r22, 8		// r22
+        st8 [loc1]=r5, 8        	// ar.fpsr
+        mov r4 = ar.unat
+        ;;
+        st8 [in0]=r23, 8		// r23
+        st8 [loc1]=r4, 8        	// unat
+        mov r5 = ar.fpsr
+        ;;
+        st8 [in0]=r24, 8		// r24
+        st8 [loc1]=r5, 8        	// fpsr
+        mov r4 = ar.pfs
+        ;;
+        st8 [in0]=r25, 8		// r25
+        st8 [loc1]=r4, 8        	// ar.pfs
+        mov r5 = ar.lc
+        ;;
+        st8 [in0]=r26, 8		// r26
+        st8 [loc1]=r5, 8        	// ar.lc
+        mov r4 = ar.ec
+        ;;
+        st8 [in0]=r27, 8		// r27
+        st8 [loc1]=r4, 8        	// ar.ec
+        mov r5 = ar.csd
+        ;;
+        st8 [in0]=r28, 8		// r28
+        st8 [loc1]=r5, 8        	// ar.csd
+        mov r4 = ar.ssd
+        ;;
+        st8 [in0]=r29, 8		// r29
+        st8 [loc1]=r4, 8        	// ar.ssd
+        ;;
+        st8 [in0]=r30, 8		// r30
+        ;;
+	st8 [in0]=r31, 8		// r31
+        mov ar.pfs=loc0
+        ;;
+        br.ret.sptk.many rp
+END(ia64_dump_cpu_regs)
+
+
diff -Nraup a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c
--- a/arch/ia64/kernel/setup.c	2006-08-15 05:52:14.000000000 +0800
+++ b/arch/ia64/kernel/setup.c	2006-08-15 09:50:03.000000000 +0800
@@ -43,6 +43,8 @@
 #include <linux/initrd.h>
 #include <linux/pm.h>
 #include <linux/cpufreq.h>
+#include <linux/kexec.h>
+#include <linux/crash_dump.h>
 
 #include <asm/ia32.h>
 #include <asm/machvec.h>
@@ -250,6 +252,41 @@ reserve_memory (void)
 	}
 #endif
 
+#ifdef CONFIG_KEXEC
+	/* crashkernel=size@addr specifies the location to reserve for
+	 * a crash kernel.  By reserving this memory we guarantee
+	 * that linux never set's it up as a DMA target.
+	 * Useful for holding code to do something appropriate
+	 * after a kernel panic.
+	 */
+	{
+		char *from = strstr(saved_command_line, "crashkernel=");
+		if (from) {
+			unsigned long size, base;
+			size = memparse(from + 12, &from);
+			if (*from = '@') {
+				base = memparse(from + 1, &from);
+				rsvd_region[n].start +					(unsigned long)__va(base);
+				rsvd_region[n].end +					(unsigned long)__va(base + size);
+				crashk_res.start = base;
+				crashk_res.end = base + size - 1;
+				n++;
+			}
+		}
+		efi_memmap_res.start = ia64_boot_param->efi_memmap;
+                efi_memmap_res.end = efi_memmap_res.start +
+                        ia64_boot_param->efi_memmap_size;
+                printk("efi_memmap start %lx %lx\n",
+                        efi_memmap_res.start,
+                        efi_memmap_res.end);
+                boot_param_res.start = __pa(ia64_boot_param);
+                boot_param_res.end = boot_param_res.start +
+                        sizeof(*ia64_boot_param);
+	}
+#endif
+
 	efi_memmap_init(&rsvd_region[n].start, &rsvd_region[n].end);
 	n++;
 
@@ -484,6 +521,16 @@ setup_arch (char **cmdline_p)
 	if (!nomca)
 		ia64_mca_init();
 
+#ifdef CONFIG_CRASH_DUMP
+	{
+		char *from = strstr(saved_command_line, "elfcorehdr=");
+
+		if (from)
+			elfcorehdr_addr = memparse(from+11, &from);
+		saved_max_pfn = (unsigned long) -1;
+	}
+#endif
+
 	platform_setup(cmdline_p);
 	paging_init();
 }
diff -Nraup a/arch/ia64/kernel/smp.c b/arch/ia64/kernel/smp.c
--- a/arch/ia64/kernel/smp.c	2006-06-18 09:49:35.000000000 +0800
+++ b/arch/ia64/kernel/smp.c	2006-08-15 10:12:17.000000000 +0800
@@ -30,6 +30,7 @@
 #include <linux/delay.h>
 #include <linux/efi.h>
 #include <linux/bitops.h>
+#include <linux/kexec.h>
 
 #include <asm/atomic.h>
 #include <asm/current.h>
@@ -66,6 +67,7 @@ static volatile struct call_data_struct 
 
 #define IPI_CALL_FUNC		0
 #define IPI_CPU_STOP		1
+#define IPI_KDUMP_CPU_STOP	3
 
 /* This needs to be cacheline aligned because it is written to by *other* CPUs.  */
 static DEFINE_PER_CPU(u64, ipi_operation) ____cacheline_aligned;
@@ -84,6 +86,34 @@ unlock_ipi_calllock(void)
 	spin_unlock_irq(&call_lock);
 }
 
+#ifdef CONFIG_KEXEC
+/*
+ * Stop the CPU and put it in fake SAL rendezvous. This allows CPU to wake
+ * up with IPI from boot processor
+ */
+void
+kexec_stop_this_cpu (void *func)
+{
+	unsigned long pta, impl_va_bits, pal_base;
+
+	/*
+	 * Remove this CPU by putting it into fake SAL rendezvous
+	 */
+	cpu_clear(smp_processor_id(), cpu_online_map);
+	max_xtp();
+	ia64_eoi();
+
+	/* Disable VHPT */
+	impl_va_bits = ffz(~(local_cpu_data->unimpl_va_mask | (7UL << 61)));
+	pta = POW2(61) - POW2(vmlpt_bits);
+	ia64_set_pta(pta | (0 << 8) | (vmlpt_bits << 2) | 0);
+
+	local_irq_disable();
+	pal_base = __get_cpu_var(ia64_mca_pal_base);
+	kexec_fake_sal_rendez(func, ap_wakeup_vector, pal_base);
+}
+#endif
+
 static void
 stop_this_cpu (void)
 {
@@ -155,7 +185,15 @@ handle_IPI (int irq, void *dev_id, struc
 			      case IPI_CPU_STOP:
 				stop_this_cpu();
 				break;
-
+#ifdef CONFIG_CRASH_DUMP
+			      case IPI_KDUMP_CPU_STOP:
+				{
+					local_irq_disable();
+					crash_save_this_cpu();
+					cpu_halt();
+				}
+				break;
+#endif
 			      default:
 				printk(KERN_CRIT "Unknown IPI on CPU %d: %lu\n", this_cpu, which);
 				break;
@@ -371,6 +409,13 @@ smp_send_stop (void)
 {
 	send_IPI_allbutself(IPI_CPU_STOP);
 }
+#ifdef CONFIG_CRASH_DUMP
+void
+kdump_smp_send_stop()
+{
+ 	send_IPI_allbutself(IPI_KDUMP_CPU_STOP);
+}
+#endif
 
 int __init
 setup_profiling_timer (unsigned int multiplier)
diff -Nraup a/include/asm-ia64/kexec.h b/include/asm-ia64/kexec.h
--- a/include/asm-ia64/kexec.h	1970-01-01 08:00:00.000000000 +0800
+++ b/include/asm-ia64/kexec.h	2006-08-15 09:50:03.000000000 +0800
@@ -0,0 +1,38 @@
+#ifndef _ASM_IA64_KEXEC_H
+#define _ASM_IA64_KEXEC_H
+
+
+/* Maximum physical address we can use pages from */
+#define KEXEC_SOURCE_MEMORY_LIMIT (-1UL)
+/* Maximum address we can reach in physical address mode */
+#define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL)
+/* Maximum address we can use for the control code buffer */
+#define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE
+
+#define KEXEC_CONTROL_CODE_SIZE (8192 + 8192 + 4096)
+
+/* The native architecture */
+#define KEXEC_ARCH KEXEC_ARCH_IA_64
+
+#define MAX_NOTE_BYTES 1024
+
+#define pte_bits	3
+#define vmlpt_bits	(impl_va_bits - PAGE_SHIFT + pte_bits)
+#define POW2(n)		(1ULL << (n))
+
+DECLARE_PER_CPU(u64, ia64_mca_pal_base);
+const extern unsigned int relocate_new_kernel_size;
+volatile extern long kexec_rendez;
+extern void relocate_new_kernel(unsigned long, unsigned long,
+		struct ia64_boot_param *, unsigned long);
+extern void kexec_fake_sal_rendez(void *start, unsigned long wake_up,
+		unsigned long pal_base);
+static inline void
+crash_setup_regs(struct pt_regs *newregs, struct pt_regs *oldregs)
+{
+}
+extern struct resource efi_memmap_res;
+extern struct resource boot_param_res;
+extern void kdump_smp_send_stop(void);
+extern void crash_save_this_cpu(void);
+#endif /* _ASM_IA64_KEXEC_H */
diff -Nraup a/include/asm-ia64/machvec_hpzx1.h b/include/asm-ia64/machvec_hpzx1.h
--- a/include/asm-ia64/machvec_hpzx1.h	2006-06-18 09:49:35.000000000 +0800
+++ b/include/asm-ia64/machvec_hpzx1.h	2006-08-15 09:50:03.000000000 +0800
@@ -34,4 +34,6 @@ extern ia64_mv_dma_mapping_error	sba_dma
 #define platform_dma_supported			sba_dma_supported
 #define platform_dma_mapping_error		sba_dma_mapping_error
 
+extern void ioc_iova_disable(void);
+
 #endif /* _ASM_IA64_MACHVEC_HPZX1_h */
diff -Nraup a/include/asm-ia64/meminit.h b/include/asm-ia64/meminit.h
--- a/include/asm-ia64/meminit.h	2006-08-15 05:52:24.000000000 +0800
+++ b/include/asm-ia64/meminit.h	2006-08-15 09:50:03.000000000 +0800
@@ -15,11 +15,12 @@
  * 	- initrd (optional)
  * 	- command line string
  * 	- kernel code & data
+ * 	- crash dumping code reserved region
  * 	- Kernel memory map built from EFI memory map
  *
  * More could be added if necessary
  */
-#define IA64_MAX_RSVD_REGIONS 6
+#define IA64_MAX_RSVD_REGIONS 7
 
 struct rsvd_region {
 	unsigned long start;	/* virtual address of beginning of element */
diff -Nraup a/include/asm-ia64/smp.h b/include/asm-ia64/smp.h
--- a/include/asm-ia64/smp.h	2006-08-15 05:52:24.000000000 +0800
+++ b/include/asm-ia64/smp.h	2006-08-15 09:50:03.000000000 +0800
@@ -128,6 +128,9 @@ extern void smp_send_reschedule (int cpu
 extern void lock_ipi_calllock(void);
 extern void unlock_ipi_calllock(void);
 extern void identify_siblings (struct cpuinfo_ia64 *);
+#ifdef CONFIG_KEXEC
+extern void kexec_stop_this_cpu(void *);
+#endif
 
 #else
 
diff -Nraup a/kernel/irq/manage.c b/kernel/irq/manage.c
--- a/kernel/irq/manage.c	2006-08-15 05:52:24.000000000 +0800
+++ b/kernel/irq/manage.c	2006-08-15 09:50:03.000000000 +0800
@@ -475,4 +475,3 @@ int request_irq(unsigned int irq,
 	return retval;
 }
 EXPORT_SYMBOL(request_irq);
-










^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: IA64 Kexec-Kdump kernel patch
  2006-08-14  6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai
@ 2006-08-14 21:24 ` Bob Montgomery
  2006-08-15  0:47 ` Zou Nan hai
                   ` (15 subsequent siblings)
  16 siblings, 0 replies; 18+ messages in thread
From: Bob Montgomery @ 2006-08-14 21:24 UTC (permalink / raw)
  To: linux-ia64

On Mon, 2006-08-14 at 14:47 +0800, Zou Nan hai wrote:
> This patch is the kexec-kdump patch re-based to 2.6.18-rc4 kernel.

Contrary to expectations, my experience with this patch on a 2.6.18-rc4
kernel is that kexec -l, kexec -e is now working without my adding any
delays to mptscsih, and the kexec -p, echo c >/proc/sysrq-trigger case
hangs.

My "got here" printk's on the console indicate:

SysRq : Trigger a crashdump
machine_crash_shutdown
device_shootdown
machine_kexec type: 1

And then it hangs.

My test system: hp A6870A server rx2600
From /proc/iomem:
04a1f000-3f5e3fff : System RAM
  10000000-17ffffff : Crash kernel

# cat /proc/cmdline
BOOT_IMAGE=scsi0:/EFI/debian/boot/vmlinuz-2.6.18-rc4-bobm root=/dev/sda4
raid=noautodetect crashkernel\x128M@256M panic=1 ro

relevant CONFIG settings (from /proc/config.gz)

CONFIG_HOTPLUG=y
CONFIG_IA64_HP_ZX1=y
# CONFIG_IA64_HP_ZX1_SWIOTLB is not set
CONFIG_HOTPLUG_CPU=y
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
# CONFIG_SPARSEMEM_MANUAL is not set
# CONFIG_SPARSEMEM_STATIC is not set
CONFIG_ARCH_SPARSEMEM_ENABLE=y
CONFIG_KEXEC=y
CONFIG_CRASH_DUMP=y
CONFIG_ACPI_HOTPLUG_CPU=y
# CONFIG_HOTPLUG_PCI is not set
CONFIG_AGP_HP_ZX1=y
CONFIG_PROC_VMCORE=y

Bob Montgomery


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: IA64 Kexec-Kdump kernel patch
  2006-08-14  6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai
  2006-08-14 21:24 ` Bob Montgomery
@ 2006-08-15  0:47 ` Zou Nan hai
  2006-08-15  1:56 ` Jay Lan
                   ` (14 subsequent siblings)
  16 siblings, 0 replies; 18+ messages in thread
From: Zou Nan hai @ 2006-08-15  0:47 UTC (permalink / raw)
  To: linux-ia64

On Tue, 2006-08-15 at 09:56, Jay Lan wrote:
> Bob Montgomery wrote:
> > On Mon, 2006-08-14 at 14:47 +0800, Zou Nan hai wrote:
> > 
> >>This patch is the kexec-kdump patch re-based to 2.6.18-rc4 kernel.
> > 
> > 

> ...
  Jay,  
  	Thanks very much, please try the following updated patch which
simplify the device_shootdown code.


  Signed-off-by: Zou Nan hai <nanhai.zou@intel.com>

  diff -Nraup linux-2.6.18-rc4/arch/ia64/hp/common/sba_iommu.c linux-2.6.18-rc4-kdump/arch/ia64/hp/common/sba_iommu.c
--- linux-2.6.18-rc4/arch/ia64/hp/common/sba_iommu.c	2006-08-16 05:06:57.000000000 +0800
+++ linux-2.6.18-rc4-kdump/arch/ia64/hp/common/sba_iommu.c	2006-08-16 05:10:10.000000000 +0800
@@ -1623,6 +1623,28 @@ ioc_iova_init(struct ioc *ioc)
 	READ_REG(ioc->ioc_hpa + IOC_IBASE);
 }
 
+#ifdef CONFIG_KEXEC
+void
+ioc_iova_disable(void)
+{
+	struct ioc *ioc;
+
+	ioc = ioc_list;
+
+	while (ioc != NULL) {
+		/* Disable IOVA translation */
+		WRITE_REG(ioc->ibase & 0xfffffffffffffffe, ioc->ioc_hpa + IOC_IBASE);
+		READ_REG(ioc->ioc_hpa + IOC_IBASE);
+
+		/* Clear I/O TLB of any possible entries */
+		WRITE_REG(ioc->ibase | (get_iovp_order(ioc->iov_size) + iovp_shift), ioc->ioc_hpa + IOC_PCOM);
+		READ_REG(ioc->ioc_hpa + IOC_PCOM);
+
+		ioc = ioc->next;
+	}
+}
+#endif
+
 static void __init
 ioc_resource_init(struct ioc *ioc)
 {
diff -Nraup linux-2.6.18-rc4/arch/ia64/Kconfig linux-2.6.18-rc4-kdump/arch/ia64/Kconfig
--- linux-2.6.18-rc4/arch/ia64/Kconfig	2006-08-16 05:06:57.000000000 +0800
+++ linux-2.6.18-rc4-kdump/arch/ia64/Kconfig	2006-08-16 05:10:10.000000000 +0800
@@ -427,6 +427,29 @@ config SGI_SN
 
 source "drivers/sn/Kconfig"
 
+config KEXEC
+	bool "kexec system call (EXPERIMENTAL)"
+	depends on EXPERIMENTAL
+	help
+	  kexec is a system call that implements the ability to shutdown your
+	  current kernel, and to start another kernel.  It is like a reboot
+	  but it is indepedent of the system firmware.   And like a reboot
+	  you can start any kernel with it, not just Linux.
+
+	  The name comes from the similiarity to the exec system call.
+
+	  It is an ongoing process to be certain the hardware in a machine
+	  is properly shutdown, so do not be surprised if this code does not
+	  initially work for you.  It may help to enable device hotplugging
+	  support.  As of this writing the exact hardware interface is
+	  strongly in flux, so no good recommendation can be made.
+
+config CRASH_DUMP
+	  bool "kernel crash dumps (EXPERIMENTAL)"
+	  depends on EXPERIMENTAL
+	  help
+	    Generate crash dump after being started by kexec.
+
 source "drivers/firmware/Kconfig"
 
 source "fs/Kconfig.binfmt"
diff -Nraup linux-2.6.18-rc4/arch/ia64/kernel/crash.c linux-2.6.18-rc4-kdump/arch/ia64/kernel/crash.c
--- linux-2.6.18-rc4/arch/ia64/kernel/crash.c	1970-01-01 08:00:00.000000000 +0800
+++ linux-2.6.18-rc4-kdump/arch/ia64/kernel/crash.c	2006-08-16 05:10:37.000000000 +0800
@@ -0,0 +1,125 @@
+/*
+ * arch/ia64/kernel/crash.c
+ *
+ * Architecture specific (ia64) functions for kexec based crash dumps.
+ *
+ * Created by: Khalid Aziz <khalid.aziz@hp.com>
+ * Copyright (C) 2005 Hewlett-Packard Development Company, L.P.
+ * Copyright (C) 2005 Intel Corp	Zou Nan hai <nanhai.zou@intel.com>
+ *
+ */
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/smp.h>
+#include <linux/irq.h>
+#include <linux/pci.h>
+#include <linux/reboot.h>
+#include <linux/kexec.h>
+#include <linux/irq.h>
+#include <linux/delay.h>
+#include <linux/elf.h>
+#include <linux/elfcore.h>
+#include <linux/device.h>
+#include <asm/uaccess.h>
+
+size_t copy_oldmem_page(unsigned long pfn, char *buf,
+                               size_t csize, unsigned long offset, int userbuf)
+{
+        void  *vaddr;
+
+        if (!csize)
+                return 0;
+        vaddr = page_address(pfn_to_page(pfn));
+
+        if (userbuf) {
+                if (copy_to_user(buf, (vaddr + offset), csize)) {
+                        return -EFAULT;
+                }
+        } else
+                memcpy(buf, (vaddr + offset), csize);
+        return csize;
+}
+
+static void device_shootdown(void)
+{
+	irq_desc_t *idesc;
+	int irq;
+	for (irq = 0; irq < NR_IRQS; irq++) {
+		idesc = irq_desc + irq;
+		if (idesc)
+			kdump_disable_irq(irq);
+	}
+#ifdef CONFIG_IA64_HP_ZX1
+	ioc_iova_disable();
+#endif
+}
+
+static inline Elf64_Word
+*append_elf_note(Elf64_Word *buf, char *name, unsigned type, void *data,
+		size_t data_len)
+{
+	struct elf_note *note = (struct elf_note *)buf;
+	note->n_namesz = strlen(name) + 1;
+	note->n_descsz = data_len;
+	note->n_type   = type;
+	buf += (sizeof(*note) + 3)/4;
+	memcpy(buf, name, note->n_namesz);
+	buf += (note->n_namesz + 3)/4;
+	memcpy(buf, data, data_len);
+	buf += (data_len + 3)/4;
+	return buf;
+}
+
+static void
+final_note(void *buf)
+{
+	memset(buf, 0, sizeof(struct elf_note));
+}
+
+extern void ia64_dump_cpu_regs(void *);
+
+void
+crash_save_this_cpu()
+{
+	void *buf;
+	struct elf_prstatus prstatus;
+	int cpu = smp_processor_id();
+	unsigned long cfm, sof, sol;
+	elf_greg_t *dst = (elf_greg_t *)&prstatus.pr_reg;
+	memset(&prstatus, 0, sizeof(prstatus));
+	prstatus.pr_pid = current->pid;
+
+	ia64_dump_cpu_regs(dst);
+        cfm = dst[43];
+        sol = (cfm >> 7) & 0x7f;
+        sof = cfm & 0x7f;
+        dst[46] = (unsigned long)ia64_rse_skip_regs((unsigned long *)dst[46],
+                        sof - sol);
+
+        buf = (u64 *) per_cpu_ptr(crash_notes, cpu);
+	if (!buf)
+		return;
+	buf = append_elf_note(buf, "CORE", NT_PRSTATUS, &prstatus,
+		sizeof(prstatus));
+	final_note(buf);
+}
+
+void
+machine_crash_shutdown(struct pt_regs *pt)
+{
+	/* This function is only called after the system
+	 * has paniced or is otherwise in a critical state.
+	 * The minimum amount of code to allow a kexec'd kernel
+	 * to run successfully needs to happen here.
+	 *
+	 * In practice this means shooting down the other cpus in
+	 * an SMP system.
+	 */
+	if (in_interrupt())
+		ia64_eoi();
+	device_shootdown();
+#ifdef CONFIG_SMP
+	kdump_smp_send_stop();
+#endif
+}
diff -Nraup linux-2.6.18-rc4/arch/ia64/kernel/efi.c linux-2.6.18-rc4-kdump/arch/ia64/kernel/efi.c
--- linux-2.6.18-rc4/arch/ia64/kernel/efi.c	2006-08-16 05:06:57.000000000 +0800
+++ linux-2.6.18-rc4-kdump/arch/ia64/kernel/efi.c	2006-08-16 05:10:10.000000000 +0800
@@ -26,6 +26,7 @@
 #include <linux/types.h>
 #include <linux/time.h>
 #include <linux/efi.h>
+#include <linux/kexec.h>
 
 #include <asm/io.h>
 #include <asm/kregs.h>
@@ -41,7 +42,7 @@ extern efi_status_t efi_call_phys (void 
 struct efi efi;
 EXPORT_SYMBOL(efi);
 static efi_runtime_services_t *runtime;
-static unsigned long mem_limit = ~0UL, max_addr = ~0UL;
+static unsigned long mem_limit = ~0UL, max_addr = ~0UL, min_addr = 0UL;
 
 #define efi_call_virt(f, args...)	(*(f))(args)
 
@@ -421,6 +422,8 @@ efi_init (void)
 			mem_limit = memparse(cp + 4, &cp);
 		} else if (memcmp(cp, "max_addr=", 9) = 0) {
 			max_addr = GRANULEROUNDDOWN(memparse(cp + 9, &cp));
+		} else if (memcmp(cp, "min_addr=", 9) = 0) {
+			min_addr = GRANULEROUNDDOWN(memparse(cp + 9, &cp));
 		} else {
 			while (*cp != ' ' && *cp)
 				++cp;
@@ -428,6 +431,8 @@ efi_init (void)
 				++cp;
 		}
 	}
+	if (min_addr != 0UL)
+		printk(KERN_INFO "Ignoring memory below %luMB\n", min_addr >> 20);
 	if (max_addr != ~0UL)
 		printk(KERN_INFO "Ignoring memory above %luMB\n", max_addr >> 20);
 
@@ -894,7 +899,8 @@ find_memmap_space (void)
 		as = max(contig_low, md->phys_addr);
 		ae = min(contig_high, efi_md_end(md));
 
-		/* keep within max_addr= command line arg */
+		/* keep within max_addr= and min_addr= command line arg */
+		as = max(as, min_addr);
 		ae = min(ae, max_addr);
 		if (ae <= as)
 			continue;
@@ -1004,7 +1010,8 @@ efi_memmap_init(unsigned long *s, unsign
 		} else
 			ae = efi_md_end(md);
 
-		/* keep within max_addr= command line arg */
+		/* keep within max_addr= and min_addr= command line arg */
+		as = max(as, min_addr);
 		ae = min(ae, max_addr);
 		if (ae <= as)
 			continue;
@@ -1116,6 +1123,12 @@ efi_initialize_iomem_resources(struct re
 			 */
 			insert_resource(res, code_resource);
 			insert_resource(res, data_resource);
+#ifdef CONFIG_KEXEC
+                        insert_resource(res, &efi_memmap_res);
+                        insert_resource(res, &boot_param_res);
+			if (crashk_res.end > crashk_res.start)
+				insert_resource(res, &crashk_res);
+#endif
 		}
 	}
 }
diff -Nraup linux-2.6.18-rc4/arch/ia64/kernel/entry.S linux-2.6.18-rc4-kdump/arch/ia64/kernel/entry.S
--- linux-2.6.18-rc4/arch/ia64/kernel/entry.S	2006-08-16 05:06:57.000000000 +0800
+++ linux-2.6.18-rc4-kdump/arch/ia64/kernel/entry.S	2006-08-16 05:10:10.000000000 +0800
@@ -1575,7 +1575,7 @@ sys_call_table:
 	data8 sys_mq_timedreceive		// 1265
 	data8 sys_mq_notify
 	data8 sys_mq_getsetattr
-	data8 sys_ni_syscall			// reserved for kexec_load
+	data8 sys_kexec_load
 	data8 sys_ni_syscall			// reserved for vserver
 	data8 sys_waitid			// 1270
 	data8 sys_add_key
diff -Nraup linux-2.6.18-rc4/arch/ia64/kernel/iosapic.c linux-2.6.18-rc4-kdump/arch/ia64/kernel/iosapic.c
--- linux-2.6.18-rc4/arch/ia64/kernel/iosapic.c	2006-08-16 05:06:57.000000000 +0800
+++ linux-2.6.18-rc4-kdump/arch/ia64/kernel/iosapic.c	2006-08-16 05:10:27.000000000 +0800
@@ -288,6 +288,24 @@ nop (unsigned int irq)
 	/* do nothing... */
 }
 
+#ifdef CONFIG_CRASH_DUMP
+void
+kdump_disable_irq(unsigned int irq)
+{
+	u32 low32;
+	ia64_vector vec = irq_to_vector(irq);
+	struct iosapic_rte_info *rte;
+
+	low32 = iosapic_intr_info[vec].low32 |= IOSAPIC_MASK;
+	list_for_each_entry(rte, &iosapic_intr_info[vec].rtes,
+			rte_list) {
+			iosapic_write(rte->addr,
+					IOSAPIC_RTE_LOW(rte->rte_index), low32);
+			iosapic_eoi(rte->addr, vec);
+	}
+}
+#endif
+
 static void
 mask_irq (unsigned int irq)
 {
diff -Nraup linux-2.6.18-rc4/arch/ia64/kernel/machine_kexec.c linux-2.6.18-rc4-kdump/arch/ia64/kernel/machine_kexec.c
--- linux-2.6.18-rc4/arch/ia64/kernel/machine_kexec.c	1970-01-01 08:00:00.000000000 +0800
+++ linux-2.6.18-rc4-kdump/arch/ia64/kernel/machine_kexec.c	2006-08-16 05:10:10.000000000 +0800
@@ -0,0 +1,131 @@
+/*
+ * arch/ia64/kernel/machine_kexec.c
+ *
+ * Handle transition of Linux booting another kernel
+ * Copyright (C) 2005 Hewlett-Packard Development Comapny, L.P.
+ * Copyright (C) 2005 Khalid Aziz <khalid.aziz@hp.com>
+ * Copyright (C) 2006 Intel Corp, Zou Nan hai <nanhai.zou@intel.com>
+ *
+ * This source code is licensed under the GNU General Public License,
+ * Version 2.  See the file COPYING for more details.
+ */
+
+#include <linux/kernel.h>
+#include <linux/config.h>
+#include <linux/mm.h>
+#include <linux/kexec.h>
+#include <linux/pci.h>
+#include <linux/cpu.h>
+#include <asm/mmu_context.h>
+#include <asm/setup.h>
+#include <asm/mca.h>
+#include <asm/page.h>
+#include <asm/bitops.h>
+#include <asm/tlbflush.h>
+#include <asm/delay.h>
+#include <asm/meminit.h>
+
+typedef void (*relocate_new_kernel_t)(unsigned long, unsigned long,
+		struct ia64_boot_param *, unsigned long);
+static struct kimage *ia64_kimage;
+struct resource efi_memmap_res = {
+        .name  = "EFI Memory Map",
+        .start = 0,
+        .end   = 0,
+        .flags = IORESOURCE_BUSY | IORESOURCE_MEM
+};
+
+struct resource boot_param_res = {
+        .name  = "Boot parameter",
+        .start = 0,
+        .end   = 0,
+        .flags = IORESOURCE_BUSY | IORESOURCE_MEM
+};
+
+
+/*
+ * Do what every setup is needed on image and the
+ * reboot code buffer to allow us to avoid allocations
+ * later.
+ */
+int machine_kexec_prepare(struct kimage *image)
+{
+	void *control_code_buffer;
+	const unsigned long *func;
+
+	func = (unsigned long *)&relocate_new_kernel;
+	/* Pre-load control code buffer to minimize work in kexec path */
+	control_code_buffer = page_address(image->control_code_page);
+	memcpy((void *)control_code_buffer, (const void *)func[0],
+			relocate_new_kernel_size);
+	flush_icache_range((unsigned long)control_code_buffer,
+			(unsigned long)control_code_buffer + relocate_new_kernel_size);
+	ia64_kimage = image;
+
+	return 0;
+}
+
+void machine_kexec_cleanup(struct kimage *image)
+{
+}
+
+void machine_shutdown(void)
+{
+#ifdef CONFIG_HOTPLUG_CPU
+	{
+		int cpu;
+
+		for_each_online_cpu(cpu) {
+			if (cpu != smp_processor_id())
+				cpu_down(cpu);
+		}
+	}
+#elif defined(CONFIG_SMP)
+	smp_call_function(kexec_stop_this_cpu, (void *)ia64_kimage->start, 0, 0);
+#endif
+#ifdef CONFIG_PCI
+	{
+		struct pci_dev *dev = NULL;
+		irq_desc_t *idesc;
+		/* Disable all PCI devices */
+		while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
+			if (!(dev->is_enabled))
+				continue;
+			idesc = irq_desc + dev->irq;
+			if (!idesc||!idesc->chip)
+				continue;
+			disable_irq_nosync(dev->irq);
+			idesc->chip->end(dev->irq);
+			idesc->action = NULL;
+			pci_disable_device(dev);
+		}
+	}
+#endif
+
+
+#ifdef CONFIG_IA64_HP_ZX1
+	ioc_iova_disable();
+#endif
+}
+
+/*
+ * Do not allocate memory (or fail in any way) in machine_kexec().
+ * We are past the point of no return, committed to rebooting now.
+ */
+extern void *efi_get_pal_addr(void);
+void machine_kexec(struct kimage *image)
+{
+	relocate_new_kernel_t rnk;
+	void *pal_addr = efi_get_pal_addr();
+	unsigned long code_addr = (unsigned long)page_address(image->control_code_page);
+	if (image->type = KEXEC_TYPE_CRASH)
+		crash_save_this_cpu();
+	/* Interrupts aren't acceptable while we reboot */
+	ia64_set_itv(1<<16);
+	local_irq_disable();
+	rnk = (relocate_new_kernel_t)&code_addr;
+	(*rnk)(image->head, image->start, ia64_boot_param,
+		     GRANULEROUNDDOWN((unsigned long) pal_addr));
+	BUG();
+	for (;;);
+}
diff -Nraup linux-2.6.18-rc4/arch/ia64/kernel/Makefile linux-2.6.18-rc4-kdump/arch/ia64/kernel/Makefile
--- linux-2.6.18-rc4/arch/ia64/kernel/Makefile	2006-08-16 05:06:57.000000000 +0800
+++ linux-2.6.18-rc4-kdump/arch/ia64/kernel/Makefile	2006-08-16 05:10:10.000000000 +0800
@@ -28,6 +28,7 @@ obj-$(CONFIG_IA64_CYCLONE)	+= cyclone.o
 obj-$(CONFIG_CPU_FREQ)		+= cpufreq/
 obj-$(CONFIG_IA64_MCA_RECOVERY)	+= mca_recovery.o
 obj-$(CONFIG_KPROBES)		+= kprobes.o jprobes.o
+obj-$(CONFIG_KEXEC)		+= machine_kexec.o relocate_kernel.o crash.o
 obj-$(CONFIG_IA64_UNCACHED_ALLOCATOR)	+= uncached.o
 obj-$(CONFIG_AUDIT)		+= audit.o
 mca_recovery-y			+= mca_drv.o mca_drv_asm.o
diff -Nraup linux-2.6.18-rc4/arch/ia64/kernel/relocate_kernel.S linux-2.6.18-rc4-kdump/arch/ia64/kernel/relocate_kernel.S
--- linux-2.6.18-rc4/arch/ia64/kernel/relocate_kernel.S	1970-01-01 08:00:00.000000000 +0800
+++ linux-2.6.18-rc4-kdump/arch/ia64/kernel/relocate_kernel.S	2006-08-16 05:10:10.000000000 +0800
@@ -0,0 +1,490 @@
+/*
+ * arch/ia64/kernel/relocate_kernel.S
+ *
+ * Relocate kexec'able kernel and start it
+ *
+ * Copyright (C) 2005 Hewlett-Packard Development Company, L.P.
+ * Copyright (C) 2005 Khalid Aziz  <khalid.aziz@hp.com>
+ * Copyright (C) 2005 Intel Corp,  Zou Nan hai <nanhai.zou@intel.com>
+ *
+ * This source code is licensed under the GNU General Public License,
+ * Version 2.  See the file COPYING for more details.
+ */
+#include <linux/config.h>
+#include <asm/asmmacro.h>
+#include <asm/kregs.h>
+#include <asm/page.h>
+#include <asm/pgtable.h>
+#include <asm/mca_asm.h>
+
+       /* Must be relocatable PIC code callable as a C function
+        */
+GLOBAL_ENTRY(relocate_new_kernel)
+	.prologue
+	alloc r31=ar.pfs,4,0,0,0
+        .body
+.reloc_entry:
+{
+	rsm psr.i| psr.ic
+	mov r2=ip
+}
+	;;
+{
+        flushrs                         // must be first insn in group
+        srlz.i
+}
+	;;
+	dep r2=0,r2,61,3		//to physical address
+	;;
+	//first switch to physical mode
+	add r3\x1f-.reloc_entry, r2
+	movl r16 = IA64_PSR_AC|IA64_PSR_BN|IA64_PSR_IC
+	mov ar.rsc=0	          	// put RSE in enforced lazy mode
+	;;
+	add sp=(memory_stack_end - 16 - .reloc_entry),r2
+	add r8=(register_stack - .reloc_entry),r2
+	;;
+	mov r18=ar.rnat
+	mov ar.bspstore=r8
+	;;
+        mov cr.ipsr=r16
+        mov cr.iip=r3
+        mov cr.ifs=r0
+	srlz.i
+	;;
+	mov ar.rnat=r18
+	rfi
+	;;
+1:
+	//physical mode code begin
+	mov b6=in1
+	dep r28=0,in2,61,3	//to physical address
+
+	// purge all TC entries
+#define O(member)       IA64_CPUINFO_##member##_OFFSET
+        GET_THIS_PADDR(r2, cpu_info)    // load phys addr of cpu_info into r2
+        ;;
+        addl r17=O(PTCE_STRIDE),r2
+        addl r2=O(PTCE_BASE),r2
+        ;;
+        ld8 r18=[r2],(O(PTCE_COUNT)-O(PTCE_BASE));;    	// r18=ptce_base
+        ld4 r19=[r2],4                                  // r19=ptce_count[0]
+        ld4 r21=[r17],4                                 // r21=ptce_stride[0]
+        ;;
+        ld4 r20=[r2]                                    // r20=ptce_count[1]
+        ld4 r22=[r17]                                   // r22=ptce_stride[1]
+        mov r24=r0
+        ;;
+        adds r20=-1,r20
+        ;;
+#undef O
+2:
+        cmp.ltu p6,p7=r24,r19
+(p7)    br.cond.dpnt.few 4f
+        mov ar.lc=r20
+3:
+        ptc.e r18
+        ;;
+        add r18=r22,r18
+        br.cloop.sptk.few 3b
+        ;;
+        add r18=r21,r18
+        add r24=1,r24
+        ;;
+        br.sptk.few 2b
+4:
+        srlz.i
+        ;;
+	//purge TR entry for kernel text and data
+        movl r16=KERNEL_START
+        mov r18=KERNEL_TR_PAGE_SHIFT<<2
+        ;;
+        ptr.i r16, r18
+        ptr.d r16, r18
+        ;;
+        srlz.i
+        ;;
+
+	// purge TR entry for percpu data
+        movl r16=PERCPU_ADDR
+        mov r18=PERCPU_PAGE_SHIFT<<2
+        ;;
+        ptr.d r16,r18
+        ;;
+        srlz.d
+	;;
+
+        // purge TR entry for pal code
+        mov r16=in3
+        mov r18=IA64_GRANULE_SHIFT<<2
+        ;;
+        ptr.i r16,r18
+        ;;
+        srlz.i
+	;;
+
+        // purge TR entry for stack
+        mov r16=IA64_KR(CURRENT_STACK)
+        ;;
+        shl r16=r16,IA64_GRANULE_SHIFT
+        movl r19=PAGE_OFFSET
+        ;;
+        add r16=r19,r16
+        mov r18=IA64_GRANULE_SHIFT<<2
+        ;;
+        ptr.d r16,r18
+        ;;
+        srlz.i
+	;;
+
+	//copy segments
+	movl r16=PAGE_MASK
+        mov  r30=in0                    // in0 is page_list
+        br.sptk.few .dest_page
+	;;
+.loop:
+	ld8  r30=[in0], 8;;
+.dest_page:
+	tbit.z p0, p6=r30, 0;;    	// 0x1 dest page
+(p6)	and r17=r30, r16
+(p6)	br.cond.sptk.few .loop;;
+
+	tbit.z p0, p6=r30, 1;;		// 0x2 indirect page
+(p6)	and in0=r30, r16
+(p6)	br.cond.sptk.few .loop;;
+
+	tbit.z p0, p6=r30, 2;;		// 0x4 end flag
+(p6)	br.cond.sptk.few .end_loop;;
+
+	tbit.z p6, p0=r30, 3;;		// 0x8 source page
+(p6)	br.cond.sptk.few .loop
+
+	and r18=r30, r16
+
+	// simple copy page, may optimize later
+	movl r14=PAGE_SIZE/8 - 1;;
+	mov ar.lc=r14;;
+1:
+	ld8 r14=[r18], 8;;
+	st8 [r17]=r14, 8;;
+	fc.i r17
+	br.ctop.sptk.few 1b
+	br.sptk.few .loop
+	;;
+
+.end_loop:
+	sync.i			// for fc.i
+	;;
+	srlz.i
+	;;
+	srlz.d
+	;;
+	br.call.sptk.many b0¶;;
+
+.align  32
+memory_stack:
+	.fill           8192, 1, 0
+memory_stack_end:
+register_stack:
+	.fill           8192, 1, 0
+register_stack_end:
+relocate_new_kernel_end:
+END(relocate_new_kernel)
+
+GLOBAL_ENTRY(kexec_fake_sal_rendez)
+	.prologue
+	alloc r31=ar.pfs,3,0,0,0
+	.body
+.rendez_entry:
+	rsm	psr.i | psr.ic
+	mov r25=ip
+	;;
+	{
+		flushrs
+		srlz.i
+	}
+	;;
+       /* See where I am running, and compute gp */
+	{
+		mov     ar.rsc = 0      /* Put RSE in enforce lacy, LE mode */
+		mov     gp = ip         /* gp = relocate_new_kernel */
+	}
+
+	movl r8=0x00000100000000
+	;;
+	mov cr.iva=r8
+	/* Transition from virtual to physical mode */
+	srlz.i
+	;;
+	add	r17_-.rendez_entry, r25
+	movl	r16=(IA64_PSR_AC | IA64_PSR_BN | IA64_PSR_IC | IA64_PSR_MFL)
+	;;
+	tpa	r17=r17
+	mov	cr.ipsr=r16
+	;;
+	mov	cr.iip=r17
+	mov	cr.ifs=r0
+	;;
+	rfi
+	;;
+5:
+	mov     b6=in0			/* _start addr */
+	mov	r8=in1			/* ap_wakeup_vector */
+	mov	r26=in2			/* PAL addr */
+	;;
+	/* Purge kernel TRs */
+	movl	r16=KERNEL_START
+	mov	r18=KERNEL_TR_PAGE_SHIFT<<2
+	;;
+	ptr.i	r16,r18
+	ptr.d	r16,r18
+	;;
+	srlz.i
+	;;
+	srlz.d
+	;;
+	/* Purge percpu TR */
+	movl	r16=PERCPU_ADDR
+	mov	r18=PERCPU_PAGE_SHIFT<<2
+	;;
+	ptr.d	r16,r18
+	;;
+	srlz.d
+	;;
+	/* Purge PAL TR */
+	mov	r18=IA64_GRANULE_SHIFT<<2
+	;;
+	ptr.i	r26,r18
+	;;
+	srlz.i
+	;;
+	/* Purge stack TR */
+	mov	r16=IA64_KR(CURRENT_STACK)
+	;;
+	shl	r16=r16,IA64_GRANULE_SHIFT
+	movl	r19=PAGE_OFFSET
+	;;
+	add	r16=r19,r16
+	mov	r18=IA64_GRANULE_SHIFT<<2
+	;;
+	ptr.d	r16,r18
+	;;
+	srlz.i
+	;;
+
+	/* Ensure we can read and clear external interrupts */
+	mov	cr.tpr=r0
+	srlz.d
+
+	shr.u	r9=r8,6			/* which irr */
+	;;
+	and	r8c,r8		/* bit offset into irr */
+	;;
+	mov	r10=1;;
+	;;
+	shl	r10=r10,r8		/* bit mask off irr we want */
+	cmp.eq	p6,p0=0,r9
+	;;
+(p6)	br.cond.sptk.few        check_irr0
+	cmp.eq	p7,p0=1,r9
+	;;
+(p7)	br.cond.sptk.few        check_irr1
+	cmp.eq	p8,p0=2,r9
+	;;
+(p8)	br.cond.sptk.few        check_irr2
+	cmp.eq	p9,p0=3,r9
+	;;
+(p9)	br.cond.sptk.few        check_irr3
+
+check_irr0:
+	mov	r8=cr.irr0
+	;;
+	and	r8=r8,r10
+	;;
+	cmp.eq	p6,p0=0,r8
+(p6)	br.cond.sptk.few	check_irr0
+	br.few	call_start
+
+check_irr1:
+	mov	r8=cr.irr1
+	;;
+	and	r8=r8,r10
+	;;
+	cmp.eq	p6,p0=0,r8
+(p6)	br.cond.sptk.few	check_irr1
+	br.few	call_start
+
+check_irr2:
+	mov	r8=cr.irr2
+	;;
+	and	r8=r8,r10
+	;;
+	cmp.eq	p6,p0=0,r8
+(p6)	br.cond.sptk.few	check_irr2
+	br.few	call_start
+
+check_irr3:
+	mov	r8=cr.irr3
+	;;
+	and	r8=r8,r10
+	;;
+	cmp.eq	p6,p0=0,r8
+(p6)	br.cond.sptk.few	check_irr3
+	br.few	call_start
+
+call_start:
+	mov	cr.eoi=r0
+	;;
+	srlz.d
+	;;
+	mov	r8=cr.ivr
+	;;
+	srlz.d
+	;;
+	cmp.eq	p0,p6\x15,r8
+(p6)	br.cond.sptk.few	call_start
+	br.sptk.few		b6
+kexec_fake_sal_rendez_end:
+END(kexec_fake_sal_rendez)
+
+	.global relocate_new_kernel_size
+relocate_new_kernel_size:
+	data8	kexec_fake_sal_rendez_end - relocate_new_kernel
+
+GLOBAL_ENTRY(ia64_dump_cpu_regs)
+        .prologue
+        alloc loc0=ar.pfs,1,2,0,0
+        .body
+        mov     ar.rsc=0                // put RSE in enforced lazy mode
+        add     loc1=4*8, in0           // save r4 and r5 first
+        ;;
+{
+        flushrs                         // flush dirty regs to backing store
+        srlz.i
+}
+        st8 [loc1]=r4, 8
+        ;;
+        st8 [loc1]=r5, 8
+        ;;
+        add loc12*8, in0
+        mov r4=ar.rnat
+        ;;
+        st8 [in0]=r0, 8			// r0
+        st8 [loc1]=r4, 8		// rnat
+        mov r5=pr
+        ;;
+        st8 [in0]=r1, 8			// r1
+        st8 [loc1]=r5, 8		// pr
+        mov r4°
+        ;;
+        st8 [in0]=r2, 8			// r2
+        st8 [loc1]=r4, 8		// b0
+        mov r5±;
+        ;;
+        st8 [in0]=r3, 24		// r3
+        st8 [loc1]=r5, 8		// b1
+        mov r4²
+        ;;
+        st8 [in0]=r6, 8			// r6
+        st8 [loc1]=r4, 8		// b2
+	mov r5³
+        ;;
+        st8 [in0]=r7, 8			// r7
+        st8 [loc1]=r5, 8		// b3
+        mov r4´
+        ;;
+        st8 [in0]=r8, 8			// r8
+        st8 [loc1]=r4, 8		// b4
+        mov r5µ
+        ;;
+        st8 [in0]=r9, 8			// r9
+        st8 [loc1]=r5, 8		// b5
+        mov r4¶
+        ;;
+        st8 [in0]=r10, 8		// r10
+        st8 [loc1]=r5, 8		// b6
+        mov r5·
+        ;;
+        st8 [in0]=r11, 8		// r11
+        st8 [loc1]=r5, 8		// b7
+        mov r4°
+        ;;
+        st8 [in0]=r12, 8		// r12
+        st8 [loc1]=r4, 8		// ip
+        mov r5=loc0
+	;;
+        st8 [in0]=r13, 8		// r13
+        extr.u r5=r5, 0, 38		// ar.pfs.pfm
+	mov r4=r0			// user mask
+        ;;
+        st8 [in0]=r14, 8		// r14
+        st8 [loc1]=r5, 8		// cfm
+        ;;
+        st8 [in0]=r15, 8		// r15
+        st8 [loc1]=r4, 8        	// user mask
+	mov r5=ar.rsc
+        ;;
+        st8 [in0]=r16, 8		// r16
+        st8 [loc1]=r5, 8        	// ar.rsc
+        mov r4=ar.bsp
+        ;;
+        st8 [in0]=r17, 8		// r17
+        st8 [loc1]=r4, 8        	// ar.bsp
+        mov r5=ar.bspstore
+        ;;
+        st8 [in0]=r18, 8		// r18
+        st8 [loc1]=r5, 8        	// ar.bspstore
+        mov r4=ar.rnat
+        ;;
+        st8 [in0]=r19, 8		// r19
+        st8 [loc1]=r4, 8        	// ar.rnat
+        mov r5=ar.ccv
+        ;;
+        st8 [in0]=r20, 8		// r20
+	st8 [loc1]=r5, 8        	// ar.ccv
+        mov r4=ar.unat
+        ;;
+        st8 [in0]=r21, 8		// r21
+        st8 [loc1]=r4, 8        	// ar.unat
+        mov r5 = ar.fpsr
+        ;;
+        st8 [in0]=r22, 8		// r22
+        st8 [loc1]=r5, 8        	// ar.fpsr
+        mov r4 = ar.unat
+        ;;
+        st8 [in0]=r23, 8		// r23
+        st8 [loc1]=r4, 8        	// unat
+        mov r5 = ar.fpsr
+        ;;
+        st8 [in0]=r24, 8		// r24
+        st8 [loc1]=r5, 8        	// fpsr
+        mov r4 = ar.pfs
+        ;;
+        st8 [in0]=r25, 8		// r25
+        st8 [loc1]=r4, 8        	// ar.pfs
+        mov r5 = ar.lc
+        ;;
+        st8 [in0]=r26, 8		// r26
+        st8 [loc1]=r5, 8        	// ar.lc
+        mov r4 = ar.ec
+        ;;
+        st8 [in0]=r27, 8		// r27
+        st8 [loc1]=r4, 8        	// ar.ec
+        mov r5 = ar.csd
+        ;;
+        st8 [in0]=r28, 8		// r28
+        st8 [loc1]=r5, 8        	// ar.csd
+        mov r4 = ar.ssd
+        ;;
+        st8 [in0]=r29, 8		// r29
+        st8 [loc1]=r4, 8        	// ar.ssd
+        ;;
+        st8 [in0]=r30, 8		// r30
+        ;;
+	st8 [in0]=r31, 8		// r31
+        mov ar.pfs=loc0
+        ;;
+        br.ret.sptk.many rp
+END(ia64_dump_cpu_regs)
+
+
diff -Nraup linux-2.6.18-rc4/arch/ia64/kernel/setup.c linux-2.6.18-rc4-kdump/arch/ia64/kernel/setup.c
--- linux-2.6.18-rc4/arch/ia64/kernel/setup.c	2006-08-16 05:06:57.000000000 +0800
+++ linux-2.6.18-rc4-kdump/arch/ia64/kernel/setup.c	2006-08-16 05:10:10.000000000 +0800
@@ -43,6 +43,8 @@
 #include <linux/initrd.h>
 #include <linux/pm.h>
 #include <linux/cpufreq.h>
+#include <linux/kexec.h>
+#include <linux/crash_dump.h>
 
 #include <asm/ia32.h>
 #include <asm/machvec.h>
@@ -250,6 +252,41 @@ reserve_memory (void)
 	}
 #endif
 
+#ifdef CONFIG_KEXEC
+	/* crashkernel=size@addr specifies the location to reserve for
+	 * a crash kernel.  By reserving this memory we guarantee
+	 * that linux never set's it up as a DMA target.
+	 * Useful for holding code to do something appropriate
+	 * after a kernel panic.
+	 */
+	{
+		char *from = strstr(saved_command_line, "crashkernel=");
+		if (from) {
+			unsigned long size, base;
+			size = memparse(from + 12, &from);
+			if (*from = '@') {
+				base = memparse(from + 1, &from);
+				rsvd_region[n].start +					(unsigned long)__va(base);
+				rsvd_region[n].end +					(unsigned long)__va(base + size);
+				crashk_res.start = base;
+				crashk_res.end = base + size - 1;
+				n++;
+			}
+		}
+		efi_memmap_res.start = ia64_boot_param->efi_memmap;
+                efi_memmap_res.end = efi_memmap_res.start +
+                        ia64_boot_param->efi_memmap_size;
+                printk("efi_memmap start %lx %lx\n",
+                        efi_memmap_res.start,
+                        efi_memmap_res.end);
+                boot_param_res.start = __pa(ia64_boot_param);
+                boot_param_res.end = boot_param_res.start +
+                        sizeof(*ia64_boot_param);
+	}
+#endif
+
 	efi_memmap_init(&rsvd_region[n].start, &rsvd_region[n].end);
 	n++;
 
@@ -484,6 +521,16 @@ setup_arch (char **cmdline_p)
 	if (!nomca)
 		ia64_mca_init();
 
+#ifdef CONFIG_CRASH_DUMP
+	{
+		char *from = strstr(saved_command_line, "elfcorehdr=");
+
+		if (from)
+			elfcorehdr_addr = memparse(from+11, &from);
+		saved_max_pfn = (unsigned long) -1;
+	}
+#endif
+
 	platform_setup(cmdline_p);
 	paging_init();
 }
diff -Nraup linux-2.6.18-rc4/arch/ia64/kernel/smp.c linux-2.6.18-rc4-kdump/arch/ia64/kernel/smp.c
--- linux-2.6.18-rc4/arch/ia64/kernel/smp.c	2006-06-18 09:49:35.000000000 +0800
+++ linux-2.6.18-rc4-kdump/arch/ia64/kernel/smp.c	2006-08-16 05:10:10.000000000 +0800
@@ -30,6 +30,7 @@
 #include <linux/delay.h>
 #include <linux/efi.h>
 #include <linux/bitops.h>
+#include <linux/kexec.h>
 
 #include <asm/atomic.h>
 #include <asm/current.h>
@@ -66,6 +67,7 @@ static volatile struct call_data_struct 
 
 #define IPI_CALL_FUNC		0
 #define IPI_CPU_STOP		1
+#define IPI_KDUMP_CPU_STOP	3
 
 /* This needs to be cacheline aligned because it is written to by *other* CPUs.  */
 static DEFINE_PER_CPU(u64, ipi_operation) ____cacheline_aligned;
@@ -84,6 +86,34 @@ unlock_ipi_calllock(void)
 	spin_unlock_irq(&call_lock);
 }
 
+#ifdef CONFIG_KEXEC
+/*
+ * Stop the CPU and put it in fake SAL rendezvous. This allows CPU to wake
+ * up with IPI from boot processor
+ */
+void
+kexec_stop_this_cpu (void *func)
+{
+	unsigned long pta, impl_va_bits, pal_base;
+
+	/*
+	 * Remove this CPU by putting it into fake SAL rendezvous
+	 */
+	cpu_clear(smp_processor_id(), cpu_online_map);
+	max_xtp();
+	ia64_eoi();
+
+	/* Disable VHPT */
+	impl_va_bits = ffz(~(local_cpu_data->unimpl_va_mask | (7UL << 61)));
+	pta = POW2(61) - POW2(vmlpt_bits);
+	ia64_set_pta(pta | (0 << 8) | (vmlpt_bits << 2) | 0);
+
+	local_irq_disable();
+	pal_base = __get_cpu_var(ia64_mca_pal_base);
+	kexec_fake_sal_rendez(func, ap_wakeup_vector, pal_base);
+}
+#endif
+
 static void
 stop_this_cpu (void)
 {
@@ -155,7 +185,15 @@ handle_IPI (int irq, void *dev_id, struc
 			      case IPI_CPU_STOP:
 				stop_this_cpu();
 				break;
-
+#ifdef CONFIG_CRASH_DUMP
+			      case IPI_KDUMP_CPU_STOP:
+				{
+					local_irq_disable();
+					crash_save_this_cpu();
+					cpu_halt();
+				}
+				break;
+#endif
 			      default:
 				printk(KERN_CRIT "Unknown IPI on CPU %d: %lu\n", this_cpu, which);
 				break;
@@ -371,6 +409,13 @@ smp_send_stop (void)
 {
 	send_IPI_allbutself(IPI_CPU_STOP);
 }
+#ifdef CONFIG_CRASH_DUMP
+void
+kdump_smp_send_stop()
+{
+ 	send_IPI_allbutself(IPI_KDUMP_CPU_STOP);
+}
+#endif
 
 int __init
 setup_profiling_timer (unsigned int multiplier)
diff -Nraup linux-2.6.18-rc4/include/asm-ia64/kexec.h linux-2.6.18-rc4-kdump/include/asm-ia64/kexec.h
--- linux-2.6.18-rc4/include/asm-ia64/kexec.h	1970-01-01 08:00:00.000000000 +0800
+++ linux-2.6.18-rc4-kdump/include/asm-ia64/kexec.h	2006-08-16 05:11:16.000000000 +0800
@@ -0,0 +1,40 @@
+#ifndef _ASM_IA64_KEXEC_H
+#define _ASM_IA64_KEXEC_H
+
+
+/* Maximum physical address we can use pages from */
+#define KEXEC_SOURCE_MEMORY_LIMIT (-1UL)
+/* Maximum address we can reach in physical address mode */
+#define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL)
+/* Maximum address we can use for the control code buffer */
+#define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE
+
+#define KEXEC_CONTROL_CODE_SIZE (8192 + 8192 + 4096)
+
+/* The native architecture */
+#define KEXEC_ARCH KEXEC_ARCH_IA_64
+
+#define MAX_NOTE_BYTES 1024
+
+#define pte_bits	3
+#define vmlpt_bits	(impl_va_bits - PAGE_SHIFT + pte_bits)
+#define POW2(n)		(1ULL << (n))
+
+DECLARE_PER_CPU(u64, ia64_mca_pal_base);
+const extern unsigned int relocate_new_kernel_size;
+volatile extern long kexec_rendez;
+extern void relocate_new_kernel(unsigned long, unsigned long,
+		struct ia64_boot_param *, unsigned long);
+extern void kexec_fake_sal_rendez(void *start, unsigned long wake_up,
+		unsigned long pal_base);
+static inline void
+crash_setup_regs(struct pt_regs *newregs, struct pt_regs *oldregs)
+{
+}
+extern struct resource efi_memmap_res;
+extern struct resource boot_param_res;
+extern void kdump_smp_send_stop(void);
+extern void kdump_disable_irq(unsigned int irq);
+extern void crash_save_this_cpu(void);
+
+#endif /* _ASM_IA64_KEXEC_H */
diff -Nraup linux-2.6.18-rc4/include/asm-ia64/machvec_hpzx1.h linux-2.6.18-rc4-kdump/include/asm-ia64/machvec_hpzx1.h
--- linux-2.6.18-rc4/include/asm-ia64/machvec_hpzx1.h	2006-06-18 09:49:35.000000000 +0800
+++ linux-2.6.18-rc4-kdump/include/asm-ia64/machvec_hpzx1.h	2006-08-16 05:10:10.000000000 +0800
@@ -34,4 +34,6 @@ extern ia64_mv_dma_mapping_error	sba_dma
 #define platform_dma_supported			sba_dma_supported
 #define platform_dma_mapping_error		sba_dma_mapping_error
 
+extern void ioc_iova_disable(void);
+
 #endif /* _ASM_IA64_MACHVEC_HPZX1_h */
diff -Nraup linux-2.6.18-rc4/include/asm-ia64/meminit.h linux-2.6.18-rc4-kdump/include/asm-ia64/meminit.h
--- linux-2.6.18-rc4/include/asm-ia64/meminit.h	2006-08-16 05:07:22.000000000 +0800
+++ linux-2.6.18-rc4-kdump/include/asm-ia64/meminit.h	2006-08-16 05:10:10.000000000 +0800
@@ -15,11 +15,12 @@
  * 	- initrd (optional)
  * 	- command line string
  * 	- kernel code & data
+ * 	- crash dumping code reserved region
  * 	- Kernel memory map built from EFI memory map
  *
  * More could be added if necessary
  */
-#define IA64_MAX_RSVD_REGIONS 6
+#define IA64_MAX_RSVD_REGIONS 7
 
 struct rsvd_region {
 	unsigned long start;	/* virtual address of beginning of element */
diff -Nraup linux-2.6.18-rc4/include/asm-ia64/smp.h linux-2.6.18-rc4-kdump/include/asm-ia64/smp.h
--- linux-2.6.18-rc4/include/asm-ia64/smp.h	2006-08-16 05:07:23.000000000 +0800
+++ linux-2.6.18-rc4-kdump/include/asm-ia64/smp.h	2006-08-16 05:10:10.000000000 +0800
@@ -128,6 +128,9 @@ extern void smp_send_reschedule (int cpu
 extern void lock_ipi_calllock(void);
 extern void unlock_ipi_calllock(void);
 extern void identify_siblings (struct cpuinfo_ia64 *);
+#ifdef CONFIG_KEXEC
+extern void kexec_stop_this_cpu(void *);
+#endif
 
 #else
 
diff -Nraup linux-2.6.18-rc4/kernel/irq/manage.c linux-2.6.18-rc4-kdump/kernel/irq/manage.c
--- linux-2.6.18-rc4/kernel/irq/manage.c	2006-08-16 05:07:28.000000000 +0800
+++ linux-2.6.18-rc4-kdump/kernel/irq/manage.c	2006-08-16 05:10:10.000000000 +0800
@@ -475,4 +475,3 @@ int request_irq(unsigned int irq,
 	return retval;
 }
 EXPORT_SYMBOL(request_irq);
-


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: IA64 Kexec-Kdump kernel patch
  2006-08-14  6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai
  2006-08-14 21:24 ` Bob Montgomery
  2006-08-15  0:47 ` Zou Nan hai
@ 2006-08-15  1:56 ` Jay Lan
  2006-08-15 17:39 ` Bob Montgomery
                   ` (13 subsequent siblings)
  16 siblings, 0 replies; 18+ messages in thread
From: Jay Lan @ 2006-08-15  1:56 UTC (permalink / raw)
  To: linux-ia64

Bob Montgomery wrote:
> On Mon, 2006-08-14 at 14:47 +0800, Zou Nan hai wrote:
> 
>>This patch is the kexec-kdump patch re-based to 2.6.18-rc4 kernel.
> 
> 
> Contrary to expectations, my experience with this patch on a 2.6.18-rc4
> kernel is that kexec -l, kexec -e is now working without my adding any
> delays to mptscsih, and the kexec -p, echo c >/proc/sysrq-trigger case
> hangs.
> 
> My "got here" printk's on the console indicate:
> 
> SysRq : Trigger a crashdump
> machine_crash_shutdown
> device_shootdown
> machine_kexec type: 1
> 
> And then it hangs.

Hi,

I got it further down.

> 
> My test system: hp A6870A server rx2600
>>From /proc/iomem:
> 04a1f000-3f5e3fff : System RAM
>   10000000-17ffffff : Crash kernel
> 

My test system is a zx6000.
Here is from /proc/iomem:
04aaf000-3e417fff : System RAM
   10000000-17ffffff : Crash kernel

I used 'make tiger_defconfig', then set on CONFIG_KEXEC,
CONFIG_CRASH_DUMP, and CONFIG_PROC_VMCOR.


Here are shown on console:
SysRq : Trigger a crashdump
kernel BUG at kernel/irq/migration.c:39!
bash[4846]: bugcheck! 0 [1]
Modules linked in: radeon drm agpgart nfs lockd sunrpc binfmt_misc 
dm_mirror dmi
Pid: 4846, CPU 0, comm:                 bash
psr : 00001010085a2010 ifs : 800000000000038b ip  : [<a0000001000e2520>] 
    Notdip is at move_native_irq+0x1a0/0x360
unat: 0000000000000000 pfs : 000000000000038b rsc : 0000000000000003
rnat: 0000000000000000 bsps: 0000000000000000 pr  : 000000000059a999
ldrs: 0000000000000000 ccv : 0000000000000000 fpsr: 0009804c8a70033f
csd : 0000000000000000 ssd : 0000000000000000
b0  : a0000001000e2520 b6  : a0000001000bc7c0 b7  : a00000010004ec60
f6  : 1003e00000000000000a0 f7  : 1003e20c49ba5e353f7cf
f8  : 1003e00000000000004e2 f9  : 1003e000000000fa00000
f10 : 1003e000000003b9aca00 f11 : 1003e431bde82d7b634db
r1  : a000000100b663c0 r2  : 0000000000001000 r3  : a000000100910e88
r8  : 000000000000002c r9  : 00000000000000fd r10 : a00000010097c750
r11 : 0000000000000000 r12 : e00000001c157c60 r13 : e00000001c150000
r14 : 0000000000004000 r15 : a000000100910e88 r16 : a000000100910e90
r17 : 0000000000004000 r18 : 0000000000000000 r19 : 0000000000000001
r20 : a000000100985f98 r21 : a000000100985f98 r22 : 0000000000000004
r23 : 0000000000000000 r24 : e00000003f3e0f64 r25 : 0000000000000000
r26 : e00000003f3e0f6c r27 : e00000003f3e0f50 r28 : e00000003f3e0008
r29 : 0000000000000000 r30 : 0000000000000000 r31 : 0000000000000000

Call Trace:
  [<a0000001000138e0>] show_stack+0x40/0xa0
                                 spà0000001c1577f0 bspà0000001c1514a8
  [<a000000100014540>] show_regs+0x840/0x880
                                 spà0000001c1579c0 bspà0000001c151450
  [<a000000100036400>] die+0x1c0/0x2c0
                                 spà0000001c1579c0 bspà0000001c151408
  [<a000000100036550>] die_if_kernel+0x50/0x80
                                 spà0000001c1579e0 bspà0000001c1513d0
  [<a000000100037c50>] ia64_bad_break+0x270/0x4a0
                                 spà0000001c1579e0 bspà0000001c1513a8
  [<a00000010000c320>] ia64_leave_kernel+0x0/0x280
                                 spà0000001c157a90 bspà0000001c1513a8
  [<a0000001000e2520>] move_native_irq+0x1a0/0x360
                                 spà0000001c157c60 
bspà0000001c151350
  [<a00000010004ec90>] iosapic_end_level_irq+0x30/0xe0
                                 spà0000001c157c60 
bspà0000001c151330
  [<a00000010005d4e0>] machine_crash_shutdown+0x120/0x220
                                 spà0000001c157c60 
bspà0000001c151300
  [<a0000001000d5890>] crash_kexec+0x70/0xc0
                                 spà0000001c157c60 
bspà0000001c1512e0
  [<a00000010045ee00>] sysrq_handle_crashdump+0x20/0x40
                                 spà0000001c157e20 
bspà0000001c1512b8
  [<a00000010045efe0>] __handle_sysrq+0x160/0x300
                                 spà0000001c157e20 
bspà0000001c151268
  [<a0000001001ba0b0>] write_sysrq_trigger+0xb0/0xe0
                                 spà0000001c157e20 
bspà0000001c151238
  [<a00000010012fad0>] vfs_write+0x1b0/0x340
                                 spà0000001c157e20 
bspà0000001c1511e0
  [<a000000100130750>] sys_write+0x70/0xe0
                                 spà0000001c157e20 
bspà0000001c151168
  [<a00000010000c180>] ia64_ret_from_syscall+0x0/0x20
                                 spà0000001c157e30 
bspà0000001c151168
  [<a000000000010620>] __kernel_syscall_via_break+0x0/0x20
                                 spà0000001c158000 
bspà0000001c151168
  <4>hda: lost interrupt
mptscsih: ioc0: attempting task abort! (scà0000003e42ba00)
sd 0:0:0:0:
         command: cdb[0]=0x4d: 4d 00 6f 00 00 00 00 00 04 00
mptbase: Initiating ioc0 recovery
mptscsih: ioc0: task abort: SUCCESS (scà0000003e42ba00)
mptscsih: ioc0: attempting task abort! (scà0000003e42ba00)
sd 0:0:0:0:
         command: cdb[0]=0x0: 00 00 00 00 00 00
mptbase: Initiating ioc0 recovery
mptscsih: ioc0: task abort: SUCCESS (scà0000003e42ba00)
mptscsih: ioc0: attempting task abort! (scà0000003e429c00)
sd 0:0:0:0:
         command: cdb[0]=0x0: 00 00 00 00 00 00
mptbase: Initiating ioc0 recovery
mptscsih: ioc0: task abort: SUCCESS (scà0000003e429c00)
mptscsih: ioc0: attempting task abort! (scà0000003e42bd00)
sd 0:0:0:0:
         command: cdb[0]=0x0: 00 00 00 00 00 00
ide-cd: cmd 0x3 timed out
hda: lost interrupt
...


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: IA64 Kexec-Kdump kernel patch
  2006-08-14  6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai
                   ` (2 preceding siblings ...)
  2006-08-15  1:56 ` Jay Lan
@ 2006-08-15 17:39 ` Bob Montgomery
  2006-08-15 19:15 ` Jay Lan
                   ` (12 subsequent siblings)
  16 siblings, 0 replies; 18+ messages in thread
From: Bob Montgomery @ 2006-08-15 17:39 UTC (permalink / raw)
  To: linux-ia64

On Tue, 2006-08-15 at 08:47 +0800, Zou Nan hai wrote:
> > ...
>   Jay,  
>         Thanks very much, please try the following updated patch which
> simplify the device_shootdown code.
> 

My system continues to hang with the new patch.  I can get a printk just
before jumping to the new code in machine_kexec.  We're going to try
hooking up the ITP now.

Bob Montgomery


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: IA64 Kexec-Kdump kernel patch
  2006-08-14  6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai
                   ` (3 preceding siblings ...)
  2006-08-15 17:39 ` Bob Montgomery
@ 2006-08-15 19:15 ` Jay Lan
  2006-08-15 19:31 ` Bob Montgomery
                   ` (11 subsequent siblings)
  16 siblings, 0 replies; 18+ messages in thread
From: Jay Lan @ 2006-08-15 19:15 UTC (permalink / raw)
  To: linux-ia64

Zou Nan hai wrote:
> On Tue, 2006-08-15 at 09:56, Jay Lan wrote:
> 
>>Bob Montgomery wrote:
>>
>>>On Mon, 2006-08-14 at 14:47 +0800, Zou Nan hai wrote:
>>>
>>>
>>>>This patch is the kexec-kdump patch re-based to 2.6.18-rc4 kernel.
>>>
>>>
> 
>>...
> 
>   Jay,  
>   	Thanks very much, please try the following updated patch which
> simplify the device_shootdown code.
> 
> 
>   Signed-off-by: Zou Nan hai <nanhai.zou@intel.com>
> 
Since you did not indicate version number different from the previous
one, i would call it 2.6.18-rc4-v2.

With this version, the crash dump kernel tried to boot... and failed
at "exec of init()" for "No such file or directory".


Here is the output at the console:

SysRq : Trigger a crashdump
Linux version 2.6.18-rc4 (jlan@holism.engr.sgi.com) (gcc version 4.1.0 
200603046
Ignoring memory below 256MB
Ignoring memory above 384MB
EFI v1.10 by HP: SALsystab=0x3fb38000 ACPI 2.0=0x3fb2e000 
SMBIOS=0x3fb3a000 HCD0
PCDP: v0 at 0x3fb2c000
Explicit "console="; ignoring PCDP
efi_memmap start 17fd4000 17fd47e0
Initial ramdisk at: 0xe000000017e6c000 (1420052 bytes)
SAL 3.1: HP version 2.31
SAL Platform features: None
SAL: AP wakeup using external interrupt vector 0xff
No logical to physical processor mapping available
ACPI: Local APIC address c0000000fee00000
GSI 36 (level, low) -> CPU 0 (0x0000) vector 48
2 CPUs available, 2 CPUs total
MCA related initialization done
SMP: Allowing 2 CPUs, 0 hotplug CPUs
Built 1 zonelists.  Total pages: 8191
Kernel command line: root=LABEL=/ init 1 irqpoll console=ttyS0,38400n8 
maxcpus=M
Misrouted IRQ fixup and polling support enabled
This may significantly impact system performance
PID hash table entries: 512 (order: 9, 4096 bytes)
irq 51, desc: a00000010082e380, depth: 1, count: 0, unhandled: 0
->handle_irq():  a0000001007bf9c0, __stop___param+0x3a70/0x1c0b0
->chip(): a000000100946468, no_irq_chip+0x0/0x80
->action(): 0000000000000000
   IRQ_DISABLED set
Unexpected irq vector 0x33 on CPU 0!
Console: colour dummy device 80x25
Dentry cache hash table entries: 16384 (order: 3, 131072 bytes)
Inode-cache hash table entries: 8192 (order: 2, 65536 bytes)
Placing software IO TLB between 0x11124000 - 0x15124000
Memory: 46144k/131056k available (6965k code, 84912k reserved, 2751k 
data, 256k)
McKinley Errata 9 workaround not needed; disabling it
Mount-cache hash table entries: 1024
ACPI: Core revision 20060707
Boot processor id 0x0/0x0
Brought up 1 CPUs
Total of 1 processors activated (1945.60 BogoMIPS).
migration_cost=0
checking if image is initramfs... it is
Freeing initrd memory: 1376kB freed
DMI 2.3 present.
NET: Registered protocol family 16
ACPI: bus type pci registered
ACPI: Interpreter enabled
ACPI: Using IOSAPIC for interrupt routing
ACPI: PCI Root Bridge [PCI0] (0000:00)
ACPI: PCI Root Bridge [PCI1] (0000:20)
ACPI: PCI Root Bridge [PCI2] (0000:40)
ACPI: PCI Root Bridge [PCI3] (0000:60)
ACPI: PCI Root Bridge [PCI4] (0000:80)
ACPI: PCI Root Bridge [PCI6] (0000:c0)
Linux Plug and Play Support v0.97 (c) Adam Belay
pnp: PnP ACPI init
GSI 34 (edge, high) -> CPU 0 (0x0000) vector 49
GSI 35 (edge, high) -> CPU 0 (0x0000) vector 50
pnp: PnP ACPI: found 10 devices
SCSI subsystem initialized
usbcore: registered new driver usbfs
usbcore: registered new driver hub
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: -1, 8192 bytes)
TCP established hash table entries: 4096 (order: 2, 65536 bytes)
TCP bind hash table entries: 2048 (order: 1, 32768 bytes)
TCP: Hash tables configured (established 4096 bind 2048)
TCP reno registered
perfmon: version 2.0 IRQ 238
perfmon: Itanium 2 PMU detected, 16 PMCs, 18 PMDs, 4 counters (47 bits)
PAL Information Facility v0.5
perfmon: added sampling format default_format
perfmon_default_smpl: default_format v2.0 registered
Total HugeTLB memory allocated, 0
SGI XFS with large block/inode numbers, no debug enabled
Initializing Cryptographic API
io scheduler noop registered
io scheduler anticipatory registered (default)
io scheduler deadline registered
io scheduler cfq registered
EFI Time Services Driver v0.4
Serial: 8250/16550 driver $Revision: 1.90 $ 4 ports, IRQ sharing enabled
00:04: ttyS0 at MMIO 0xff5e0000 (irq = 49) is a 16550A
00:05: ttyS1 at MMIO 0xff5e2000 (irq = 50) is a 16550A
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
Intel(R) PRO/1000 Network Driver - version 7.1.9-k4
Copyright (c) 1999-2006 Intel Corporation.
tg3.c:v3.64 (July 31, 2006)
GSI 29 (level, low) -> CPU 0 (0x0000) vector 51
ACPI: PCI Interrupt 0000:20:02.0[A] -> GSI 29 (level, low) -> IRQ 51
eth0: Tigon3 [partno(BCM95700A6) rev 0105 PHY(5701)] (PCI:66MHz:64-bit) 
10/100/e
eth0: RXcsums[1] LinkChgREG[0] MIirq[0] ASF[0] Split[0] WireSpeed[1] 
TSOcap[0]
eth0: dma_rwctrl[76ff2d0f] dma_mask[64-bit]
netconsole: not configured, aborting
Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2
ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx
CMD649: IDE controller at PCI slot 0000:00:02.0
GSI 21 (level, low) -> CPU 0 (0x0000) vector 52
ACPI: PCI Interrupt 0000:00:02.0[A] -> GSI 21 (level, low) -> IRQ 52
CMD649: chipset revision 2
CMD649: 100% native mode on irq 52
     ide0: BM-DMA at 0x0d40-0x0d47, BIOS settings: hda:DMA, hdb:pio
     ide1: BM-DMA at 0x0d48-0x0d4f, BIOS settings: hdc:pio, hdd:pio
hda: DV-28E-C, ATAPI CD/DVD-ROM drive
ide0 at 0xd58-0xd5f,0xd66 on irq 52
hda: ATAPI 24X DVD-ROM drive, 256kB Cache, UDMA(33)
Uniform CD-ROM driver Revision: 3.20
ide-floppy driver 0.99.newide
Fusion MPT base driver 3.04.01
Copyright (c) 1999-2005 LSI Logic Corporation
Fusion MPT SPI Host driver 3.04.01
GSI 27 (level, low) -> CPU 0 (0x0000) vector 53
ACPI: PCI Interrupt 0000:20:01.0[A] -> GSI 27 (level, low) -> IRQ 53
mptbase: Initiating ioc0 bringup
ioc0: 53C1030: Capabilities={Initiator,Target}
scsi0 : ioc0: LSI53C1030, FwRev\x01032300h, Ports=1, MaxQ%5, IRQS
   Vendor: HP 73.4G  Model: MAS3735NC         Rev: HPC3
   Type:   Direct-Access                      ANSI SCSI revision: 03
  target0:0:0: Beginning Domain Validation
  target0:0:0: Ending Domain Validation
  target0:0:0: FAST-160 WIDE SCSI 320.0 MB/s DT IU QAS RTI PCOMP (6.25 
ns, offse)
SCSI device sda: 143374738 512-byte hdwr sectors (73408 MB)
sda: Write Protect is off
SCSI device sda: drive cache: write through w/ FUA
SCSI device sda: 143374738 512-byte hdwr sectors (73408 MB)
sda: Write Protect is off
SCSI device sda: drive cache: write through w/ FUA
  sda: sda1 sda2 sda3
sd 0:0:0:0: Attached scsi disk sda
GSI 28 (level, low) -> CPU 0 (0x0000) vector 54
ACPI: PCI Interrupt 0000:20:01.1[B] -> GSI 28 (level, low) -> IRQ 54
mptbase: Initiating ioc1 bringup
ioc1: 53C1030: Capabilities={Initiator,Target}
scsi1 : ioc1: LSI53C1030, FwRev\x01032300h, Ports=1, MaxQ%5, IRQT
Fusion MPT FC Host driver 3.04.01
Fusion MPT misc device (ioctl) driver 3.04.01
mptctl: Registered with Fusion MPT base driver
mptctl: /dev/mptctl @ (major,minor\x10,220)
USB Universal Host Controller Interface driver v3.0
usbcore: registered new driver usbhid
drivers/usb/input/hid-core.c: v2.6:USB HID core driver
mice: PS/2 mouse device common for all mice
EFI Variables Facility v0.08 2004-May-17
TCP bic registered
NET: Registered protocol family 1
NET: Registered protocol family 17
Freeing unused kernel memory: 256kB freed
Red Hat nash version 5.0.32 starting
Mounting proc filesystem
Mounting sysfs filesystem
Creating /dev
Creating initial device nodes
Setting up hotplug.
Creating block device nodes.
Creating root device.
Mounting root filesystem.EXT3-fs: INFO: recovery required on readonly 
filesyste.

EXT3-fs: write access will be enabled during recovery.
kjournald starting.  Commit interval 5 seconds
EXT3-fs: recovery complete.
EXT3-fs: mounted filesystem with ordered data mode.
Setting up other filesystems.
Setting up new root fs
Kernel panic - not syncing: Attempted to kill init!

Switching to ne w root and running init.
unmounting old /dev
unmounting old /proc
unmounting old /sys
WARNING: can't access
exec of init () failed!!!: No such file or directory


Regards,
  - jay

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: IA64 Kexec-Kdump kernel patch
  2006-08-14  6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai
                   ` (4 preceding siblings ...)
  2006-08-15 19:15 ` Jay Lan
@ 2006-08-15 19:31 ` Bob Montgomery
  2006-08-15 19:46 ` Keshavamurthy Anil S
                   ` (10 subsequent siblings)
  16 siblings, 0 replies; 18+ messages in thread
From: Bob Montgomery @ 2006-08-15 19:31 UTC (permalink / raw)
  To: linux-ia64

On Tue, 2006-08-15 at 12:46 -0700, Keshavamurthy Anil S wrote:
> On Mon, Aug 14, 2006 at 05:24:57PM -0400, Bob Montgomery wrote:
> > On Mon, 2006-08-14 at 14:47 +0800, Zou Nan hai wrote:
> > > This patch is the kexec-kdump patch re-based to 2.6.18-rc4 kernel.
> > 
> > Contrary to expectations, my experience with this patch on a 2.6.18-rc4
> > kernel is that kexec -l, kexec -e is now working without my adding any
> > delays to mptscsih, and the kexec -p, echo c >/proc/sysrq-trigger case
> > hangs.
> > 
> > # cat /proc/cmdline
> > BOOT_IMAGE=scsi0:/EFI/debian/boot/vmlinuz-2.6.18-rc4-bobm root=/dev/sda4
> > raid=noautodetect crashkernel\x128M@256M panic=1 ro
> 
> Can you change crashkernelQ2M@256 and try
> kexec -p, echo c > /proc/sysrq-trigger case.

04a40000-3f5e3fff : System RAM
  10000000-2fffffff : Crash kernel

bobm@urlp2:~$ cat /proc/cmdline
root=/dev/sda4 crashkernelQ2M@256M panic=1 ro

# kexec -p vmlinux.strip --append="root=/dev/sda4 maxcpus=1 panic=1
irqpoll ro"

# echo c >/proc/sysrq-trigger

Still hangs with no indication on the console after my printk("bye\n")
just before the br.call at the end of machine_kexec.

Bob M.


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: IA64 Kexec-Kdump kernel patch
  2006-08-14  6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai
                   ` (5 preceding siblings ...)
  2006-08-15 19:31 ` Bob Montgomery
@ 2006-08-15 19:46 ` Keshavamurthy Anil S
  2006-08-15 22:36 ` Zou Nan hai
                   ` (9 subsequent siblings)
  16 siblings, 0 replies; 18+ messages in thread
From: Keshavamurthy Anil S @ 2006-08-15 19:46 UTC (permalink / raw)
  To: linux-ia64

On Mon, Aug 14, 2006 at 05:24:57PM -0400, Bob Montgomery wrote:
> On Mon, 2006-08-14 at 14:47 +0800, Zou Nan hai wrote:
> > This patch is the kexec-kdump patch re-based to 2.6.18-rc4 kernel.
> 
> Contrary to expectations, my experience with this patch on a 2.6.18-rc4
> kernel is that kexec -l, kexec -e is now working without my adding any
> delays to mptscsih, and the kexec -p, echo c >/proc/sysrq-trigger case
> hangs.
> 
> # cat /proc/cmdline
> BOOT_IMAGE=scsi0:/EFI/debian/boot/vmlinuz-2.6.18-rc4-bobm root=/dev/sda4
> raid=noautodetect crashkernel\x128M@256M panic=1 ro

Can you change crashkernelQ2M@256 and try
kexec -p, echo c > /proc/sysrq-trigger case.



^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: IA64 Kexec-Kdump kernel patch
  2006-08-14  6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai
                   ` (6 preceding siblings ...)
  2006-08-15 19:46 ` Keshavamurthy Anil S
@ 2006-08-15 22:36 ` Zou Nan hai
  2006-08-15 22:40 ` Zou Nan hai
                   ` (8 subsequent siblings)
  16 siblings, 0 replies; 18+ messages in thread
From: Zou Nan hai @ 2006-08-15 22:36 UTC (permalink / raw)
  To: linux-ia64

On Wed, 2006-08-16 at 03:15, Jay Lan wrote:
> Zou Nan hai wrote:
> > On Tue, 2006-08-15 at 09:56, Jay Lan wrote:
> > 
> >>Bob Montgomery wrote:
> >>
> >>>On Mon, 2006-08-14 at 14:47 +0800, Zou Nan hai wrote:
> >>>
> >>>
> >>>>This patch is the kexec-kdump patch re-based to 2.6.18-rc4 kernel.
> >>>
> >>>
> > 
> > 
> WARNING: can't access
> exec of init () failed!!!: No such file or directory
> 
> 
  Did you pass the correct kernel parameter to --append?
  It seems that root filesystem was not able to be mounted.

> Regards,
>   - jay

  Thanks
  Zou Nan hai

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: IA64 Kexec-Kdump kernel patch
  2006-08-14  6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai
                   ` (7 preceding siblings ...)
  2006-08-15 22:36 ` Zou Nan hai
@ 2006-08-15 22:40 ` Zou Nan hai
  2006-08-16 18:25 ` Bob Montgomery
                   ` (7 subsequent siblings)
  16 siblings, 0 replies; 18+ messages in thread
From: Zou Nan hai @ 2006-08-15 22:40 UTC (permalink / raw)
  To: linux-ia64

On Wed, 2006-08-16 at 01:39, Bob Montgomery wrote:
> On Tue, 2006-08-15 at 08:47 +0800, Zou Nan hai wrote:
> > > ...
> >   Jay,  
> >         Thanks very much, please try the following updated patch which
> > simplify the device_shootdown code.
> > 
> 
> My system continues to hang with the new patch.  I can get a printk just
> before jumping to the new code in machine_kexec.  We're going to try
> hooking up the ITP now.
> 
> Bob Montgomery

  If you are not seeing "I am in purgatory" in console, that probably
means crash kernel segments and purgatory code was copied into some
wrong physical address.

  Can you check the crashkernel="..." parameter
  Thanks

Zou Nan hai

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: IA64 Kexec-Kdump kernel patch
  2006-08-14  6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai
                   ` (8 preceding siblings ...)
  2006-08-15 22:40 ` Zou Nan hai
@ 2006-08-16 18:25 ` Bob Montgomery
  2006-08-16 22:34 ` Jay Lan
                   ` (6 subsequent siblings)
  16 siblings, 0 replies; 18+ messages in thread
From: Bob Montgomery @ 2006-08-16 18:25 UTC (permalink / raw)
  To: linux-ia64

On Wed, 2006-08-16 at 06:40 +0800, Zou Nan hai wrote:
> On Wed, 2006-08-16 at 01:39, Bob Montgomery wrote:
> > On Tue, 2006-08-15 at 08:47 +0800, Zou Nan hai wrote:

> 
>   If you are not seeing "I am in purgatory" in console, that probably
> means crash kernel segments and purgatory code was copied into some
> wrong physical address.
> 
>   Can you check the crashkernel="..." parameter
>   Thanks

Today, we have had success by changing the configuration of our kernels
from zx1 to tiger.  Now we'll try to figure out what it is about the zx1
config parameters that causes the crash_kexec path to break.

Bob Montgomery


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: IA64 Kexec-Kdump kernel patch
  2006-08-14  6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai
                   ` (9 preceding siblings ...)
  2006-08-16 18:25 ` Bob Montgomery
@ 2006-08-16 22:34 ` Jay Lan
  2006-08-16 22:46 ` Jay Lan
                   ` (5 subsequent siblings)
  16 siblings, 0 replies; 18+ messages in thread
From: Jay Lan @ 2006-08-16 22:34 UTC (permalink / raw)
  To: linux-ia64

Zou Nan hai wrote:
> On Wed, 2006-08-16 at 03:15, Jay Lan wrote:
> 
>>Zou Nan hai wrote:
>>
> 
>   Did you pass the correct kernel parameter to --append?
>   It seems that root filesystem was not able to be mounted.
> 

I finally was able to boot up the crash dump kernel.
Unfortunately the 'cp vmcore /var/tmp' crashed due to
out of memory. :(

The memory on the regular kernel showed:
[root@holism tmp]# free
              total       used       free     shared    buffers     cached
Mem:        805312     443520     361792          0      36288     295936
-/+ buffers/cache:     111296     694016
Swap:      6143968          0    6143968

and the memory on the crash dump kernel showed:
[root@holism tmp]# free
              total       used       free     shared    buffers     cached
Mem:         47776      45952       1824          0       1056      11856
-/+ buffers/cache:      33040      14736
Swap:      6143968      54720    6089248


It came down from 805312 k  to 47776 k with only 1824 free.
How much memory do i need to do a 'cp /proc/vmcore /var/tmp'?

Thanks,
  - jay



^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: IA64 Kexec-Kdump kernel patch
  2006-08-14  6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai
                   ` (10 preceding siblings ...)
  2006-08-16 22:34 ` Jay Lan
@ 2006-08-16 22:46 ` Jay Lan
  2006-08-17  0:34 ` Jay Lan
                   ` (4 subsequent siblings)
  16 siblings, 0 replies; 18+ messages in thread
From: Jay Lan @ 2006-08-16 22:46 UTC (permalink / raw)
  To: linux-ia64

Bob Montgomery wrote:
> On Wed, 2006-08-16 at 06:40 +0800, Zou Nan hai wrote:
> 
>>On Wed, 2006-08-16 at 01:39, Bob Montgomery wrote:
>>
>>>On Tue, 2006-08-15 at 08:47 +0800, Zou Nan hai wrote:
> 
> 
>>  If you are not seeing "I am in purgatory" in console, that probably
>>means crash kernel segments and purgatory code was copied into some
>>wrong physical address.
>>
>>  Can you check the crashkernel="..." parameter
>>  Thanks
> 
> 
> Today, we have had success by changing the configuration of our kernels
> from zx1 to tiger.  Now we'll try to figure out what it is about the zx1
> config parameters that causes the crash_kexec path to break.

I had problem with the zx1 defconfig on my zx6000 also. Since i recalled
Horms said he was successful with tiger config so i switched. :)

- jay

> 
> Bob Montgomery
> 
> -
> To unsubscribe from this list: send the line "unsubscribe linux-ia64" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: IA64 Kexec-Kdump kernel patch
  2006-08-14  6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai
                   ` (11 preceding siblings ...)
  2006-08-16 22:46 ` Jay Lan
@ 2006-08-17  0:34 ` Jay Lan
  2006-08-17  0:38 ` Jack Steiner
                   ` (3 subsequent siblings)
  16 siblings, 0 replies; 18+ messages in thread
From: Jay Lan @ 2006-08-17  0:34 UTC (permalink / raw)
  To: linux-ia64

Jay Lan wrote:
> Zou Nan hai wrote:
> 
>> On Wed, 2006-08-16 at 03:15, Jay Lan wrote:
>>
>>> Zou Nan hai wrote:
>>>
>>
>>   Did you pass the correct kernel parameter to --append?
>>   It seems that root filesystem was not able to be mounted.
>>
> 
> I finally was able to boot up the crash dump kernel.
> Unfortunately the 'cp vmcore /var/tmp' crashed due to
> out of memory. :(

Incresing boot parameter from 128M@256M to 256M@256M
fixed the problem. :)

Thanks you, Nanhai!

- jay

> 
> 

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: IA64 Kexec-Kdump kernel patch
  2006-08-14  6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai
                   ` (12 preceding siblings ...)
  2006-08-17  0:34 ` Jay Lan
@ 2006-08-17  0:38 ` Jack Steiner
  2006-08-17  2:57 ` Horms
                   ` (2 subsequent siblings)
  16 siblings, 0 replies; 18+ messages in thread
From: Jack Steiner @ 2006-08-17  0:38 UTC (permalink / raw)
  To: linux-ia64

On Wed, Aug 16, 2006 at 03:34:52PM -0700, Jay Lan wrote:
> Zou Nan hai wrote:
> >On Wed, 2006-08-16 at 03:15, Jay Lan wrote:
> >
> >>Zou Nan hai wrote:
> >>
> >
> >  Did you pass the correct kernel parameter to --append?
> >  It seems that root filesystem was not able to be mounted.
> >
> 
> I finally was able to boot up the crash dump kernel.
> Unfortunately the 'cp vmcore /var/tmp' crashed due to
> out of memory. :(

Why did the crash occur? Was the disk full? Otherwise, the cached
pages _should_ have been written to disk.

Do you have a console log?


> 
> The memory on the regular kernel showed:
> [root@holism tmp]# free
>              total       used       free     shared    buffers     cached
> Mem:        805312     443520     361792          0      36288     295936
> -/+ buffers/cache:     111296     694016
> Swap:      6143968          0    6143968
> 
> and the memory on the crash dump kernel showed:
> [root@holism tmp]# free
>              total       used       free     shared    buffers     cached
> Mem:         47776      45952       1824          0       1056      11856
> -/+ buffers/cache:      33040      14736
> Swap:      6143968      54720    6089248
> 
> 
> It came down from 805312 k  to 47776 k with only 1824 free.
> How much memory do i need to do a 'cp /proc/vmcore /var/tmp'?
> 
> Thanks,
>  - jay
> 
> 
> -
> To unsubscribe from this list: send the line "unsubscribe linux-ia64" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
Thanks

Jack Steiner (steiner@sgi.com)          651-683-5302
Principal Engineer                      SGI - Silicon Graphics, Inc.



^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: IA64 Kexec-Kdump kernel patch
  2006-08-14  6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai
                   ` (13 preceding siblings ...)
  2006-08-17  0:38 ` Jack Steiner
@ 2006-08-17  2:57 ` Horms
  2006-08-17  3:56 ` Zou Nan hai
  2006-08-17 18:53 ` Jay Lan
  16 siblings, 0 replies; 18+ messages in thread
From: Horms @ 2006-08-17  2:57 UTC (permalink / raw)
  To: linux-ia64

On 14 Aug 2006 14:47:54 +0800, Zou Nan hai wrote:
> This patch is the kexec-kdump patch re-based to 2.6.18-rc4 kernel.

I will post incremental versions of these latest kexec patches,
hopefully today. So anyone who is intrested, please be a little patient.

-- 
Horms
  H: http://www.vergenet.net/~horms/
  W: http://www.valinux.co.jp/en/


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: IA64 Kexec-Kdump kernel patch
  2006-08-14  6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai
                   ` (14 preceding siblings ...)
  2006-08-17  2:57 ` Horms
@ 2006-08-17  3:56 ` Zou Nan hai
  2006-08-17 18:53 ` Jay Lan
  16 siblings, 0 replies; 18+ messages in thread
From: Zou Nan hai @ 2006-08-17  3:56 UTC (permalink / raw)
  To: linux-ia64

On Thu, 2006-08-17 at 02:25, Bob Montgomery wrote:
> On Wed, 2006-08-16 at 06:40 +0800, Zou Nan hai wrote:
> > On Wed, 2006-08-16 at 01:39, Bob Montgomery wrote:
> > > On Tue, 2006-08-15 at 08:47 +0800, Zou Nan hai wrote:
> 
> > 
> >   If you are not seeing "I am in purgatory" in console, that probably
> > means crash kernel segments and purgatory code was copied into some
> > wrong physical address.
> > 
> >   Can you check the crashkernel="..." parameter
> >   Thanks
> 
> Today, we have had success by changing the configuration of our kernels
> from zx1 to tiger.  Now we'll try to figure out what it is about the zx1
> config parameters that causes the crash_kexec path to break.
> 
> Bob Montgomery
Hi Bob,
	Could you take a look at the ioc_iova_disable code in crash path?

That piece of code is from HP. 
It will only execute if CONFIG_IA64_HP_ZX1 is defined.

I don't have much knowledge of the I/O MMU stuff on HP machines....   	

Thanks
Zou Nan hai

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: IA64 Kexec-Kdump kernel patch
  2006-08-14  6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai
                   ` (15 preceding siblings ...)
  2006-08-17  3:56 ` Zou Nan hai
@ 2006-08-17 18:53 ` Jay Lan
  16 siblings, 0 replies; 18+ messages in thread
From: Jay Lan @ 2006-08-17 18:53 UTC (permalink / raw)
  To: linux-ia64

Jack Steiner wrote:
> On Wed, Aug 16, 2006 at 03:34:52PM -0700, Jay Lan wrote:
> > 
> 
> Why did the crash occur? Was the disk full? Otherwise, the cached
> pages _should_ have been written to disk.
> 
> Do you have a console log?
> 

Hi Jack,

I reserved insufficient memory for the crash dump kernel.
Once i increased from 128M to 256M, the problem went away.

Thanks,
  - jay


oom-killer: gfp_mask=0x200d2, order=0

Call Trace:
  [<a0000001000138e0>] show_stack+0x40/0xa0
                                 spà00000015d57a40 bspà00000015d514a0
  [<a000000100013970>] dump_stack+0x30/0x60
                                 spà00000015d57c10 bspà00000015d51488
  [<a0000001000eb000>] out_of_memory+0x60/0x3a0
                                 spà00000015d57c10 bspà00000015d51448
  [<a0000001000eeb50>] __alloc_pages+0x3d0/0x520
                                 spà00000015d57c20 bspà00000015d513d0
  [<a0000001000e65d0>] generic_file_buffered_write+0x310/0xd00
                                 spà00000015d57c30 bspà00000015d512f0
  [<a0000001000e7620>] __generic_file_aio_write_nolock+0x660/0x740
                                 spà00000015d57cc0 bspà00000015d51280
  [<a0000001000e77f0>] generic_file_aio_write+0xf0/0x200
                                 spà00000015d57d30 bspà00000015d51220
  [<a0000001002343c0>] ext3_file_write+0x60/0x200
                                 spà00000015d57d40 bspà00000015d511e0
  [<a00000010012e470>] do_sync_write+0x170/0x1e0
                                 spà00000015d57d40 bspà00000015d511a0
  [<a00000010012fb30>] vfs_write+0x1b0/0x340
                                 spà00000015d57e20 bspà00000015d51150
  [<a0000001001307b0>] sys_write+0x70/0xe0
                                 spà00000015d57e20 bspà00000015d510d8
  [<a00000010000c180>] ia64_ret_from_syscall+0x0/0x20
                                 spà00000015d57e30 bspà00000015d510d8
  [<a000000000010620>] __kernel_syscall_via_break+0x0/0x20
                                 spà00000015d58000 
bspà00000015d510d8

^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2006-08-17 18:53 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-08-14  6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai
2006-08-14 21:24 ` Bob Montgomery
2006-08-15  0:47 ` Zou Nan hai
2006-08-15  1:56 ` Jay Lan
2006-08-15 17:39 ` Bob Montgomery
2006-08-15 19:15 ` Jay Lan
2006-08-15 19:31 ` Bob Montgomery
2006-08-15 19:46 ` Keshavamurthy Anil S
2006-08-15 22:36 ` Zou Nan hai
2006-08-15 22:40 ` Zou Nan hai
2006-08-16 18:25 ` Bob Montgomery
2006-08-16 22:34 ` Jay Lan
2006-08-16 22:46 ` Jay Lan
2006-08-17  0:34 ` Jay Lan
2006-08-17  0:38 ` Jack Steiner
2006-08-17  2:57 ` Horms
2006-08-17  3:56 ` Zou Nan hai
2006-08-17 18:53 ` Jay Lan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox