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][3/3] 1GB Page Table Support for HVM Guest

To: "'xen-devel@xxxxxxxxxxxxxxxxxxx'" <xen-devel@xxxxxxxxxxxxxxxxxxx>, Keir Fraser <keir.fraser@xxxxxxxxxxxxx>, Tim Deegan <Tim.Deegan@xxxxxxxxxx>, "Xu, Dongxiao" <dongxiao.xu@xxxxxxxxx>
Subject: [Xen-devel] [PATCH][3/3] 1GB Page Table Support for HVM Guest
From: Wei Huang <wei.huang2@xxxxxxx>
Date: Fri, 12 Mar 2010 12:40:31 -0600
Cc:
Delivery-date: Fri, 12 Mar 2010 10:47:21 -0800
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/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Thunderbird 2.0.0.17 (X11/20080914)
This patch adds a new field in hvm to indicate 1gb is supported by CPU. In addition, users can turn 1GB feature on/off using a Xen option ("hap_1gb", default is off). Per Tim's suggestion, I also add an assertion check in shadow/common.c file to prevent affecting shadow code.

Signed-off-by: Wei Huang <wei.huang2@xxxxxxx>
Acked-by: Dongxiao Xu <dongxiao.xu@xxxxxxx>
Acked-by: Tim Deegan <tim.deegan@xxxxxxxxxx>

diff -r 9353d671b092 -r 67876984de4e xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c        Fri Mar 12 11:14:35 2010 -0600
+++ b/xen/arch/x86/hvm/svm/svm.c        Fri Mar 12 11:35:10 2010 -0600
@@ -883,6 +883,8 @@
                          cpuid_edx(0x8000000A) : 0);
 
     svm_function_table.hap_supported = cpu_has_svm_npt;
+    svm_function_table.hap_1gb_pgtb = 
+        (CONFIG_PAGING_LEVELS == 4)? !!(cpuid_edx(0x80000001) & 0x04000000):0;
 
     hvm_enable(&svm_function_table);
 }
diff -r 9353d671b092 -r 67876984de4e xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c        Fri Mar 12 11:14:35 2010 -0600
+++ b/xen/arch/x86/hvm/vmx/vmx.c        Fri Mar 12 11:35:10 2010 -0600
@@ -1443,6 +1443,8 @@
 
     if ( cpu_has_vmx_ept )
         vmx_function_table.hap_supported = 1;
+    
+    vmx_function_table.hap_1gb_pgtb = 0;
 
     setup_vmcs_dump();
 
diff -r 9353d671b092 -r 67876984de4e xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c     Fri Mar 12 11:14:35 2010 -0600
+++ b/xen/arch/x86/mm/p2m.c     Fri Mar 12 11:35:10 2010 -0600
@@ -38,6 +38,10 @@
 /* Debugging and auditing of the P2M code? */
 #define P2M_AUDIT     0
 #define P2M_DEBUGGING 0
+
+/* turn on/off 1GB host page table support for hap */
+static int opt_hap_1gb = 0;
+boolean_param("hap_1gb", opt_hap_1gb);
 
 /* Printouts */
 #define P2M_PRINTK(_f, _a...)                                \
@@ -1740,9 +1744,9 @@
     while ( todo )
     {
         if ( is_hvm_domain(d) && d->arch.hvm_domain.hap_enabled )
-            order = ( (((gfn | mfn_x(mfn) | todo) & ((1ul << 18) - 1)) == 0) ) 
?
-                    18 :
-                    (((gfn | mfn_x(mfn) | todo) & ((1ul << 9) - 1)) == 0) ? 9 
: 0;
+            order = ( (((gfn | mfn_x(mfn) | todo) & ((1ul << 18) - 1)) == 0) &&
+                      hvm_funcs.hap_1gb_pgtb && opt_hap_1gb ) ? 18 :
+                (((gfn | mfn_x(mfn) | todo) & ((1ul << 9) - 1)) == 0) ? 9 : 0;
 
         else
             order = 0;
diff -r 9353d671b092 -r 67876984de4e xen/arch/x86/mm/shadow/common.c
--- a/xen/arch/x86/mm/shadow/common.c   Fri Mar 12 11:14:35 2010 -0600
+++ b/xen/arch/x86/mm/shadow/common.c   Fri Mar 12 11:35:10 2010 -0600
@@ -3449,6 +3449,11 @@
 {
     struct domain *d = v->domain;
 
+    /* The following assertion is to make sure we don't step on 1GB host
+     * page support of HVM guest. */
+    ASSERT(!(level > 2 && (l1e_get_flags(*p) & _PAGE_PRESENT) &&
+             (l1e_get_flags(*p) & _PAGE_PSE)));
+
     /* If we're removing an MFN from the p2m, remove it from the shadows too */
     if ( level == 1 )
     {
diff -r 9353d671b092 -r 67876984de4e xen/include/asm-x86/hvm/hvm.h
--- a/xen/include/asm-x86/hvm/hvm.h     Fri Mar 12 11:14:35 2010 -0600
+++ b/xen/include/asm-x86/hvm/hvm.h     Fri Mar 12 11:35:10 2010 -0600
@@ -68,6 +68,10 @@
 
     /* Support Hardware-Assisted Paging? */
     int hap_supported;
+
+    /* Support 1GB Harware-Assisted Paging? */
+    int hap_1gb_pgtb;
+
 
     /*
      * Initialise/destroy HVM domain/vcpu resources
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [PATCH][3/3] 1GB Page Table Support for HVM Guest, Wei Huang <=