# HG changeset patch # User dietmar.hahn@xxxxxxxxxxxxxxxxxxx # Node ID 61d2e87c9d4e8a32b2aadaa205fde6d2f3ec136e # Parent 40608e5e394ee4bcc5b68a4cbf49973f39327981 Clear the key part of cr.itir before itc.X in alt_dtlb_miss(), alt_itlb_miss() and frametable_miss(). Preparation for using protection keys. Signed-off-by: Dietmar Hahn diff -r 40608e5e394e -r 61d2e87c9d4e xen/arch/ia64/xen/ivt.S --- a/xen/arch/ia64/xen/ivt.S Mon Jul 2 21:06:46 2007 -0600 +++ b/xen/arch/ia64/xen/ivt.S Wed Jul 4 13:06:24 2007 +0200 @@ -147,6 +147,7 @@ ENTRY(alt_itlb_miss) ENTRY(alt_itlb_miss) DBG_FAULT(3) mov r16=cr.ifa // get address that caused the TLB miss + mov r20=cr.itir mov r31=pr ;; late_alt_itlb_miss: @@ -160,8 +161,10 @@ late_alt_itlb_miss: ;; cmp.ne p8,p0=r0,r23 // psr.cpl != 0? or r19=r17,r19 // insert PTE control bits into r19 + dep r20=0,r20,IA64_ITIR_KEY,IA64_ITIR_KEY_LEN /* clear the key */ ;; dep r19=r18,r19,4,1 // set bit 4 (uncached) if access to UC area. + mov cr.itir=r20 // set itir with cleared key (p8) br.cond.spnt page_fault ;; itc.i r19 // insert the TLB entry @@ -195,6 +198,7 @@ late_alt_dtlb_miss: (p9) cmp.eq.or.andcm p6,p7=IA64_ISR_CODE_LFETCH,r22 // check isr.code field (p8) br.cond.spnt page_fault ;; + mov r20=cr.itir #ifdef CONFIG_VIRTUAL_FRAME_TABLE shr r22=r16,56 // Test for the address of virtual frame_table ;; @@ -204,11 +208,13 @@ late_alt_dtlb_miss: // If it is not a Xen address, handle it via page_fault. 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 (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 (p6) mov cr.ipsr=r21 @@ -242,7 +248,7 @@ GLOBAL_ENTRY(frametable_miss) shladd r24=r19,3,r24 // r24=&pte[pte_offset(addr)] ;; (p7) ld8 r24=[r24] // r24=pte[pte_offset(addr)] - mov r25=0x700|(PAGE_SHIFT<<2) // key=7 + mov r25=(PAGE_SHIFT<