Since Linux 5.17, the kvm_xsave struct has a flexible array member (FAM) at the end, which can be retrieved using the KVM_GET_XSAVE2 ioctl [1]. What makes this FAM special is that the length is not stored in the header, but has to be retrieved via
KVM_CHECK_CAPABILITY(KVM_CAP_XSAVE2), which returns the total size of the kvm_xsave struct (e.g. the traditional 4096 byte header + the size of the FAM). Thus, to support KVM_GET_XSAVE2, we first need to check the capability on the VM fd, construct a FamStructWrapper of the correct size, and then call KVM_GET_XSAVE2.
I'm marking this as "RFC" because I'm not quite sure how to best deal the combination of "check capability on VM FD" and "do ioctl on vcpu FD". In this patch, I simply add a VmFd parameter to Vcpu::get_xsave2, but that's kinda ugly. Alternatively, we could store a reference to the VM file descriptor inside each Vcpu structure, but that'd be a larger change. What do people think about this?
(also, this PR needs https://github.com/rust-vmm/kvm-bindings/pull/104, because Rust apparently only type checks type aliases at use-sites instead of definition-site, meaning I did not notice that I forgot to implement Default for kvm_xsave2 when working on the new kvm-bindings release. That's why the CI is failing here for now)
Requirements
Before submitting your PR, please make sure you addressed the following
requirements:
[ ] All commits in this PR have Signed-Off-By trailers (with
git commit -s), and the commit message has max 60 characters for the
summary and max 75 characters for each description line.
[ ] All added/changed functionality has a corresponding unit/integration
test.
[ ] All added/changed public-facing functionality has entries in the "Upcoming
Release" section of CHANGELOG.md (if no such section exists, please create one).
[ ] Any newly added unsafe code is properly documented.
Since Linux 5.17, the
kvm_xsave
struct has a flexible array member (FAM) at the end, which can be retrieved using theKVM_GET_XSAVE2
ioctl [1]. What makes this FAM special is that the length is not stored in the header, but has to be retrieved viaKVM_CHECK_CAPABILITY(KVM_CAP_XSAVE2)
, which returns the total size of thekvm_xsave
struct (e.g. the traditional 4096 byte header + the size of the FAM). Thus, to supportKVM_GET_XSAVE2
, we first need to check the capability on the VM fd, construct a FamStructWrapper of the correct size, and then callKVM_GET_XSAVE2
.I'm marking this as "RFC" because I'm not quite sure how to best deal the combination of "check capability on VM FD" and "do ioctl on vcpu FD". In this patch, I simply add a
VmFd
parameter toVcpu::get_xsave2
, but that's kinda ugly. Alternatively, we could store a reference to the VM file descriptor inside eachVcpu
structure, but that'd be a larger change. What do people think about this?(also, this PR needs https://github.com/rust-vmm/kvm-bindings/pull/104, because Rust apparently only type checks type aliases at use-sites instead of definition-site, meaning I did not notice that I forgot to implementDefault
forkvm_xsave2
when working on the new kvm-bindings release. That's why the CI is failing here for now)Requirements
Before submitting your PR, please make sure you addressed the following requirements:
git commit -s
), and the commit message has max 60 characters for the summary and max 75 characters for each description line.unsafe
code is properly documented.