Subject: [IA64] Kexec: Handle alt_dtlb_miss for EFI in assembly
Date: Tue, 11 Sep 2007 17:33:56 +0900
From: Simon Horman <horms@verge.net.au>

I have _no_ idea why, but for some reason
branching to page_fault and in turn ia64_do_page_fault (C)
does not work in this case.

Signed-off-by: Simon Horman <horms@verge.net.au>

Index: xen-unstable.hg/xen/arch/ia64/xen/ivt.S
===================================================================
--- xen-unstable.hg.orig/xen/arch/ia64/xen/ivt.S	2007-09-10 14:51:51.000000000 +0900
+++ xen-unstable.hg/xen/arch/ia64/xen/ivt.S	2007-09-10 14:58:17.000000000 +0900
@@ -209,14 +209,23 @@ late_alt_dtlb_miss:
 	extr.u r22=r16,59,5
 	;;
 	dep r20=0,r20,IA64_ITIR_KEY,IA64_ITIR_KEY_LEN	// clear the key
-	cmp.ne p8,p0=0x1e,r22
+	cmp.ne p8,p0=0x1e,r22		// 0xf...
+	;;
+	cmp.ne.and p8,p0=0x18,r22	// 0xc...
+	;;
+	cmp.ne.and p8,p0=0x1c,r22	// 0xe...
+	;;
 (p8)	br.cond.sptk page_fault
 	;;
 	dep r21=-1,r21,IA64_PSR_ED_BIT,1
 	or r19=r19,r17		// insert PTE control bits into r19
 	mov cr.itir=r20		// set itir with cleared key
 	;;
-	dep r19=r18,r19,4,1	// set bit 4 (uncached) if access to UC area
+	cmp.ne p8,p0=r0,r18		// Xen UC bit set
+	;;
+	cmp.eq.or p8,p0=0x18,r22 	// Region 6 is UC for Linux
+	;;
+(p8)	dep r19=-1,r19,4,1	// set bit 4 (uncached) if access to UC area
 (p6)	mov cr.ipsr=r21
 	;;
 (p7)	itc.d r19		// insert the TLB entry
