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

[Xen-devel] [PATCH] clear shadow caches when vmx guest return to real mo

To: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH] clear shadow caches when vmx guest return to real mode
From: "Ling, Xiaofeng" <xiaofeng.ling@xxxxxxxxx>
Date: Thu, 15 Dec 2005 15:30:28 +0800
Delivery-date: Thu, 15 Dec 2005 07:34:45 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510
clear all shadow caches when return to real mode from protect mode.
So that, if OS modify some page tables in real mode and then
return to protect mode, no outdated shadow table be used because
out of sync machanism do not work in real mode.

Signed-off-by: Xiaofeng Ling <xiaofeng.ling@xxxxxxxxx>
# HG changeset patch
# User Xiaofeng Ling <xiaofeng.ling@xxxxxxxxx>
# Node ID aadb771248f677c4a957731a59b22c90a747646f
# Parent  b4d615464054390c88e4b62dc2f26d3adeb86443
clear all shadow caches when return to real mode from protect mode.
So that, if OS modify some page tables in real mode and then 
return to protect mode, no outdated shadow table be used.

Signed-off-by: Xiaofeng Ling <xiaofeng.ling@xxxxxxxxx>

diff -r b4d615464054 -r aadb771248f6 xen/arch/x86/shadow32.c
--- a/xen/arch/x86/shadow32.c   Thu Dec  8 15:09:46 2005 +0800
+++ b/xen/arch/x86/shadow32.c   Thu Dec  8 15:09:49 2005 +0800
@@ -2982,6 +2982,23 @@
     }
 }
 
+void clear_all_shadow_status(struct domain *d)
+{
+    shadow_lock(d);
+    free_shadow_pages(d);
+    free_shadow_ht_entries(d);
+    d->arch.shadow_ht = 
+        xmalloc_array(struct shadow_status, shadow_ht_buckets);
+    if ( d->arch.shadow_ht == NULL ) {
+        printk("clear all shadow status:xmalloc fail\n");
+        domain_crash_synchronous();
+    }
+    memset(d->arch.shadow_ht, 0,
+           shadow_ht_buckets * sizeof(struct shadow_status));
+
+    free_out_of_sync_entries(d);
+    shadow_unlock(d);
+}
 
 /************************************************************************/
 /************************************************************************/
diff -r b4d615464054 -r aadb771248f6 xen/arch/x86/shadow_public.c
--- a/xen/arch/x86/shadow_public.c      Thu Dec  8 15:09:46 2005 +0800
+++ b/xen/arch/x86/shadow_public.c      Thu Dec  8 15:09:49 2005 +0800
@@ -1748,6 +1750,24 @@
     shadow_unlock(d);
 }
 
+void clear_all_shadow_status(struct domain *d)
+{
+    shadow_lock(d);
+    free_shadow_pages(d);
+    free_shadow_ht_entries(d);
+    d->arch.shadow_ht = 
+        xmalloc_array(struct shadow_status, shadow_ht_buckets);
+    if ( d->arch.shadow_ht == NULL ) {
+        printk("clear all shadow status:xmalloc fail\n");
+        domain_crash_synchronous();
+    }
+    memset(d->arch.shadow_ht, 0,
+           shadow_ht_buckets * sizeof(struct shadow_status));
+
+    free_out_of_sync_entries(d);
+    shadow_unlock(d);
+}
+
 /*
  * Local variables:
  * mode: C
diff -r b4d615464054 -r aadb771248f6 xen/arch/x86/vmx.c
--- a/xen/arch/x86/vmx.c        Thu Dec  8 15:09:46 2005 +0800
+++ b/xen/arch/x86/vmx.c        Thu Dec  8 15:09:49 2005 +0800
@@ -1210,6 +1210,7 @@
             }
         }
 
+        clear_all_shadow_status(v->domain);
         if (vmx_assist(v, VMX_ASSIST_INVOKE)) {
             set_bit(VMX_CPU_STATE_ASSIST_ENABLED, &v->arch.arch_vmx.cpu_state);
             __vmread(GUEST_RIP, &eip);
diff -r b4d615464054 -r aadb771248f6 xen/include/asm-x86/shadow.h
--- a/xen/include/asm-x86/shadow.h      Thu Dec  8 15:09:46 2005 +0800
+++ b/xen/include/asm-x86/shadow.h      Thu Dec  8 15:09:49 2005 +0800
@@ -1707,6 +1707,8 @@
     }
 }
 
+void clear_all_shadow_status(struct domain *d);
+
 #if SHADOW_DEBUG
 extern int _check_pagetable(struct vcpu *v, char *s);
 extern int _check_all_pagetables(struct vcpu *v, char *s);
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [PATCH] clear shadow caches when vmx guest return to real mode, Ling, Xiaofeng <=