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

[Xen-changelog] [xen-unstable] [IA64] Support multiple page sizes in VHPT



# HG changeset patch
# User awilliam@xxxxxxxxxxx
# Node ID 9e9d8696fb553784750237d77119d4785d057a68
# Parent  901083dace1dee72b5e207b844a00076312c3b9d
[IA64] Support multiple page sizes in VHPT

Enable VHPT support for multiple page sizes.

Signed-off-by: Anthony Xu <anthony.xu@xxxxxxxxx>
---
 xen/arch/ia64/vmx/vmmu.c            |    8 +++++---
 xen/arch/ia64/vmx/vmx_ivt.S         |   16 ++++++++++++----
 xen/arch/ia64/vmx/vmx_phy_mode.c    |    4 ++--
 xen/arch/ia64/vmx/vmx_process.c     |    4 ++--
 xen/arch/ia64/vmx/vtlb.c            |   36 +++++++++++++++++++++++++++---------
 xen/include/asm-ia64/mm.h           |    4 ++++
 xen/include/asm-ia64/vmmu.h         |    3 ++-
 xen/include/asm-ia64/vmx_phy_mode.h |    2 +-
 8 files changed, 55 insertions(+), 22 deletions(-)

diff -r 901083dace1d -r 9e9d8696fb55 xen/arch/ia64/vmx/vmmu.c
--- a/xen/arch/ia64/vmx/vmmu.c  Tue Oct 24 09:22:56 2006 -0600
+++ b/xen/arch/ia64/vmx/vmmu.c  Tue Oct 24 09:49:31 2006 -0600
@@ -341,9 +341,9 @@ fetch_code(VCPU *vcpu, u64 gip, IA64_BUN
             ia64_ptcl(gip, ARCH_PAGE_SHIFT << 2);
             return IA64_RETRY;
         }
-        mfn = tlb->ppn >> (PAGE_SHIFT - ARCH_PAGE_SHIFT);
         maddr = (tlb->ppn >> (tlb->ps - 12) << tlb->ps) |
                 (gip & (PSIZE(tlb->ps) - 1));
+        mfn = maddr >> PAGE_SHIFT;
     }
 
     page = mfn_to_page(mfn);
@@ -637,7 +637,7 @@ IA64FAULT vmx_vcpu_tpa(VCPU *vcpu, u64 v
     thash_data_t *data;
     ISR visr,pt_isr;
     REGS *regs;
-    u64 vhpt_adr;
+    u64 vhpt_adr, madr;
     IA64_PSR vpsr;
     regs=vcpu_regs(vcpu);
     pt_isr.val=VMX(vcpu,cr_isr);
@@ -673,7 +673,9 @@ IA64FAULT vmx_vcpu_tpa(VCPU *vcpu, u64 v
             dnat_page_consumption(vcpu, vadr);
             return IA64_FAULT;
         }else{
-            *padr = (get_gpfn_from_mfn(arch_to_xen_ppn(data->ppn)) << 
PAGE_SHIFT) | (vadr & (PAGE_SIZE - 1));
+            madr = (data->ppn >> (data->ps - 12) << data->ps) |
+                   (vadr & (PSIZE(data->ps) - 1));
+            *padr = __mpa_to_gpa(madr);
             return IA64_NO_FAULT;
         }
     }
diff -r 901083dace1d -r 9e9d8696fb55 xen/arch/ia64/vmx/vmx_ivt.S
--- a/xen/arch/ia64/vmx/vmx_ivt.S       Tue Oct 24 09:22:56 2006 -0600
+++ b/xen/arch/ia64/vmx/vmx_ivt.S       Tue Oct 24 09:49:31 2006 -0600
@@ -172,13 +172,17 @@ vmx_itlb_loop:
     ld8 r27 = [r18]
     ld8 r29 = [r28]
     ;;
-    st8 [r16] = r29
-    st8 [r28] = r22
+    st8 [r16] = r29, VLE_ITIR_OFFSET - VLE_TITAG_OFFSET
+    st8 [r28] = r22, VLE_ITIR_OFFSET - VLE_TITAG_OFFSET
     extr.u r19 = r27, 56, 4
     ;;
+    ld8 r29 = [r16]
+    ld8 r22 = [r28]
     dep r27 = r0, r27, 56, 4
     dep r25 = r19, r25, 56, 4
     ;;
+    st8 [r16] = r22
+    st8 [r28] = r29
     st8 [r18] = r25
     st8 [r17] = r27
     ;;
@@ -246,13 +250,17 @@ vmx_dtlb_loop:
     ld8 r27 = [r18]
     ld8 r29 = [r28]
     ;;
