From mboxrd@z Thu Jan 1 00:00:00 1970 From: Boris Ostrovsky Subject: [PATCH v7 3/3] x86/hvm: Indicate avaliability of HW support of APIC virtualization to HVM guests Date: Mon, 24 Mar 2014 19:18:39 -0400 Message-ID: <1395703119-11502-4-git-send-email-boris.ostrovsky@oracle.com> References: <1395703119-11502-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: <1395703119-11502-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, ian.campbell@citrix.com, ian.jackson@eu.citrix.com, stefano.stabellini@eu.citrix.com, eddie.dong@intel.com, jun.nakajima@intel.com, keir@xen.org 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 | 4 ++++ 2 files changed, 19 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 fff972a..7135d54 100644 --- a/xen/include/public/arch-x86/cpuid.h +++ b/xen/include/public/arch-x86/cpuid.h @@ -70,6 +70,10 @@ * 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 */ + #define XEN_CPUID_MAX_NUM_LEAVES 4 #endif /* __XEN_PUBLIC_ARCH_X86_CPUID_H__ */ -- 1.7.10.4