kvm: x86: Add support for getting/setting expanded xstate buffer
With KVM_CAP_XSAVE, userspace uses a hardcoded 4KB buffer to get/set xstate data from/to KVM. This doesn't work when dynamic xfeatures (e.g. AMX) are exposed to the guest as they require a larger buffer size. Introduce a new capability (KVM_CAP_XSAVE2). Userspace VMM gets the required xstate buffer size via KVM_CHECK_EXTENSION(KVM_CAP_XSAVE2). KVM_SET_XSAVE is extended to work with both legacy and new capabilities by doing properly-sized memdup_user() based on the guest fpu container. KVM_GET_XSAVE is kept for backward-compatible reason. Instead, KVM_GET_XSAVE2 is introduced under KVM_CAP_XSAVE2 as the preferred interface for getting xstate buffer (4KB or larger size) from KVM (Link: https://lkml.org/lkml/2021/12/15/510) Also, update the api doc with the new KVM_GET_XSAVE2 ioctl. Signed-off-by: Guang Zeng <guang.zeng@intel.com> Signed-off-by: Wei Wang <wei.w.wang@intel.com> Signed-off-by: Jing Liu <jing2.liu@intel.com> Signed-off-by: Kevin Tian <kevin.tian@intel.com> Signed-off-by: Yang Zhong <yang.zhong@intel.com> Message-Id: <20220105123532.12586-19-yang.zhong@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
committed by
Paolo Bonzini
parent
c60427dd50
commit
be50b2065d
@@ -373,9 +373,23 @@ struct kvm_debugregs {
|
||||
__u64 reserved[9];
|
||||
};
|
||||
|
||||
/* for KVM_CAP_XSAVE */
|
||||
/* for KVM_CAP_XSAVE and KVM_CAP_XSAVE2 */
|
||||
struct kvm_xsave {
|
||||
/*
|
||||
* KVM_GET_XSAVE2 and KVM_SET_XSAVE write and read as many bytes
|
||||
* as are returned by KVM_CHECK_EXTENSION(KVM_CAP_XSAVE2)
|
||||
* respectively, when invoked on the vm file descriptor.
|
||||
*
|
||||
* The size value returned by KVM_CHECK_EXTENSION(KVM_CAP_XSAVE2)
|
||||
* will always be at least 4096. Currently, it is only greater
|
||||
* than 4096 if a dynamic feature has been enabled with
|
||||
* ``arch_prctl()``, but this may change in the future.
|
||||
*
|
||||
* The offsets of the state save areas in struct kvm_xsave follow
|
||||
* the contents of CPUID leaf 0xD on the host.
|
||||
*/
|
||||
__u32 region[1024];
|
||||
__u32 extra[0];
|
||||
};
|
||||
|
||||
#define KVM_MAX_XCRS 16
|
||||
|
||||
Reference in New Issue
Block a user