Index: xen-unstable.hg/xen/arch/ia64/xen/machine_kexec.c
===================================================================
--- xen-unstable.hg.orig/xen/arch/ia64/xen/machine_kexec.c	2008-01-15 17:48:33.000000000 +0900
+++ xen-unstable.hg/xen/arch/ia64/xen/machine_kexec.c	2008-01-16 20:06:35.000000000 +0900
@@ -32,6 +32,7 @@ typedef asmlinkage NORET_TYPE void (*rel
 					unsigned long pal_addr,
 					unsigned long cpu_data_pa,
 					unsigned long kernel_start,
+					unsigned long percpu_addr,
 					unsigned long page_offset,
 					unsigned long vhpt)
 					ATTRIB_NORET;
@@ -84,12 +85,19 @@ static void ia64_machine_kexec(struct un
 	while (ia64_get_ivr() != IA64_SPURIOUS_INT_VECTOR)
 		ia64_eoi();
 	platform_kernel_launch_event();
-	vhpt = __va_ul(vcpu_vhpt_maddr(current));
-	BUG_ON(!vhpt);
+	vhpt = vcpu_vhpt_maddr(current);
+	if (vhpt)
+		vhpt = __va_ul(vhpt);
+	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);
 	rnk = (relocate_new_kernel_t)&code_addr;
 	(*rnk)(image->indirection_page, image->start_address, ia64_boot_param,
 	       GRANULEROUNDDOWN((unsigned long) pal_vaddr), cpu_data_pa,
-	       KERNEL_START, PAGE_OFFSET, vhpt);
+	       KERNEL_START, PERCPU_ADDR, PAGE_OFFSET, vhpt);
 	BUG();
 }
 
