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-ia64-devel

[Xen-ia64-devel] [PATCH] fix access rights in VHPT when itr.ar!=dtr.ar

To: xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-ia64-devel] [PATCH] fix access rights in VHPT when itr.ar!=dtr.ar
From: Kouya SHIMURA <kouya@xxxxxxxxxxxxxx>
Date: Tue, 20 Mar 2007 17:32:51 +0900
Delivery-date: Tue, 20 Mar 2007 01:32:26 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-ia64-devel-request@lists.xensource.com?subject=help>
List-id: Discussion of the ia64 port of Xen <xen-ia64-devel.lists.xensource.com>
List-post: <mailto:xen-ia64-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-ia64-devel-bounces@xxxxxxxxxxxxxxxxxxx
Hi,

This is a workaround patch for Windows 2003 Server.
Windows (vcpu>=2) set itr[1].ar=3(RWX) but dtr[1].ar=2(RW).
It causes a impossible INST_ACCESS_RIGHTS interruption via VHPT
which is used for emulating TR.

Surprisingly, windows ordinarily accepts this interruption. 
But windows sometimes crashes with the message 'PANIC_STACK_SWITCH'
owing to this interruption.

Thanks,
Kouya

Signed-off-by: Kouya Shimura <kouya@xxxxxxxxxxxxxx>

diff -r 1584263f9fc5 xen/arch/ia64/vmx/vmx_process.c
--- a/xen/arch/ia64/vmx/vmx_process.c   Thu Mar 15 09:04:23 2007 -0600
+++ b/xen/arch/ia64/vmx/vmx_process.c   Tue Mar 20 16:04:14 2007 +0900
@@ -92,6 +92,11 @@ void vmx_reflect_interruption(u64 ifa, u
 
     switch (vec) {
 
+    case 22:   // IA64_INST_ACCESS_RIGHTS_VECTOR
+        if (vhpt_access_rights_fixup(vcpu, ifa, 0))
+            return;
+        break;
+
     case 25:   // IA64_DISABLED_FPREG_VECTOR
 
         if (FP_PSR(vcpu) & IA64_PSR_DFH) {
diff -r 1584263f9fc5 xen/arch/ia64/vmx/vtlb.c
--- a/xen/arch/ia64/vmx/vtlb.c  Thu Mar 15 09:04:23 2007 -0600
+++ b/xen/arch/ia64/vmx/vtlb.c  Tue Mar 20 16:04:14 2007 +0900
@@ -196,6 +196,36 @@ void thash_vhpt_insert(VCPU *v, u64 pte,
         ia64_srlz_i();
     }
 }
+
+int vhpt_access_rights_fixup(VCPU *v, u64 ifa, int is_data)
+{
+    thash_data_t *trp, *data;
+    u64 ps, tag, mask;
+
+    if ((trp = __vtr_lookup(v, ifa, is_data)) != NULL) {
+        ps = _REGION_PAGE_SIZE(ia64_get_rr(ifa));
+        if (trp->ps < ps)
+            return 0;
+        ifa = PAGEALIGN(ifa, ps);
+        data = (thash_data_t *)ia64_thash(ifa);
+        tag = ia64_ttag(ifa);
+        do {
+            if (data->etag == tag) {
+                mask = trp->page_flags & PAGE_FLAGS_AR_PL_MASK;
+                if (mask != (data->page_flags & PAGE_FLAGS_AR_PL_MASK)) {
+                    data->page_flags &= ~PAGE_FLAGS_AR_PL_MASK;
+                    data->page_flags |= mask;
+                    machine_tlb_purge(ifa, ps);
+                    return 1;
+                }
+                return 0;
+            }
+            data = data->next;
+        } while(data);
+    }
+    return 0;
+}
+
 /*
  *   vhpt lookup
  */
diff -r 1584263f9fc5 xen/include/asm-ia64/vmmu.h
--- a/xen/include/asm-ia64/vmmu.h       Thu Mar 15 09:04:23 2007 -0600
+++ b/xen/include/asm-ia64/vmmu.h       Tue Mar 20 16:04:14 2007 +0900
@@ -291,6 +291,7 @@ extern int thash_lock_tc(thash_cb_t *hcb
 
 #define   ITIR_RV_MASK      (((1UL<<32)-1)<<32 | 0x3)
 #define   PAGE_FLAGS_RV_MASK    (0x2 | (0x3UL<<50)|(((1UL<<11)-1)<<53))
+#define   PAGE_FLAGS_AR_PL_MASK ((0x7UL<<9)|(0x3UL<<7))
 extern u64 machine_ttag(PTA pta, u64 va);
 extern u64 machine_thash(PTA pta, u64 va);
 extern void purge_machine_tc_by_domid(domid_t domid);
@@ -309,6 +310,7 @@ extern void thash_vhpt_insert(struct vcp
 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);
+extern int vhpt_access_rights_fixup(struct vcpu *v, u64 ifa, int is_data);
 
 static inline void vmx_vcpu_set_tr (thash_data_t *trp, u64 pte, u64 itir, u64 
va, u64 rid)
 {
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
<Prev in Thread] Current Thread [Next in Thread>