-    st8 [r16] = r29
-    st8 [r28] = r22
+    st8 [r16] = r29, VLE_ITIR_OFFSET - VLE_TITAG_OFFSET
+    st8 [r28] = r22, VLE_ITIR_OFFSET - VLE_TITAG_OFFSET
     extr.u r19 = r27, 56, 4
     ;;
+    ld8 r29 = [r16]
+    ld8 r22 = [r28]
     dep r27 = r0, r27, 56, 4
     dep r25 = r19, r25, 56, 4
     ;;
+    st8 [r16] = r22
+    st8 [r28] = r29
     st8 [r18] = r25
     st8 [r17] = r27
     ;;    
diff -r 901083dace1d -r 9e9d8696fb55 xen/arch/ia64/vmx/vmx_phy_mode.c
--- a/xen/arch/ia64/vmx/vmx_phy_mode.c  Tue Oct 24 09:22:56 2006 -0600
+++ b/xen/arch/ia64/vmx/vmx_phy_mode.c  Tue Oct 24 09:49:31 2006 -0600
@@ -107,7 +107,7 @@ extern void vmx_switch_rr7(unsigned long
 extern void vmx_switch_rr7(unsigned long ,shared_info_t*,void *,void *,void *);
 
 void
-physical_tlb_miss(VCPU *vcpu, u64 vadr)
+physical_tlb_miss(VCPU *vcpu, u64 vadr, int type)
 {
     u64 pte;
     ia64_rr rr;
@@ -117,7 +117,7 @@ physical_tlb_miss(VCPU *vcpu, u64 vadr)
         pte = pte | PHY_PAGE_UC;
     else
         pte = pte | PHY_PAGE_WB;
-    thash_vhpt_insert(vcpu, pte, (rr.ps << 2), vadr);
+    thash_vhpt_insert(vcpu, pte, (rr.ps << 2), vadr, type);
     return;
 }
 
diff -r 901083dace1d -r 9e9d8696fb55 xen/arch/ia64/vmx/vmx_process.c
--- a/xen/arch/ia64/vmx/vmx_process.c   Tue Oct 24 09:22:56 2006 -0600
+++ b/xen/arch/ia64/vmx/vmx_process.c   Tue Oct 24 09:49:31 2006 -0600
@@ -288,7 +288,7 @@ vmx_hpw_miss(u64 vadr , u64 vec, REGS* r
                 return IA64_FAULT;
             }
         }
-        physical_tlb_miss(v, vadr);
+        physical_tlb_miss(v, vadr, type);
         return IA64_FAULT;
     }
 
@@ -306,7 +306,7 @@ vmx_hpw_miss(u64 vadr , u64 vec, REGS* r
                 return IA64_FAULT;
             }
         }
