From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Yang, Sheng" Subject: Re: [PATCH 3/4] KVM: VMX: Add capability report of Intel hardware Date: Fri, 20 Jun 2008 11:26:09 +0800 Message-ID: <200806201126.09847.sheng.yang@intel.com> References: <200806191844.09550.sheng.yang@intel.com> Mime-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_RNyWIMWKcITEqfE" To: kvm@vger.kernel.org Return-path: Received: from mga11.intel.com ([192.55.52.93]:65376 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751209AbYFTD00 (ORCPT ); Thu, 19 Jun 2008 23:26:26 -0400 In-Reply-To: <200806191844.09550.sheng.yang@intel.com> Sender: kvm-owner@vger.kernel.org List-ID: --Boundary-00=_RNyWIMWKcITEqfE Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Updated the patch, tell part TPR shadow from FlexPriority. Some hardware=20 support CR8 accelerating but not FlexPriority... =2D-------- =46rom 5c787ce9d8fc7791d795a64b7c73b9cc4849a459 Mon Sep 17 00:00:00 2001 =46rom: Sheng Yang Date: Fri, 20 Jun 2008 11:24:46 +0800 Subject: [PATCH] KVM: VMX: Add capability report of Intel hardware Signed-off-by: Sheng Yang =2D-- arch/x86/kvm/vmx.c | 33 +++++++++++++++++++++++++++++++++ 1 files changed, 33 insertions(+), 0 deletions(-) diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 0fbbf6d..61826e3 100644 =2D-- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -119,6 +119,9 @@ struct vmx_capability { u32 vpid; } vmx_capability; +#define VMX_FEATURE_MAX_LEN 256 +static char vmx_feature_string[VMX_FEATURE_MAX_LEN] =3D "VMX: "; + #define VMX_SEGMENT_FIELD(seg) \ [VCPU_SREG_##seg] =3D { \ .selector =3D GUEST_##seg##_SELECTOR, \ @@ -1237,6 +1240,25 @@ static __init int alloc_kvm_area(void) return 0; } +static __init void build_feature_report(void) +{ + if (cpu_has_vmx_msr_bitmap()) + strlcat(vmx_feature_string, + "msr_bitmap ", VMX_FEATURE_MAX_LEN); + if (cpu_has_vmx_virtual_nmis()) + strlcat(vmx_feature_string, "vnmi ", VMX_FEATURE_MAX_LEN); + if (cpu_has_vmx_tpr_shadow()) + strlcat(vmx_feature_string, + "tpr_shadow ", VMX_FEATURE_MAX_LEN); + if (cpu_has_vmx_tpr_shadow() && cpu_has_vmx_virtualize_apic_accesses()) + strlcat(vmx_feature_string, + "flexpriority ", VMX_FEATURE_MAX_LEN); + if (cpu_has_vmx_ept()) + strlcat(vmx_feature_string, "ept ", VMX_FEATURE_MAX_LEN); + if (cpu_has_vmx_vpid()) + strlcat(vmx_feature_string, "vpid ", VMX_FEATURE_MAX_LEN); +} + static __init int hardware_setup(void) { if (setup_vmcs_config(&vmcs_config) < 0) @@ -1245,6 +1267,8 @@ static __init int hardware_setup(void) if (boot_cpu_has(X86_FEATURE_NX)) kvm_enable_efer_bits(EFER_NX); + build_feature_report(); + return alloc_kvm_area(); } @@ -3235,6 +3259,11 @@ static struct kvm_x86_ops vmx_x86_ops =3D { .get_tdp_level =3D get_ept_level, }; +static int vmx_feature_show(char *page) +{ + return sprintf(page, "%s\n", vmx_feature_string); +} + static int __init vmx_init(void) { void *va; @@ -3293,6 +3322,8 @@ static int __init vmx_init(void) ept_sync_global(); + kvm_register_hw_feature_report(vmx_feature_show); + return 0; out2: @@ -3310,6 +3341,8 @@ static void __exit vmx_exit(void) __free_page(vmx_io_bitmap_b); __free_page(vmx_io_bitmap_a); + kvm_unregister_hw_feature_report(); + kvm_exit(); } =2D- 1.5.5 --Boundary-00=_RNyWIMWKcITEqfE Content-Type: text/x-diff; charset="utf-8"; name="0003-KVM-VMX-Add-capability-report-of-Intel-hardware.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="0003-KVM-VMX-Add-capability-report-of-Intel-hardware.patch" =46rom 5c787ce9d8fc7791d795a64b7c73b9cc4849a459 Mon Sep 17 00:00:00 2001 =46rom: Sheng Yang Date: Fri, 20 Jun 2008 11:24:46 +0800 Subject: [PATCH] KVM: VMX: Add capability report of Intel hardware Signed-off-by: Sheng Yang =2D-- arch/x86/kvm/vmx.c | 33 +++++++++++++++++++++++++++++++++ 1 files changed, 33 insertions(+), 0 deletions(-) diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 0fbbf6d..61826e3 100644 =2D-- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -119,6 +119,9 @@ struct vmx_capability { u32 vpid; } vmx_capability; =20 +#define VMX_FEATURE_MAX_LEN 256 +static char vmx_feature_string[VMX_FEATURE_MAX_LEN] =3D "VMX: "; + #define VMX_SEGMENT_FIELD(seg) \ [VCPU_SREG_##seg] =3D { \ .selector =3D GUEST_##seg##_SELECTOR, \ @@ -1237,6 +1240,25 @@ static __init int alloc_kvm_area(void) return 0; } =20 +static __init void build_feature_report(void) +{ + if (cpu_has_vmx_msr_bitmap()) + strlcat(vmx_feature_string, + "msr_bitmap ", VMX_FEATURE_MAX_LEN); + if (cpu_has_vmx_virtual_nmis()) + strlcat(vmx_feature_string, "vnmi ", VMX_FEATURE_MAX_LEN); + if (cpu_has_vmx_tpr_shadow()) + strlcat(vmx_feature_string, + "tpr_shadow ", VMX_FEATURE_MAX_LEN); + if (cpu_has_vmx_tpr_shadow() && cpu_has_vmx_virtualize_apic_accesses()) + strlcat(vmx_feature_string, + "flexpriority ", VMX_FEATURE_MAX_LEN); + if (cpu_has_vmx_ept()) + strlcat(vmx_feature_string, "ept ", VMX_FEATURE_MAX_LEN); + if (cpu_has_vmx_vpid()) + strlcat(vmx_feature_string, "vpid ", VMX_FEATURE_MAX_LEN); +} + static __init int hardware_setup(void) { if (setup_vmcs_config(&vmcs_config) < 0) @@ -1245,6 +1267,8 @@ static __init int hardware_setup(void) if (boot_cpu_has(X86_FEATURE_NX)) kvm_enable_efer_bits(EFER_NX); =20 + build_feature_report(); + return alloc_kvm_area(); } =20 @@ -3235,6 +3259,11 @@ static struct kvm_x86_ops vmx_x86_ops =3D { .get_tdp_level =3D get_ept_level, }; =20 +static int vmx_feature_show(char *page) +{ + return sprintf(page, "%s\n", vmx_feature_string); +} + static int __init vmx_init(void) { void *va; @@ -3293,6 +3322,8 @@ static int __init vmx_init(void) =20 ept_sync_global(); =20 + kvm_register_hw_feature_report(vmx_feature_show); + return 0; =20 out2: @@ -3310,6 +3341,8 @@ static void __exit vmx_exit(void) __free_page(vmx_io_bitmap_b); __free_page(vmx_io_bitmap_a); =20 + kvm_unregister_hw_feature_report(); + kvm_exit(); } =20 =2D-=20 1.5.5 --Boundary-00=_RNyWIMWKcITEqfE--