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] [xen-unstable] [IA64] Correctly not handle VHPT long for

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] [IA64] Correctly not handle VHPT long format.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Thu, 26 Oct 2006 12:11:22 +0000
Delivery-date: Thu, 26 Oct 2006 05:18:18 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
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 awilliam@xxxxxxxxxxx
# Node ID 2a9c0f4682edfe7819e09515aedbc56b682732c0
# Parent  aed7ef54fbfe31c257b54c7e6d17f480f27e2630
[IA64] Correctly not handle VHPT long format.

Signed-off-by: Tristan Gingold <tristan.gingold@xxxxxxxx>
---
 xen/arch/ia64/vmx/vmx_process.c |  125 ++++++++++++++++++++++++----------------
 xen/arch/ia64/vmx/vtlb.c        |    8 --
 2 files changed, 76 insertions(+), 57 deletions(-)

diff -r aed7ef54fbfe -r 2a9c0f4682ed xen/arch/ia64/vmx/vmx_process.c
--- a/xen/arch/ia64/vmx/vmx_process.c   Wed Oct 18 22:06:49 2006 -0600
+++ b/xen/arch/ia64/vmx/vmx_process.c   Wed Oct 18 22:07:06 2006 -0600
@@ -269,10 +269,12 @@ vmx_hpw_miss(u64 vadr , u64 vec, REGS* r
     int type;
     u64 vhpt_adr, gppa, pteval, rr, itir;
     ISR misr;
+    PTA vpta;
     thash_data_t *data;
     VCPU *v = current;
+
     vpsr.val = VCPU(v, vpsr);
-    misr.val=VMX(v,cr_isr);
+    misr.val = VMX(v,cr_isr);
     
     if (vec == 1)
         type = ISIDE_TLB;
@@ -283,7 +285,8 @@ vmx_hpw_miss(u64 vadr , u64 vec, REGS* r
 
     if(is_physical_mode(v)&&(!(vadr<<1>>62))){
         if(vec==2){
-            
if(v->domain!=dom0&&__gpfn_is_io(v->domain,(vadr<<1)>>(PAGE_SHIFT+1))){
+            if (v->domain != dom0
+                && __gpfn_is_io(v->domain, (vadr << 1) >> (PAGE_SHIFT + 1))) {
                 emulate_io_inst(v,((vadr<<1)>>1),4);   //  UC
                 return IA64_FAULT;
             }
@@ -322,41 +325,55 @@ vmx_hpw_miss(u64 vadr , u64 vec, REGS* r
                 nested_dtlb(v);
                 return IA64_FAULT;
             }
-        } else{
-            vmx_vcpu_thash(v, vadr, &vhpt_adr);
-            if(!guest_vhpt_lookup(vhpt_adr, &pteval)){
-                if (!(pteval & _PAGE_P)) {
-                    if (vpsr.ic) {
-                        vcpu_set_isr(v, misr.val);
-                        data_page_not_present(v, vadr);
-                        return IA64_FAULT;
-                    } else {
-                        nested_dtlb(v);
-                        return IA64_FAULT;
-                    }
-                }                     
-                else if ((pteval & _PAGE_MA_MASK) != _PAGE_MA_ST) {
-                    vcpu_get_rr(v, vadr, &rr);
-                    itir = rr&(RR_RID_MASK | RR_PS_MASK);
-                    thash_purge_and_insert(v, pteval, itir, vadr, DSIDE_TLB);
-                    return IA64_NO_FAULT;
-                } else if (vpsr.ic) {
+        }
+
+        vmx_vcpu_get_pta(v, &vpta.val);
+        if (vpta.vf) {
+            /* Long format is not yet supported.  */
+            if (vpsr.ic) {
+                vcpu_set_isr(v, misr.val);
+                dtlb_fault(v, vadr);
+                return IA64_FAULT;
+            } else {
+                nested_dtlb(v);
+                return IA64_FAULT;
+            }
+        }
+
+        vmx_vcpu_thash(v, vadr, &vhpt_adr);
+        if (!guest_vhpt_lookup(vhpt_adr, &pteval)) {
+            /* VHPT successfully read.  */
+            if (!(pteval & _PAGE_P)) {
+                if (vpsr.ic) {
                     vcpu_set_isr(v, misr.val);
-                    dtlb_fault(v, vadr);
+                    data_page_not_present(v, vadr);
                     return IA64_FAULT;
-                }else{
+                } else {
                     nested_dtlb(v);
                     return IA64_FAULT;
                 }
+            } else if ((pteval & _PAGE_MA_MASK) != _PAGE_MA_ST) {
+                vcpu_get_rr(v, vadr, &rr);
+                itir = rr & (RR_RID_MASK | RR_PS_MASK);
+                thash_purge_and_insert(v, pteval, itir, vadr, DSIDE_TLB);
+                return IA64_NO_FAULT;
+            } else if (vpsr.ic) {
+                vcpu_set_isr(v, misr.val);
+                dtlb_fault(v, vadr);
+                return IA64_FAULT;
             }else{
-                if(vpsr.ic){
-                    vcpu_set_isr(v, misr.val);
-                    dvhpt_fault(v, vadr);
-                    return IA64_FAULT;
-                }else{
-                    nested_dtlb(v);
-                    return IA64_FAULT;
-                }
+                nested_dtlb(v);
+                return IA64_FAULT;
+            }
+        } else {
+            /* Can't read VHPT.  */
+            if (vpsr.ic) {
+                vcpu_set_isr(v, misr.val);
+                dvhpt_fault(v, vadr);
+                return IA64_FAULT;
+            } else {
+                nested_dtlb(v);
+                return IA64_FAULT;
             }
         }
     }else if(type == ISIDE_TLB){
@@ -367,24 +384,34 @@ vmx_hpw_miss(u64 vadr , u64 vec, REGS* r
             vcpu_set_isr(v, misr.val);
             alt_itlb(v, vadr);
             return IA64_FAULT;
-        } else{
-            vmx_vcpu_thash(v, vadr, &vhpt_adr);
-            if(!guest_vhpt_lookup(vhpt_adr, &pteval)){
-                if (pteval & _PAGE_P){
-                    vcpu_get_rr(v, vadr, &rr);
-                    itir = rr&(RR_RID_MASK | RR_PS_MASK);
-                    thash_purge_and_insert(v, pteval, itir, vadr, ISIDE_TLB);
-                    return IA64_NO_FAULT;
-                } else {
-                    vcpu_set_isr(v, misr.val);
-                    inst_page_not_present(v, vadr);
-                    return IA64_FAULT;
-                }
-            }else{
-                vcpu_set_isr(v, misr.val);
-                ivhpt_fault(v, vadr);
-                return IA64_FAULT;
-            }
+        }
+
+        vmx_vcpu_get_pta(v, &vpta.val);
+        if (vpta.vf) {
+            /* Long format is not yet supported.  */
+            vcpu_set_isr(v, misr.val);
+            itlb_fault(v, vadr);
+            return IA64_FAULT;
+        }
+
+
+        vmx_vcpu_thash(v, vadr, &vhpt_adr);
+        if (!guest_vhpt_lookup(vhpt_adr, &pteval)) {
+            /* VHPT successfully read.  */
+            if (pteval & _PAGE_P) {
+                vcpu_get_rr(v, vadr, &rr);
+                itir = rr & (RR_RID_MASK | RR_PS_MASK);
+                thash_purge_and_insert(v, pteval, itir, vadr, ISIDE_TLB);
+                return IA64_NO_FAULT;
+            } else {
+                vcpu_set_isr(v, misr.val);
+                inst_page_not_present(v, vadr);
+                return IA64_FAULT;
+            }
+        } else {
+            vcpu_set_isr(v, misr.val);
+            ivhpt_fault(v, vadr);
+            return IA64_FAULT;
         }
     }
     return IA64_NO_FAULT;
diff -r aed7ef54fbfe -r 2a9c0f4682ed xen/arch/ia64/vmx/vtlb.c
--- a/xen/arch/ia64/vmx/vtlb.c  Wed Oct 18 22:06:49 2006 -0600
+++ b/xen/arch/ia64/vmx/vtlb.c  Wed Oct 18 22:07:06 2006 -0600
@@ -218,20 +218,12 @@ u64 guest_vhpt_lookup(u64 iha, u64 *pte)
 {
     u64 ret;
     thash_data_t * data;
-    PTA vpta;
 
     data = vhpt_lookup(iha);
     if (data == NULL) {
         data = vtlb_lookup(current, iha, DSIDE_TLB);
         if (data != NULL)
             thash_vhpt_insert(current, data->page_flags, data->itir ,iha);
-    }
-
-    /* VHPT long format is not read.  */
-    vmx_vcpu_get_pta(current, &vpta.val);
-    if (vpta.vf == 1) {
-        *pte = 0;
-        return 0;
     }
 
     asm volatile ("rsm psr.ic|psr.i;;"

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] [IA64] Correctly not handle VHPT long format., Xen patchbot-unstable <=