WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] Implement virtual short format VHPT walker

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] Implement virtual short format VHPT walker
From: BitKeeper Bot <riel@xxxxxxxxxxx>
Date: Wed, 25 May 2005 20:19:09 +0000
Delivery-date: Thu, 26 May 2005 18:00:51 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: Xen Development List <xen-devel@xxxxxxxxxxxxxxxxxxx>
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
ChangeSet 1.1509.1.4, 2005/05/25 14:19:09-06:00, djm@xxxxxxxxxxxxxxx

        Implement virtual short format VHPT walker
        
        Signed-off-by: Matthew Chapman <matthewc@xxxxxx>
        Signed-off by: Dan Magenheimer <dan.magenheimer@xxxxxx>



 patch/linux-2.6.11/kregs.h |    2 -
 process.c                  |   62 ++++++++++++++++++++++++++++++---------------
 vcpu.c                     |    4 +-
 3 files changed, 44 insertions(+), 24 deletions(-)


diff -Nru a/xen/arch/ia64/patch/linux-2.6.11/kregs.h 
b/xen/arch/ia64/patch/linux-2.6.11/kregs.h
--- a/xen/arch/ia64/patch/linux-2.6.11/kregs.h  2005-05-26 14:01:37 -04:00
+++ b/xen/arch/ia64/patch/linux-2.6.11/kregs.h  2005-05-26 14:01:37 -04:00
@@ -45,7 +45,7 @@
  #define IA64_ISR_CODE_LFETCH  4
  #define IA64_ISR_CODE_PROBEF  5
  
-+#ifdef CONFIG_VTI
++#ifdef XEN
 +/* Interruption Function State */
 +#define IA64_IFS_V_BIT                63
 +#define IA64_IFS_V    (__IA64_UL(1) << IA64_IFS_V_BIT)
@@ -60,6 +60,6 @@
 +#define IA64_PTA_SIZE   (__IA64_UL(0x3f) << IA64_PTA_SIZE_BIT)
 +#define IA64_PTA_VF     (__IA64_UL(1) << IA64_PTA_VF_BIT)
 +#define IA64_PTA_BASE   (__IA64_UL(0) - ((__IA64_UL(1) << IA64_PTA_BASE_BIT)))
-+#endif // CONFIG_VTI
++#endif
 +
  #endif /* _ASM_IA64_kREGS_H */
diff -Nru a/xen/arch/ia64/process.c b/xen/arch/ia64/process.c
--- a/xen/arch/ia64/process.c   2005-05-26 14:01:37 -04:00
+++ b/xen/arch/ia64/process.c   2005-05-26 14:01:37 -04:00
@@ -153,7 +153,8 @@
                }
                vector &= ~0xf;
                if (vector != IA64_DATA_TLB_VECTOR &&
-                   vector != IA64_ALT_DATA_TLB_VECTOR) {
+                   vector != IA64_ALT_DATA_TLB_VECTOR &&
+                   vector != IA64_VHPT_TRANS_VECTOR) {
 panic_domain(regs,"psr.ic off, delivering 
fault=%lx,iip=%p,ifa=%p,isr=%p,PSCB.iip=%p\n",
        vector,regs->cr_iip,ifa,isr,PSCB(ed,iip));
                        
@@ -167,15 +168,12 @@
                return;
 
        }
-       if ((vector & 0xf) != IA64_FORCED_IFA) PSCB(ed,ifa) = ifa;
-       else ifa = PSCB(ed,ifa);
+       if ((vector & 0xf) == IA64_FORCED_IFA)
+               ifa = PSCB(ed,tmp[0]);
        vector &= ~0xf;
-       if (vector == IA64_DATA_TLB_VECTOR
-               || vector == IA64_ALT_DATA_TLB_VECTOR
-               || vector == IA64_INST_TLB_VECTOR
-               || vector == IA64_ALT_INST_TLB_VECTOR) {
+       PSCB(ed,ifa) = ifa;
+       if (vector < IA64_DATA_NESTED_TLB_VECTOR) /* VHPT miss, TLB miss, Alt 
TLB miss */
                vcpu_thash(ed,ifa,&PSCB(current,iha));
-       }
        PSCB(ed,unat) = regs->ar_unat;  // not sure if this is really needed?
        PSCB(ed,precover_ifs) = regs->cr_ifs;
        vcpu_bsw0(ed);
@@ -320,7 +318,7 @@
        unsigned long psr = regs->cr_ipsr, mask, flags;
        unsigned long iip = regs->cr_iip;
        // FIXME should validate address here
-       unsigned long pteval, mpaddr;
+       unsigned long iha, pteval, mpaddr;
        unsigned long lookup_domain_mpa(struct domain *,unsigned long);
        unsigned long is_data = !((isr >> IA64_ISR_X_BIT) & 1UL);
        unsigned long vector;
