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] More itir fixes in vcpu_translate and cleanup

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] More itir fixes in vcpu_translate and cleanup
From: Xen patchbot -unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Sat, 29 Oct 2005 09:58:11 +0000
Delivery-date: Sat, 29 Oct 2005 09:56:22 +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-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User djm@xxxxxxxxxxxxxxx
# Node ID 42cab872427382e7e708c4a151d8da698a519a4f
# Parent  d61142fc7480dbc2036a405994549e3141eb4262
More itir fixes in vcpu_translate and cleanup

diff -r d61142fc7480 -r 42cab8724273 xen/arch/ia64/xen/vcpu.c
--- a/xen/arch/ia64/xen/vcpu.c  Fri Oct 14 20:11:12 2005
+++ b/xen/arch/ia64/xen/vcpu.c  Sat Oct 15 03:09:43 2005
@@ -1274,11 +1274,9 @@
 
 IA64FAULT vcpu_translate(VCPU *vcpu, UINT64 address, BOOLEAN is_data, UINT64 
*pteval, UINT64 *itir, UINT64 *iha)
 {
-       unsigned long pta, pta_mask, pte, ps, rid, itir_addr;
+       unsigned long pta, pte, rid, rr;
        int i;
        TR_ENTRY *trp;
-       IA64FAULT fault;
-       ia64_rr rr;
 
        if (!(address >> 61)) {
                if (!PSCB(vcpu,metaphysical_mode)) {
@@ -1295,7 +1293,9 @@
                phys_translate_count++;
                return IA64_NO_FAULT;
        }
-       rid = virtualize_rid(vcpu,get_rr(address) & RR_RID_MASK);
+
+       rr = PSCB(vcpu,rrs)[address>>61];
+       rid = rr & RR_RID_MASK;
        if (is_data) {
                if (vcpu_quick_region_check(vcpu->arch.dtr_regions,address)) {
                        for (trp = vcpu->arch.dtrs, i = NDTRS; i; i--, trp++) {
@@ -1340,38 +1340,34 @@
                //return (is_data ? IA64_DATA_TLB_VECTOR:IA64_INST_TLB_VECTOR);
        }
 
+       *itir = rr & (RR_RID_MASK | RR_PS_MASK);
+       // note: architecturally, iha is optionally set for alt faults but
+       // xenlinux depends on it so should document it as part of PV interface
        vcpu_thash(vcpu, address, iha);
-       rr.rrval = PSCB(vcpu,rrs)[address>>61];
-       fault = is_data ? IA64_DATA_TLB_VECTOR : IA64_INST_TLB_VECTOR;
-       if (!rr.ve || !(pta & IA64_PTA_VE)) {
-       // architecturally, iha is optionally set for alt faults but xenlinux
-       // depends on it so should document it as part of PV interface
-               fault += IA64_ALT_INST_TLB_VECTOR - IA64_INST_TLB_VECTOR;
-       }
+       if (!(rr & RR_VE_MASK) || !(pta & IA64_PTA_VE))
+               return (is_data ? IA64_ALT_DATA_TLB_VECTOR : 
IA64_ALT_INST_TLB_VECTOR);
 
        /* avoid recursively walking (short format) VHPT */
-       else if (((address ^ pta) & ((itir_mask(pta) << 3) >> 3)) != 0) {
-
-               if (__copy_from_user(&pte, (void *)(*iha), sizeof(pte)) != 0)
-                       // virtual VHPT walker "missed" in TLB
-                       fault = IA64_VHPT_FAULT;
-
-               /*
-               * Optimisation: this VHPT walker aborts on not-present pages
-               * instead of inserting a not-present translation, this allows
-               * vectoring directly to the miss handler.
-               */
-               else if (pte & _PAGE_P) {
-                       *pteval = pte;
-                       vhpt_translate_count++;
-                       return IA64_NO_FAULT;
-               }
-       }
-
-       // for VHPT fault, use itir based on iha, not on fault address
-       itir_addr = (fault == IA64_VHPT_FAULT) ? *iha : address;
-       *itir = vcpu_get_itir_on_fault(vcpu,itir_addr);
-       return fault;
+       if (((address ^ pta) & ((itir_mask(pta) << 3) >> 3)) == 0)
+               return (is_data ? IA64_DATA_TLB_VECTOR : IA64_INST_TLB_VECTOR);
+
+       if (__copy_from_user(&pte, (void *)(*iha), sizeof(pte)) != 0)
+               // virtual VHPT walker "missed" in TLB
+               return IA64_VHPT_FAULT;
+
+       /*
+       * 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 (!(pte & _PAGE_P))
+               return (is_data ? IA64_DATA_TLB_VECTOR : IA64_INST_TLB_VECTOR);
+
+       /* found mapping in guest VHPT! */
+       *itir = rr & RR_PS_MASK;
+       *pteval = pte;
+       vhpt_translate_count++;
+       return IA64_NO_FAULT;
 }
 
 IA64FAULT vcpu_tpa(VCPU *vcpu, UINT64 vadr, UINT64 *padr)

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] More itir fixes in vcpu_translate and cleanup, Xen patchbot -unstable <=