-        thash_vhpt_insert(v,data->page_flags, data->itir ,vadr);
+        thash_vhpt_insert(v, data->page_flags, data->itir, vadr, type);
 
     }else if(type == DSIDE_TLB){
     
diff -r 901083dace1d -r 9e9d8696fb55 xen/arch/ia64/vmx/vtlb.c
--- a/xen/arch/ia64/vmx/vtlb.c  Tue Oct 24 09:22:56 2006 -0600
+++ b/xen/arch/ia64/vmx/vtlb.c  Tue Oct 24 09:49:31 2006 -0600
@@ -178,11 +178,23 @@ static void vmx_vhpt_insert(thash_cb_t *
     return;
 }
 
-void thash_vhpt_insert(VCPU *v, u64 pte, u64 itir, u64 va)
-{
-    u64 phy_pte;
+void thash_vhpt_insert(VCPU *v, u64 pte, u64 itir, u64 va, int type)
+{
+    u64 phy_pte, psr;
+    ia64_rr mrr;
+
+    mrr.rrval = ia64_get_rr(va);
     phy_pte=translate_phy_pte(v, &pte, itir, va);
-    vmx_vhpt_insert(vcpu_get_vhpt(v), phy_pte, itir, va);
+
+    if (itir_ps(itir) >= mrr.ps) {
+        vmx_vhpt_insert(vcpu_get_vhpt(v), phy_pte, itir, va);
+    } else {
+        phy_pte  &= ~PAGE_FLAGS_RV_MASK;
+        psr = ia64_clear_ic();
+        ia64_itc(type + 1, va, phy_pte, itir_ps(itir));
+        ia64_set_psr(psr);
+        ia64_srlz_i();
+    }
 }
 /*
  *   vhpt lookup
@@ -191,7 +203,7 @@ thash_data_t * vhpt_lookup(u64 va)
 thash_data_t * vhpt_lookup(u64 va)
 {
     thash_data_t *hash, *head;
-    u64 tag, pte;
+    u64 tag, pte, itir;
     head = (thash_data_t *)ia64_thash(va);
     hash=head;
     tag = ia64_ttag(va);
@@ -207,6 +219,9 @@ thash_data_t * vhpt_lookup(u64 va)
         tag = hash->etag;
         hash->etag = head->etag;
         head->etag = tag;
+        itir = hash->itir;
+        hash->itir = head->itir;
+        head->itir = itir;
         head->len = hash->len;
         hash->len=0;
         return head;
@@ -223,7 +238,8 @@ u64 guest_vhpt_lookup(u64 iha, u64 *pte)
     if (data == NULL) {
         data = vtlb_lookup(current, iha, DSIDE_TLB);
         if (data != NULL)
-            thash_vhpt_insert(current, data->page_flags, data->itir ,iha);
+            thash_vhpt_insert(current, data->page_flags, data->itir,
+                              iha, DSIDE_TLB);
     }
 
     asm volatile ("rsm psr.ic|psr.i;;"
@@ -607,7 +623,8 @@ void thash_init(thash_cb_t *hcb, u64 sz)
     head=hcb->hash;
     num = (hcb->hash_sz/sizeof(thash_data_t));
     do{
-        head->itir = PAGE_SHIFT<<2;
+        head->page_flags = 0;
+        head->itir = 0;
         head->etag = 1UL<<63;
         head->next = 0;
         head++;
@@ -617,11 +634,12 @@ void thash_init(thash_cb_t *hcb, u64 sz)
     hcb->cch_freelist = p = hcb->cch_buf;
     num = (hcb->cch_sz/sizeof(thash_data_t))-1;
     do{
-        p->itir = PAGE_SHIFT<<2;
+        p->page_flags = 0;
+        p->itir = 0;
         p->next =p+1;
         p++;
         num--;
     }while(num);
-    p->itir = PAGE_SHIFT<<2;
+    p->itir = 0;
     p->next = NULL;
 }
diff -r 901083dace1d -r 9e9d8696fb55 xen/include/asm-ia64/mm.h
--- a/xen/include/asm-ia64/mm.h Tue Oct 24 09:22:56 2006 -0600
+++ b/xen/include/asm-ia64/mm.h Tue Oct 24 09:49:31 2006 -0600
@@ -497,6 +497,10 @@ extern u64 translate_domain_pte(u64 ptev
 #define __gpa_to_mpa(_d, gpa)   \
     ((gmfn_to_mfn((_d),(gpa)>>PAGE_SHIFT)<<PAGE_SHIFT)|((gpa)&~PAGE_MASK))
 
+#define __mpa_to_gpa(madr) \
+    ((get_gpfn_from_mfn((madr) >> PAGE_SHIFT) << PAGE_SHIFT) | \
+    ((madr) & ~PAGE_MASK))
+
 /* Arch-specific portion of memory_op hypercall. */
 long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg);
 
diff -r 901083dace1d -r 9e9d8696fb55 xen/include/asm-ia64/vmmu.h
--- a/xen/include/asm-ia64/vmmu.h       Tue Oct 24 09:22:56 2006 -0600
+++ b/xen/include/asm-ia64/vmmu.h       Tue Oct 24 09:49:31 2006 -0600
@@ -305,7 +305,8 @@ extern int vhpt_enabled(struct vcpu *vcp
 extern int vhpt_enabled(struct vcpu *vcpu, uint64_t vadr, vhpt_ref_t ref);
 extern void vtlb_insert(struct vcpu *vcpu, u64 pte, u64 itir, u64 va);
 extern u64 translate_phy_pte(struct vcpu *v, u64 *pte, u64 itir, u64 va);
-extern void thash_vhpt_insert(struct vcpu *v, u64 pte, u64 itir, u64 ifa);
+extern void thash_vhpt_insert(struct vcpu *v, u64 pte, u64 itir, u64 ifa,
+                              int type);
 extern u64 guest_vhpt_lookup(u64 iha, u64 *pte);
 
 static inline void vmx_vcpu_set_tr (thash_data_t *trp, u64 pte, u64 itir, u64 
va, u64 rid)
diff -r 901083dace1d -r 9e9d8696fb55 xen/include/asm-ia64/vmx_phy_mode.h
--- a/xen/include/asm-ia64/vmx_phy_mode.h       Tue Oct 24 09:22:56 2006 -0600
+++ b/xen/include/asm-ia64/vmx_phy_mode.h       Tue Oct 24 09:49:31 2006 -0600
@@ -96,7 +96,7 @@ extern void recover_if_physical_mode(VCP
 extern void recover_if_physical_mode(VCPU *vcpu);
 extern void vmx_init_all_rr(VCPU *vcpu);
 extern void vmx_load_all_rr(VCPU *vcpu);
-extern void physical_tlb_miss(VCPU *vcpu, u64 vadr);
+extern void physical_tlb_miss(VCPU *vcpu, u64 vadr, int type);
 /*
  * No sanity check here, since all psr changes have been
  * checked in switch_mm_mode().

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


 


Rackspace

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