@@ -346,8 +344,8 @@
                // FIXME should validate mpaddr here
                if (d == dom0) {
                        if (address < dom0_start || address >= dom0_start + 
dom0_size) {
-                               //printk("ia64_do_page_fault: out-of-bounds 
dom0 mpaddr %p, iip=%p! continuing...\n",address,iip);
-                               //printk("ia64_do_page_fault: out-of-bounds 
dom0 mpaddr %p, old iip=%p!\n",address,current->vcpu_info->arch.iip);
+                               printk("ia64_do_page_fault: out-of-bounds dom0 
mpaddr %p, iip=%p! continuing...\n",address,iip);
+                               printk("ia64_do_page_fault: out-of-bounds dom0 
mpaddr %p, old iip=%p!\n",address,current->vcpu_info->arch.iip);
                                tdpfoo();
                        }
                }
@@ -365,7 +363,7 @@
 
        if (handle_lazy_cover(current, isr, regs)) return;
 if (!(address>>61)) {
-panic_domain(0,"ia64_do_page_fault: @%p???, iip=%p, itc=%p 
(spinning...)\n",address,iip,ia64_get_itc());
+panic_domain(0,"ia64_do_page_fault: @%p???, iip=%p, b0=%p, itc=%p 
(spinning...)\n",address,iip,regs->b0,ia64_get_itc());
 }
        if ((isr & IA64_ISR_SP)
            || ((isr & IA64_ISR_NA) && (isr & IA64_ISR_CODE_MASK) == 
IA64_ISR_CODE_LFETCH))
@@ -378,9 +376,37 @@
                ia64_psr(regs)->ed = 1;
                return;
        }
-       vector = vcpu_get_rr_ve(current, address) ? 
-                       (is_data ? IA64_DATA_TLB_VECTOR : IA64_INST_TLB_VECTOR)
-                       : (is_data ? IA64_ALT_DATA_TLB_VECTOR : 
IA64_ALT_INST_TLB_VECTOR);
+
+       if (vcpu_get_rr_ve(current, address) && (PSCB(current,pta) & 
IA64_PTA_VE))
+       {
+               if (PSCB(current,pta) & IA64_PTA_VF)
+               {
+                       /* long format VHPT - not implemented */
+                       vector = is_data ? IA64_DATA_TLB_VECTOR : 
IA64_INST_TLB_VECTOR;
+               }
+               else
+               {
+                       /* short format VHPT */
+                       vcpu_thash(current, address, &iha);
+                       if (__copy_from_user(&pteval, iha, sizeof(pteval)) == 0)
+                       {
+                               /* 
+                                * Optimisation: this VHPT walker aborts on 
not-present pages
+                                * instead of inserting a not-present 
translation, this allows
+                                * vectoring directly to the miss handler.
+       \                        */
+                               if (pteval & _PAGE_P)
+                               {
+                                       pteval = 
translate_domain_pte(pteval,address,itir);
+                                       
vcpu_itc_no_srlz(current,is_data?2:1,address,pteval,-1UL,(itir>>2)&0x3f);
+                                       return;
+                               }
+                               else vector = is_data ? IA64_DATA_TLB_VECTOR : 
IA64_INST_TLB_VECTOR;
+                       }
+                       else vector = IA64_VHPT_TRANS_VECTOR;
+               }
+       }
+       else vector = is_data ? IA64_ALT_DATA_TLB_VECTOR : 
IA64_ALT_INST_TLB_VECTOR;
        reflect_interruption(address, isr, itir, regs, vector);
 }
 
@@ -744,11 +770,7 @@
        // AND ACTUALLY reflect_interruption doesn't use it anyway!
        itir = vcpu_get_itir_on_fault(ed,ifa);
        vector = priv_emulate(current,regs,isr);
-       if (vector == IA64_RETRY) {
-               reflect_interruption(ifa,isr,itir,regs,
-                       IA64_ALT_DATA_TLB_VECTOR | IA64_FORCED_IFA);
-       }
-       else if (vector != IA64_NO_FAULT && vector != IA64_RFI_IN_PROGRESS) {
+       if (vector != IA64_NO_FAULT && vector != IA64_RFI_IN_PROGRESS) {
                reflect_interruption(ifa,isr,itir,regs,vector);
        }
 }
diff -Nru a/xen/arch/ia64/vcpu.c b/xen/arch/ia64/vcpu.c
--- a/xen/arch/ia64/vcpu.c      2005-05-26 14:01:37 -04:00
+++ b/xen/arch/ia64/vcpu.c      2005-05-26 14:01:37 -04:00
@@ -1117,7 +1117,7 @@
 
 IA64FAULT vcpu_force_data_miss(VCPU *vcpu, UINT64 ifa)
 {
-       PSCB(vcpu,ifa) = ifa;   // privop traps don't set ifa so do it here
+       PSCB(vcpu,tmp[0]) = ifa;        // save ifa in vcpu structure, then 
specify IA64_FORCED_IFA
        return (vcpu_get_rr_ve(vcpu,ifa) ? IA64_DATA_TLB_VECTOR : 
IA64_ALT_DATA_TLB_VECTOR) | IA64_FORCED_IFA;
 }
 
@@ -1206,7 +1206,7 @@
                ((pta_base >> 15) & 0x3fffffffffff) & compMask_60_15;
        UINT64 VHPT_addr2b =
                ((VHPT_offset >> 15) & 0x3fffffffffff) & Mask_60_15;;
-       UINT64 VHPT_addr3 = VHPT_offset & 0x3fff;
+       UINT64 VHPT_addr3 = VHPT_offset & 0x7fff;
        UINT64 VHPT_addr = VHPT_addr1 | ((VHPT_addr2a | VHPT_addr2b) << 15) |
                        VHPT_addr3;
 

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Implement virtual short format VHPT walker, BitKeeper Bot <=