[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-ia64-devel] [patch 4/7] IA64: Kexec: Simplify EFI RID assembly



This patch reduces the ammount of assembly code required
to handle EFI RID by having the three relevant page fault handlers
use some common code.

Cc: Tristan Gingold <tgingold@xxxxxxx>
Cc: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
Signed-off-by: Simon Horman <horms@xxxxxxxxxxxx>

Index: xen-unstable.hg/xen/arch/ia64/xen/ivt.S
===================================================================
--- xen-unstable.hg.orig/xen/arch/ia64/xen/ivt.S        2007-10-29 
09:40:23.000000000 +0900
+++ xen-unstable.hg/xen/arch/ia64/xen/ivt.S     2007-10-29 11:18:24.000000000 
+0900
@@ -115,36 +115,17 @@ ENTRY(itlb_miss)
        DBG_FAULT(1)
        mov r16 = cr.ifa
        mov r31 = pr
-       ;;
-       extr.u r17=r16,59,5
-       ;;
        /* If address belongs to VMM, go to alt tlb handler */
-       cmp.eq p6,p0=0x1e,r17
-(p6)   br.cond.spnt    late_alt_itlb_miss
-
-       // If it is an EFI address then must have XEN_EFI_RID set
-       // And if that is true, go to alt tlb handler
-       // (r17 == 0x18 && rr[6] == XEN_EFI_RID) ||
-       // (r17 == 0x1c && rr[7] == XEN_EFI_RID)
-       mov r23=6
-       mov r24=7
+       movl r26=itlb_miss_identity_map
+       movl r27=fast_tlb_miss_reflect
        ;;
-       mov r23=rr[r23]
-       mov r24=rr[r24]
+       br.cond.spnt branch_on_xen_memory
        ;;
-       mov r25=XEN_EFI_RID
-       cmp.eq p8,p0=0x18,r17           // 0xc...
-       cmp.eq p9,p0=0x1c,r17           // 0xe...
-       ;;
-       cmp.ne.and p8,p0=r25,r23        // rr[6] == XEN_EFI_RID
-       cmp.ne.and p9,p0=r25,r24        // rr[7] == XEN_EFI_RID
-       ;;
-(p8)   br.cond.spnt fast_tlb_miss_reflect
-(p9)   br.cond.spnt fast_tlb_miss_reflect
-
-       // EFI PAGE size is IA64_GRANULE_SIZE
-       // itir's key should be 0, as should the reserved space
-       // thus we can just set itir = (IA64_GRANULE_SHIFT << 2)
+itlb_miss_identity_map:
+       /* EFI PAGE size is IA64_GRANULE_SIZE
+        * itir's key should be 0, as should the reserved space
+        * thus we can just set itir = (IA64_GRANULE_SHIFT << 2)
+        */
        movl r20=IA64_GRANULE_SHIFT
        ;;
        shl r20=r20,2
@@ -152,48 +133,6 @@ ENTRY(itlb_miss)
        mov cr.itir=r20
        ;;
        br.cond.sptk late_alt_itlb_miss
-
-#if 0
-       mov r21=cr.ipsr
-       ;;
-       extr.u r23=r21,IA64_PSR_CPL0_BIT,2      // extract psr.cpl
-       ;;
-       cmp.ne p8,p0=r0,r23     // psr.cpl != 0
-       ;;
-(p8)   br.cond.spnt page_fault
-       ;;
-
-       // EFI PAGE size is IA64_GRANULE_SIZE
-       // itir's key should be 0, as should the reserved space
-       // thus we can just set itir = (IA64_GRANULE_SHIFT << 2)
-       movl r20=IA64_GRANULE_SHIFT
-       ;;
-       shl r20=r20,2
-       ;;
-       mov cr.itir=r20
-       ;;
-
-       movl r17=PAGE_KERNEL
-       movl r19=(((1 << IA64_MAX_PHYS_BITS) - 1) & ~0xfff)
-       ;;
-       and r19=r19,r16         // clear ed, reserved bits, and PTE ctrl bits
-       ;;
-       or r19=r17,r19          // insert PTE control bits into r19
-       ;;
-
-       cmp.ne p8,p0=r0,r18             // Xen UC bit set
-       ;;
-       cmp.eq.or p8,p0=0x18,r22        // Region 6 is UC for EFI
-       ;;
-(p8)   dep r19=-1,r19,4,1      // set bit 4 (uncached) if access to UC area
-       ;;
-
-       itc.i r19               // insert the TLB entry
-       mov pr=r31,-1
-       rfi
-       ;;
-#endif
-
 END(itlb_miss)
 
        .org ia64_ivt+0x0800
@@ -203,36 +142,10 @@ ENTRY(dtlb_miss)
        DBG_FAULT(2)
        mov r16=cr.ifa                  // get virtual address
        mov r31=pr
+       movl r26=late_alt_dtlb_miss
+       movl r27=fast_tlb_miss_reflect
        ;;
