[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] HAP: Add hardware capability check for 2MB super page.



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1275030894 -3600
# Node ID b74af3abf72d2ac86ae271f4169929f22674a7bb
# Parent  d86065bbb312cdf180a78ddecc7da18659ef6570
HAP: Add hardware capability check for 2MB super page.

While setting the HAP entry previously, we only check the hardware
capability for 1GB super page. This patch adds hardware capability
check for 2MB superpage

Also, Intel SDM doesn't exclude 1GB feature for 32/pae
host. Therefore remove the BUG_ON() check in common code.

Signed-off-by: Dongxiao Xu <dongxiao.xu@xxxxxxxxx>
---
 xen/arch/x86/hvm/svm/svm.c    |    5 +++--
 xen/arch/x86/hvm/vmx/vmcs.c   |    3 ++-
 xen/arch/x86/hvm/vmx/vmx.c    |    2 +-
 xen/arch/x86/mm/p2m.c         |   12 ++++--------
 xen/include/asm-x86/hvm/hvm.h |    7 +++++--
 5 files changed, 15 insertions(+), 14 deletions(-)

diff -r d86065bbb312 -r b74af3abf72d xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c        Fri May 28 08:12:15 2010 +0100
+++ b/xen/arch/x86/hvm/svm/svm.c        Fri May 28 08:14:54 2010 +0100
@@ -935,8 +935,9 @@ struct hvm_function_table * __init start
                          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;
+    svm_function_table.hap_superpage_level =
+        ((CONFIG_PAGING_LEVELS == 4) && (cpuid_edx(0x80000001) & 0x04000000)) ?
+            2 : 1;
 
     return &svm_function_table;
 }
diff -r d86065bbb312 -r b74af3abf72d xen/arch/x86/hvm/vmx/vmcs.c
--- a/xen/arch/x86/hvm/vmx/vmcs.c       Fri May 28 08:12:15 2010 +0100
+++ b/xen/arch/x86/hvm/vmx/vmcs.c       Fri May 28 08:14:54 2010 +0100
@@ -94,7 +94,8 @@ static void __init vmx_display_features(
 
     if ( vmx_ept_super_page_level_limit )
         printk("EPT supports %s super page.\n",
-               vmx_ept_super_page_level_limit > 1 ? "1G" : "2M");
+               (vmx_ept_super_page_level_limit == 2) ? "1G" :
+               ((vmx_ept_super_page_level_limit == 1) ? "2M" : "4K"));
 }
 
 static u32 adjust_vmx_controls(
diff -r d86065bbb312 -r b74af3abf72d xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c        Fri May 28 08:12:15 2010 +0100
+++ b/xen/arch/x86/hvm/vmx/vmx.c        Fri May 28 08:14:54 2010 +0100
@@ -1435,7 +1435,7 @@ struct hvm_function_table * __init start
         setup_ept_dump();
     }
     
-    vmx_function_table.hap_1gb_pgtb = (vmx_ept_super_page_level_limit == 2);
+    vmx_function_table.hap_superpage_level = vmx_ept_super_page_level_limit;
 
     setup_vmcs_dump();
 
diff -r d86065bbb312 -r b74af3abf72d xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c     Fri May 28 08:12:15 2010 +0100
+++ b/xen/arch/x86/mm/p2m.c     Fri May 28 08:14:54 2010 +0100
@@ -1757,16 +1757,12 @@ int set_p2m_entry(struct domain *d, unsi
     {
         if ( is_hvm_domain(d) && paging_mode_hap(d) )
             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;
+                      (hvm_funcs.hap_superpage_level == 2) &&
+                      opt_hap_1gb ) ? 18 :
+                ((((gfn | mfn_x(mfn) | todo) & ((1ul << 9) - 1)) == 0) &&
+                      (hvm_funcs.hap_superpage_level >= 1)) ? 9 : 0;
         else
             order = 0;
-
-        /* Note that we only enable hap_1gb_pgtb when CONFIG_PAGING_LEVELS==4. 
-         * So 1GB should never be enabled under 32bit or PAE modes. But for
-         * safety's reason, we double-check the page order again..
-         */
-        BUG_ON(order == 18 && CONFIG_PAGING_LEVELS < 4);
 
         if ( !d->arch.p2m->set_entry(d, gfn, mfn, order, p2mt) )
             rc = 0;
diff -r d86065bbb312 -r b74af3abf72d xen/include/asm-x86/hvm/hvm.h
--- a/xen/include/asm-x86/hvm/hvm.h     Fri May 28 08:12:15 2010 +0100
+++ b/xen/include/asm-x86/hvm/hvm.h     Fri May 28 08:14:54 2010 +0100
@@ -72,8 +72,11 @@ struct hvm_function_table {
     /* Support Hardware-Assisted Paging? */
     int hap_supported;
 
-    /* Support 1GB Harware-Assisted Paging? */
-    int hap_1gb_pgtb;
+    /*
+     * Indicate HAP super page level.
+     * 0 -- 4KB, 1 -- 2MB, 2 -- 1GB.
+     */
+    int hap_superpage_level;
 
 
     /*

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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.