Index: xen-unstable.hg/xen/arch/ia64/xen/regionreg.c
===================================================================
--- xen-unstable.hg.orig/xen/arch/ia64/xen/regionreg.c	2007-12-08 12:00:24.000000000 +0900
+++ xen-unstable.hg/xen/arch/ia64/xen/regionreg.c	2007-12-08 12:00:37.000000000 +0900
@@ -224,6 +224,12 @@ int deallocate_rid_range(struct domain *
 static void
 set_rr(unsigned long rr, unsigned long rrval)
 {
+	unsigned long a, b;
+	a = ia64_get_rr(rr);
+	b = vmMangleRID(rrval);
+	if (a != b)
+		printk("%s: cpu=%d rr%d=0x%016lx->0x%016lx\n",
+		       __func__, smp_processor_id(), rr >> 61, a, b);
 	ia64_set_rr(rr, vmMangleRID(rrval));
 	ia64_srlz_d();
 }
@@ -263,6 +269,12 @@ int set_one_rr(unsigned long rr, unsigne
 		if (!PSCB(v,metaphysical_mode))
 			set_rr(rr,newrrv.rrval);
 	} else if (rreg == 7) {
+		unsigned long a, b;
+		a = ia64_get_rr(7UL << 61);
+		b = vmMangleRID(newrrv.rrval);
+		if (a != b)
+			printk("%s: cpu=%d rr7=0x%016lx->0x%016lx\n",
+			       __func__, smp_processor_id(), a, b);
 		ia64_new_rr7(vmMangleRID(newrrv.rrval),v->domain->shared_info,
 			     v->arch.privregs, v->domain->arch.shared_info_va,
 		             __va_ul(vcpu_vhpt_maddr(v)));
Index: xen-unstable.hg/xen/arch/ia64/linux-xen/process-linux-xen.c
===================================================================
--- xen-unstable.hg.orig/xen/arch/ia64/linux-xen/process-linux-xen.c	2007-12-08 12:00:24.000000000 +0900
+++ xen-unstable.hg/xen/arch/ia64/linux-xen/process-linux-xen.c	2007-12-08 12:00:37.000000000 +0900
@@ -56,6 +56,7 @@
 #include <asm/uaccess.h>
 #include <asm/unwind.h>
 #include <asm/user.h>
+#include <asm/mca.h>
 
 #include "entry.h"
 
@@ -242,6 +243,9 @@ default_idle (void)
 }
 #endif
 
+DECLARE_PER_CPU(u64, ia64_mca_pal_base);
+DECLARE_PER_CPU(u64, vhpt_paddr);
+
 #ifdef CONFIG_HOTPLUG_CPU
 /* We don't actually take CPU down, just spin without interrupts. */
 #ifndef XEN
@@ -258,6 +262,13 @@ void play_dead(void)
 
 	max_xtp();
 	local_irq_disable();
+	printk("%s: cpu=%d rr7=0x%016lx\n", __func__, this_cpu,
+	       ia64_get_rr(7UL << 61));
+	printk("KERNEL_START=%016lx\n", KERNEL_START);
+	printk("PERCPU_ADDR=%016lx\n", PERCPU_ADDR);
+	printk("ia64_mca_pal_base=%016lx\n", __get_cpu_var(ia64_mca_pal_base));
+	printk("cpu_kr=%016lx\n", __get_cpu_var(cpu_kr));
+	printk("vhpt_paddr=%016lx\n", __get_cpu_var(vhpt_paddr));
 	ia64_jump_to_sal(&sal_boot_rendez_state[this_cpu]);
 	/*
 	 * The above is a point of no-return, the processor is
Index: xen-unstable.hg/xen/arch/ia64/xen/machine_kexec.c
===================================================================
--- xen-unstable.hg.orig/xen/arch/ia64/xen/machine_kexec.c	2007-12-08 12:00:24.000000000 +0900
+++ xen-unstable.hg/xen/arch/ia64/xen/machine_kexec.c	2007-12-08 12:00:37.000000000 +0900
@@ -87,6 +87,8 @@ static void ia64_machine_kexec(struct un
 	vhpt = __va_ul(vcpu_vhpt_maddr(current));
 	BUG_ON(!vhpt);
 	rnk = (relocate_new_kernel_t)&code_addr;
+	printk("%s: cpu=%d rr7=0x%016lx\n", __func__, smp_processor_id(),
+	       ia64_get_rr(7UL << 61));
 	(*rnk)(image->indirection_page, image->start_address, ia64_boot_param,
 	       GRANULEROUNDDOWN((unsigned long) pal_vaddr), cpu_data_pa,
 	       KERNEL_START, PAGE_OFFSET, vhpt);
Index: xen-unstable.hg/xen/arch/ia64/vmx/vmx_phy_mode.c
===================================================================
--- xen-unstable.hg.orig/xen/arch/ia64/vmx/vmx_phy_mode.c	2007-12-08 12:00:24.000000000 +0900
+++ xen-unstable.hg/xen/arch/ia64/vmx/vmx_phy_mode.c	2007-12-08 12:00:37.000000000 +0900
@@ -169,6 +169,10 @@ vmx_load_all_rr(VCPU *vcpu)
 	ia64_dv_serialize_data();
 	ia64_set_rr((VRN6 << VRN_SHIFT), vrrtomrr(vcpu, VMX(vcpu, vrr[VRN6])));
 	ia64_dv_serialize_data();
+	if (vrrtomrr(vcpu,VMX(vcpu, vrr[VRN7]) != ia64_get_rr(7UL << 61)))
+		printk("%s: cpu=%d rr7=0x%016lx->0x%016lx\n", __func__,
+		       smp_processor_id(), ia64_get_rr(7UL << 61),
+		       vrrtomrr(vcpu,VMX(vcpu, vrr[VRN7])));
 	vmx_switch_rr7(vrrtomrr(vcpu,VMX(vcpu, vrr[VRN7])),
 		       (void *)vcpu->arch.vhpt.hash, pal_vaddr);
 	ia64_set_pta(VMX(vcpu, mpta));
Index: xen-unstable.hg/xen/include/asm-ia64/linux-xen/asm/gcc_intrin.h
===================================================================
--- xen-unstable.hg.orig/xen/include/asm-ia64/linux-xen/asm/gcc_intrin.h	2007-12-08 12:00:24.000000000 +0900
+++ xen-unstable.hg/xen/include/asm-ia64/linux-xen/asm/gcc_intrin.h	2007-12-08 12:00:37.000000000 +0900
@@ -427,8 +427,17 @@ register unsigned long ia64_r13 asm ("r1
 #define ia64_set_pmd(index, val)						\
 	asm volatile ("mov pmd[%0]=%1" :: "r"(index), "r"(val) : "memory")
 
-#define ia64_set_rr(index, val)							\
-	asm volatile ("mov rr[%0]=%1" :: "r"(index), "r"(val) : "memory");
+#define ia64_set_rr(index, val)						\
+do {									\
+	static int done[8] = { 0, 0, 0, 0, 0, 0, 0, 0};			\
+	if (!done[index >> 61] && ia64_get_rr(index) != val)		\
+		printk("%s: ia64_set_rr: ia64_set_rr cpu=%d index=%d "	\
+		       "rr=0x%016lx->0x%016lx\n", __func__,		\
+		       smp_processor_id(), index >> 61,			\
+		       ia64_get_rr(index), val);			\
+	done[index >> 61] = 1;						\
+	asm volatile ("mov rr[%0]=%1" :: "r"(index), "r"(val) : "memory"); \
+} while (0)
 
 #define ia64_get_cpuid(index)								\
 ({											\
