Index: xen-unstable.hg/xen/arch/ia64/xen/machine_kexec.c
===================================================================
--- xen-unstable.hg.orig/xen/arch/ia64/xen/machine_kexec.c	2008-01-16 18:09:04.000000000 +0900
+++ xen-unstable.hg/xen/arch/ia64/xen/machine_kexec.c	2008-01-16 20:05:59.000000000 +0900
@@ -33,7 +33,11 @@ typedef asmlinkage NORET_TYPE void (*rel
 					unsigned long cpu_data_pa,
 					unsigned long kernel_start,
 					unsigned long percpu_addr,
-					unsigned long page_offset,
+					unsigned long shared_info,
+					unsigned long shared_info_shift,
+					unsigned long priv_regs,
+					unsigned long priv_regs_shift,
+					unsigned long stack,
 					unsigned long vhpt)
 					ATTRIB_NORET;
 
@@ -54,6 +58,7 @@ void machine_kexec_unload(int type, int 
 
 static void ia64_machine_kexec(struct unw_frame_info *info, void *arg)
 {
+	struct vcpu *v = current;
 	xen_kexec_image_t *image = arg;
 	relocate_new_kernel_t rnk;
 	unsigned long code_addr = (unsigned long)
@@ -61,6 +66,7 @@ static void ia64_machine_kexec(struct un
 	unsigned long cpu_data_pa = (unsigned long)
 				  __pa(cpu_data(smp_processor_id()));
 	unsigned long vhpt;
+	unsigned long stack = 0UL;
 	int ii;
 
 	/* Interrupts aren't acceptable while we reboot */
@@ -88,16 +94,30 @@ static void ia64_machine_kexec(struct un
 	vhpt = vcpu_vhpt_maddr(current);
 	if (vhpt)
 		vhpt = __va_ul(vhpt);
+	// Clear stack if it doesn't overlap with kernel
+	if (((unsigned long)current & ~(KERNEL_TR_PAGE_SIZE-1)) != KERNEL_START)
+		stack = (unsigned long) current;
 	printk("vhpt=0x%016lx\n", vhpt);
 	printk("PERCPU_ADDR=0x%016lx\n", PERCPU_ADDR);
 	printk("pal_vaddr=0x%016lx\n", (unsigned long)pal_vaddr);
 	printk("GRANULEROUNDDOWN(pal_vaddr)=0x%016lx\n",
 	       GRANULEROUNDDOWN((unsigned long)pal_vaddr));
 	printk("current=0x%016lx\n", (unsigned long)current);
+	printk("stack=0x%016lx\n", stack);
+	printk("shared_info=0x%016lx\n",
+	       (unsigned long)v->domain->arch.shared_info_va);
+	printk("priv_regs=0x%016lx\n", (unsigned long)XMAPPEDREGS_OFS);
 	rnk = (relocate_new_kernel_t)&code_addr;
+	// XXX: Assumes IA64_GRANULE_SHIFT (and others?) are the
+	// same for xen and xen-linux
 	(*rnk)(image->indirection_page, image->start_address, ia64_boot_param,
 	       GRANULEROUNDDOWN((unsigned long) pal_vaddr), cpu_data_pa,
-	       KERNEL_START, PERCPU_ADDR, PAGE_OFFSET, vhpt);
+	       KERNEL_START, PERCPU_ADDR,
+	       (unsigned long)v->domain->arch.shared_info_va,
+	       (unsigned long)XSI_SHIFT,
+	       (unsigned long)v->domain->arch.shared_info_va +
+	       	(unsigned long)XMAPPEDREGS_OFS,
+	       (unsigned long)XMAPPEDREGS_SHIFT, stack, vhpt);
 	BUG();
 }
 
