From mboxrd@z Thu Jan 1 00:00:00 1970 From: Boris Ostrovsky Subject: [PATCH v5 4/4] x86/hvm: Indicate avaliability of HW support of APIC virtualization to HVM guests Date: Tue, 18 Mar 2014 20:58:34 -0400 Message-ID: <1395190714-3802-5-git-send-email-boris.ostrovsky@oracle.com> References: <1395190714-3802-1-git-send-email-boris.ostrovsky@oracle.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1395190714-3802-1-git-send-email-boris.ostrovsky@oracle.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: jbeulich@suse.com, keir@xen.org, jun.nakajima@intel.com, eddie.dong@intel.com, ian.jackson@eu.citrix.com, stefano.stabellini@eu.citrix.com, ian.campbell@citrix.com Cc: yang.z.zhang@intel.com, andrew.cooper3@citrix.com, boris.ostrovsky@oracle.com, xen-devel@lists.xen.org List-Id: xen-devel@lists.xenproject.org Set bits in hypervisor CPUID leaf indicating that HW provides (and the hypervisor enables) HW support for APIC and x2APIC virtualization. Signed-off-by: Boris Ostrovsky --- xen/arch/x86/hvm/vmx/vmx.c | 15 +++++++++++++++ xen/include/public/arch-x86/cpuid.h | 10 ++++++++++ 2 files changed, 25 insertions(+) diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 8395e86..a59bac6 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -57,6 +57,7 @@ #include #include #include +#include enum handler_return { HNDL_done, HNDL_unhandled, HNDL_exception_raised }; @@ -1646,6 +1647,19 @@ static void vmx_handle_eoi(u8 vector) __vmwrite(GUEST_INTR_STATUS, status); } +void vmx_hypervisor_cpuid_leaf(uint32_t sub_idx, + uint32_t *eax, uint32_t *ebx, + uint32_t *ecx, uint32_t *edx) +{ + if ( sub_idx != 0 ) + return; + + if ( cpu_has_vmx_apic_reg_virt ) + *eax |= XEN_HVM_CPUID_APIC_ACCESS_VIRT; + if ( cpu_has_vmx_virtualize_x2apic_mode ) + *eax |= XEN_HVM_CPUID_X2APIC_VIRT; +} + static struct hvm_function_table __initdata vmx_function_table = { .name = "VMX", .cpu_up_prepare = vmx_cpu_up_prepare, @@ -1703,6 +1717,7 @@ static struct hvm_function_table __initdata vmx_function_table = { .sync_pir_to_irr = vmx_sync_pir_to_irr, .handle_eoi = vmx_handle_eoi, .nhvm_hap_walk_L1_p2m = nvmx_hap_walk_L1_p2m, + .hypervisor_cpuid_leaf= vmx_hypervisor_cpuid_leaf, }; const struct hvm_function_table * __init start_vmx(void) diff --git a/xen/include/public/arch-x86/cpuid.h b/xen/include/public/arch-x86/cpuid.h index d9bd627..7118760 100644 --- a/xen/include/public/arch-x86/cpuid.h +++ b/xen/include/public/arch-x86/cpuid.h @@ -65,4 +65,14 @@ #define _XEN_CPUID_FEAT1_MMU_PT_UPDATE_PRESERVE_AD 0 #define XEN_CPUID_FEAT1_MMU_PT_UPDATE_PRESERVE_AD (1u<<0) +/* + * Leaf 5 (0x40000004) + * HVM-specific features + */ + +/* EAX Features */ +#define XEN_HVM_CPUID_APIC_ACCESS_VIRT (1u << 0) /* Virtualized APIC registers */ +#define XEN_HVM_CPUID_X2APIC_VIRT (1u << 1) /* Virtualized x2APIC accesses */ + + #endif /* __XEN_PUBLIC_ARCH_X86_CPUID_H__ */ -- 1.7.10.4