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] Optimizations for windows

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] [IA64] Optimizations for windows
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Mon, 04 Jun 2007 03:15:07 -0700
Delivery-date: Mon, 04 Jun 2007 03:35:35 -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 Alex Williamson <alex.williamson@xxxxxx>
# Date 1179264743 21600
# Node ID 8c5ebe559a4ddfa05a6291a9b33ae29ea202a462
# Parent  94cce9a515404d20ba9096be064daedab82f6f4f
[IA64] Optimizations for windows

Windows use region 4 and region 5 for identity mapping.

Signed-off-by: Anthony Xu <anthony.xu@xxxxxxxxx>
---
 xen/arch/ia64/vmx/vmmu.c            |    4 ---
 xen/arch/ia64/vmx/vmx_process.c     |   41 ++++++++++++++++++++++++++++++++----
 xen/arch/ia64/vmx/vtlb.c            |   20 ++++++++++++-----
 xen/include/asm-ia64/vmmu.h         |    2 -
 xen/include/asm-ia64/vmx_platform.h |    6 +++++
 5 files changed, 58 insertions(+), 15 deletions(-)

diff -r 94cce9a51540 -r 8c5ebe559a4d xen/arch/ia64/vmx/vmmu.c
--- a/xen/arch/ia64/vmx/vmmu.c  Mon May 14 12:54:26 2007 -0600
+++ b/xen/arch/ia64/vmx/vmmu.c  Tue May 15 15:32:23 2007 -0600
@@ -408,7 +408,6 @@ IA64FAULT vmx_vcpu_itc_i(VCPU *vcpu, u64
 
 IA64FAULT vmx_vcpu_itc_d(VCPU *vcpu, u64 pte, u64 itir, u64 ifa)
 {
-    u64 gpfn;
 #ifdef VTLB_DEBUG    
     int slot;
     u64 ps, va;
@@ -422,9 +421,6 @@ IA64FAULT vmx_vcpu_itc_d(VCPU *vcpu, u64
     }
 #endif //VTLB_DEBUG
     pte &= ~PAGE_FLAGS_RV_MASK;
-    gpfn = (pte & _PAGE_PPN_MASK)>> PAGE_SHIFT;
-    if (VMX_DOMAIN(vcpu) && __gpfn_is_io(vcpu->domain, gpfn))
-        pte |= VTLB_PTE_IO;
     thash_purge_and_insert(vcpu, pte, itir, ifa, DSIDE_TLB);
     return IA64_NO_FAULT;
 
diff -r 94cce9a51540 -r 8c5ebe559a4d xen/arch/ia64/vmx/vmx_process.c
--- a/xen/arch/ia64/vmx/vmx_process.c   Mon May 14 12:54:26 2007 -0600
+++ b/xen/arch/ia64/vmx/vmx_process.c   Tue May 15 15:32:23 2007 -0600
@@ -320,7 +320,8 @@ vmx_hpw_miss(u64 vadr , u64 vec, REGS* r
         physical_tlb_miss(v, vadr, type);
         return IA64_FAULT;
     }
-
+    
+try_again:
     if((data=vtlb_lookup(v, vadr,type))!=0){
         if (v->domain != dom0 && type == DSIDE_TLB) {
             gppa = (vadr & ((1UL << data->ps) - 1)) +
@@ -342,7 +343,39 @@ vmx_hpw_miss(u64 vadr , u64 vec, REGS* r
         if (misr.sp)
             return vmx_handle_lds(regs);
 
+        vcpu_get_rr(v, vadr, &rr);
+        itir = rr & (RR_RID_MASK | RR_PS_MASK);
+
         if(!vhpt_enabled(v, vadr, misr.rs?RSE_REF:DATA_REF)){
+            if (GOS_WINDOWS(v)) {
+                /* windows use region 4 and 5 for identity mapping */
+                if (REGION_NUMBER(vadr) == 4 && !(regs->cr_ipsr & IA64_PSR_CPL)
+                    && (REGION_OFFSET(vadr)<= _PAGE_PPN_MASK)) {
+
+                    pteval = PAGEALIGN(REGION_OFFSET(vadr), itir_ps(itir)) |
+                             (_PAGE_P | _PAGE_A | _PAGE_D |
+                               _PAGE_MA_WB | _PAGE_AR_RW);
+
+                    if (thash_purge_and_insert(v, pteval, itir, vadr, type))
+                        goto try_again;
+
+                    return IA64_NO_FAULT;
+                }
+
+                if (REGION_NUMBER(vadr) == 5 && !(regs->cr_ipsr & IA64_PSR_CPL)
+                    && (REGION_OFFSET(vadr)<= _PAGE_PPN_MASK)) {
+
+                    pteval = PAGEALIGN(REGION_OFFSET(vadr),itir_ps(itir)) |
+                             (_PAGE_P | _PAGE_A | _PAGE_D |
+                              _PAGE_MA_UC | _PAGE_AR_RW);
+
+                    if (thash_purge_and_insert(v, pteval, itir, vadr, type))
+                        goto try_again;
+
+                    return IA64_NO_FAULT;
+                }
+            }
+
             if(vpsr.ic){
                 vcpu_set_isr(v, misr.val);
                 alt_dtlb(v, vadr);
@@ -367,7 +400,9 @@ vmx_hpw_miss(u64 vadr , u64 vec, REGS* r
         }
 
         /* avoid recursively walking (short format) VHPT */
-        if ((((vadr ^ vpta.val) << 3) >> (vpta.size + 3)) == 0) {
+        if (!GOS_WINDOWS(v) &&
+            (((vadr ^ vpta.val) << 3) >> (vpta.size + 3)) == 0) {
+
             if (vpsr.ic) {
                 vcpu_set_isr(v, misr.val);
                 dtlb_fault(v, vadr);
@@ -391,8 +426,6 @@ vmx_hpw_miss(u64 vadr , u64 vec, REGS* r
                     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) {
diff -r 94cce9a51540 -r 8c5ebe559a4d xen/arch/ia64/vmx/vtlb.c
--- a/xen/arch/ia64/vmx/vtlb.c  Mon May 14 12:54:26 2007 -0600
+++ b/xen/arch/ia64/vmx/vtlb.c  Tue May 15 15:32:23 2007 -0600
@@ -276,7 +276,7 @@ u64 guest_vhpt_lookup(u64 iha, u64 *pte)
 
     data = vhpt_lookup(iha);
     if (data == NULL) {
-        data = vtlb_lookup(current, iha, DSIDE_TLB);
+        data = __vtr_lookup(current, iha, DSIDE_TLB);
         if (data != NULL)
             thash_vhpt_insert(current, data->page_flags, data->itir,
                               iha, DSIDE_TLB);
@@ -518,24 +518,31 @@ u64 translate_phy_pte(VCPU *v, u64 *pte,
 /*
  * Purge overlap TCs and then insert the new entry to emulate itc ops.
  *    Notes: Only TC entry can purge and insert.
- */
-void thash_purge_and_insert(VCPU *v, u64 pte, u64 itir, u64 ifa, int type)
+ *    1 indicates this is MMIO
+ */
+int thash_purge_and_insert(VCPU *v, u64 pte, u64 itir, u64 ifa, int type)
 {
     u64 ps;//, va;
     u64 phy_pte;
     ia64_rr vrr, mrr;
+    int ret = 0;
     ps = itir_ps(itir);
     vcpu_get_rr(current, ifa, &vrr.rrval);
     mrr.rrval = ia64_get_rr(ifa);
     if(VMX_DOMAIN(v)){
+        
+        phy_pte = translate_phy_pte(v, &pte, itir, ifa);
+
         /* Ensure WB attribute if pte is related to a normal mem page,
          * which is required by vga acceleration since qemu maps shared
          * vram buffer with WB.
          */
-        if (!(pte & VTLB_PTE_IO) && ((pte & _PAGE_MA_MASK) != _PAGE_MA_NAT))
+        if (!(pte & VTLB_PTE_IO) && ((pte & _PAGE_MA_MASK) != _PAGE_MA_NAT)) {
             pte &= ~_PAGE_MA_MASK;
-
-        phy_pte = translate_phy_pte(v, &pte, itir, ifa);
+            phy_pte &= ~_PAGE_MA_MASK;
+        }
+        if (pte & VTLB_PTE_IO)
+            ret = 1;
         vtlb_purge(v, ifa, ps);
         vhpt_purge(v, ifa, ps);
         if (ps == mrr.ps) {
@@ -574,6 +581,7 @@ void thash_purge_and_insert(VCPU *v, u64
         machine_tlb_purge(ifa, ps);
         vmx_vhpt_insert(&v->arch.vhpt, phy_pte, itir, ifa);
     }
+    return ret;
 }
 
 /*
diff -r 94cce9a51540 -r 8c5ebe559a4d xen/include/asm-ia64/vmmu.h
--- a/xen/include/asm-ia64/vmmu.h       Mon May 14 12:54:26 2007 -0600
+++ b/xen/include/asm-ia64/vmmu.h       Tue May 15 15:32:23 2007 -0600
@@ -272,7 +272,7 @@ extern thash_data_t *thash_find_next_ove
  */
 extern void thash_purge_entries(struct vcpu *v, u64 va, u64 ps);
 extern void thash_purge_entries_remote(struct vcpu *v, u64 va, u64 ps);
-extern void thash_purge_and_insert(struct vcpu *v, u64 pte, u64 itir, u64 ifa, 
int type);
+extern int thash_purge_and_insert(struct vcpu *v, u64 pte, u64 itir, u64 ifa, 
int type);
 
 /*
  * Purge all TCs or VHPT entries including those in Hash table.
diff -r 94cce9a51540 -r 8c5ebe559a4d xen/include/asm-ia64/vmx_platform.h
--- a/xen/include/asm-ia64/vmx_platform.h       Mon May 14 12:54:26 2007 -0600
+++ b/xen/include/asm-ia64/vmx_platform.h       Tue May 15 15:32:23 2007 -0600
@@ -30,6 +30,12 @@
 #define OS_WINDOWS  0xB1
 #define OS_LINUX    0xB2
 #define OS_END      0xB3
+
+#define GOS_WINDOWS(_v) \
+    ((_v)->domain->arch.vmx_platform.gos_type == OS_WINDOWS)
+
+#define GOS_LINUX(_v) \
+    ((_v)->domain->arch.vmx_platform.gos_type == OS_LINUX)
 
 /* port guest Firmware use to indicate os type 
  * this port is used to trigger SMI on x86,

_______________________________________________
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] Optimizations for windows, Xen patchbot-unstable <=