19db68ca68
Kernel allocates 4K xstate buffer by default. For XSAVE features which require large state component (e.g. AMX), Linux kernel dynamically expands the xstate buffer only after the process has acquired the necessary permissions. Those are called dynamically- enabled XSAVE features (or dynamic xfeatures). There are separate permissions for native tasks and guests. Qemu should request the guest permissions for dynamic xfeatures which will be exposed to the guest. This only needs to be done once before the first vcpu is created. KVM implemented one new ARCH_GET_XCOMP_SUPP system attribute API to get host side supported_xcr0 and Qemu can decide if it can request dynamically enabled XSAVE features permission. https://lore.kernel.org/all/20220126152210.3044876-1-pbonzini@redhat.com/ Suggested-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Yang Zhong <yang.zhong@intel.com> Signed-off-by: Jing Liu <jing2.liu@intel.com> Message-Id: <20220217060434.52460-4-yang.zhong@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
58 lines
1.4 KiB
C
58 lines
1.4 KiB
C
/*
|
|
* QEMU KVM support -- x86 specific functions.
|
|
*
|
|
* Copyright (c) 2012 Linaro Limited
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
|
* See the COPYING file in the top-level directory.
|
|
*
|
|
*/
|
|
|
|
#ifndef QEMU_KVM_I386_H
|
|
#define QEMU_KVM_I386_H
|
|
|
|
#include "sysemu/kvm.h"
|
|
|
|
#define kvm_apic_in_kernel() (kvm_irqchip_in_kernel())
|
|
|
|
#ifdef CONFIG_KVM
|
|
|
|
#define kvm_pit_in_kernel() \
|
|
(kvm_irqchip_in_kernel() && !kvm_irqchip_is_split())
|
|
#define kvm_pic_in_kernel() \
|
|
(kvm_irqchip_in_kernel() && !kvm_irqchip_is_split())
|
|
#define kvm_ioapic_in_kernel() \
|
|
(kvm_irqchip_in_kernel() && !kvm_irqchip_is_split())
|
|
|
|
#else
|
|
|
|
#define kvm_pit_in_kernel() 0
|
|
#define kvm_pic_in_kernel() 0
|
|
#define kvm_ioapic_in_kernel() 0
|
|
|
|
#endif /* CONFIG_KVM */
|
|
|
|
bool kvm_has_smm(void);
|
|
bool kvm_has_adjust_clock(void);
|
|
bool kvm_has_adjust_clock_stable(void);
|
|
bool kvm_has_exception_payload(void);
|
|
void kvm_synchronize_all_tsc(void);
|
|
void kvm_arch_reset_vcpu(X86CPU *cs);
|
|
void kvm_arch_do_init_vcpu(X86CPU *cs);
|
|
|
|
void kvm_put_apicbase(X86CPU *cpu, uint64_t value);
|
|
|
|
bool kvm_enable_x2apic(void);
|
|
bool kvm_has_x2apic_api(void);
|
|
bool kvm_has_waitpkg(void);
|
|
|
|
bool kvm_hv_vpindex_settable(void);
|
|
bool kvm_hyperv_expand_features(X86CPU *cpu, Error **errp);
|
|
|
|
uint64_t kvm_swizzle_msi_ext_dest_id(uint64_t address);
|
|
|
|
bool kvm_enable_sgx_provisioning(KVMState *s);
|
|
void kvm_request_xsave_components(X86CPU *cpu, uint64_t mask);
|
|
|
|
#endif
|