-       extr.u r17=r16,59,5
-       ;;
-       /* If address belongs to VMM, go to alt tlb handler */
-       cmp.eq p6,p0=0x1e,r17
-(p6)   br.cond.spnt    late_alt_dtlb_miss
-
-       // If it is an EFI address then must have XEN_EFI_RID set
-       // And if that is true, go to alt tlb handler
-       // (r17 == 0x18 && rr[6] == XEN_EFI_RID) ||
-       // (r17 == 0x1c && rr[7] == XEN_EFI_RID)
-       mov r23=6
-       mov r24=7
-       ;;
-       mov r23=rr[r23]
-       mov r24=rr[r24]
-       ;;
-       mov r25=XEN_EFI_RID
-       cmp.eq p8,p0=0x18,r17           // 0xc...
-       cmp.eq p9,p0=0x1c,r17           // 0xe...
-       ;;
-       cmp.eq.and p8,p0=r25,r23        // rr[6] == XEN_EFI_RID
-       cmp.eq.and p9,p0=r25,r24        // rr[7] == XEN_EFI_RID
-       ;;
-(p8)   br.cond.spnt late_alt_dtlb_miss
-(p9)   br.cond.spnt late_alt_dtlb_miss
-       ;;
-
-       br.cond.sptk fast_tlb_miss_reflect
-       ;;
+       br.cond.spnt branch_on_xen_memory
 END(dtlb_miss)
 
        .org ia64_ivt+0x0c00
@@ -266,6 +179,35 @@ late_alt_itlb_miss:
        rfi
 END(alt_itlb_miss)
 
+// If it is not a Xen address, handle it via page_fault.
+//    !( ((r22 == 0x18 || r22 == 0x1c) && rr[6] == XEN_EFI_RID) ||
+//      r22 == 0x1e )
+// Note that rr[6] == XEN_EFI_RID implies rr[7] == XEN_EFI_RID
+//
+// in:  r26 = Branch if a XEN address
+//     r27 = Branch otherwise
+// out: r22 = address << 60
+//      r23 = rr[6]
+//     r24 = XEN_EFI_RID
+branch_on_xen_memory:
+       extr.u r22=r16,59,5
+       mov r25=XEN_EFI_RID
+       ;;
+       cmp.eq p8,p0=0x18,r22           // address == 0xc...
+       mov r23=6
+       ;;
+       cmp.eq.or p8,p0=0x1c,r22        // address == 0xe...
+       mov r23=rr[r23]
+       ;;
+       cmp.eq.and p8,p0=r25,r23        // rr[6] == XEN_EFI_RID
+       mov b1=r26
+       ;;
+       cmp.eq.or p8,p0=0x1e,r22        // address == 0xf...
+       mov b2=r27
+       ;;
+(p8)   br.cond.spnt b1
+       br.cond.spnt b2
+
        .org ia64_ivt+0x1000
 //////////////////////////////////////////////////////////////////////////
 // 0x1000 Entry 4 (size 64 bundles) Alt DTLB (7,46)
@@ -299,29 +241,11 @@ late_alt_dtlb_miss:
        cmp.eq p8,p0=((VIRT_FRAME_TABLE_ADDR>>56)&0xff)-0x100,r22
 (p8)   br.cond.sptk frametable_miss ;;
 #endif
-       // If it is not a Xen address, handle it via page_fault.
-       // If it is not a Xen address, handle it via page_fault.
-       //    !( ((r22 == 0x18 || r22 == 0x1c) && rr[6] == XEN_EFI_RID) ||
-       //       r22 == 0x1e )
-       // Note that rr[6] == XEN_EFI_RID implies rr[7] == XEN_EFI_RID
-       extr.u r22=r16,59,5
+       movl r26=alt_dtlb_miss_identity_map
+       movl r27=page_fault
        ;;
        dep r20=0,r20,IA64_ITIR_KEY,IA64_ITIR_KEY_LEN   // clear the key
-       mov r23=6
-       ;;
-       mov r23=rr[r23]
-       ;;
-       mov r25=XEN_EFI_RID
-       cmp.eq p8,p0=0x18,r22           // 0xc...
-       ;;
-       cmp.eq.or p8,p0=0x1c,r22        // 0xe...
-       ;;
-       cmp.eq.and p8,p0=r25,r23        // rr[6] == XEN_EFI_RID
-       ;;
-       cmp.eq.or p8,p0=0x1e,r22        // 0xf...
-       ;;
-(p8)   br.cond.spnt alt_dtlb_miss_identity_map
-       br.cond.spnt page_fault
+       br.cond.spnt branch_on_xen_memory
        ;;
 alt_dtlb_miss_identity_map:
        dep r21=-1,r21,IA64_PSR_ED_BIT,1

-- 

-- 
Horms
  H: http://www.vergenet.net/~horms/
  W: http://www.valinux.co.jp/en/


_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.