rust-vmm / kvm-ioctls

Apache License 2.0
255 stars 103 forks source link

[RFC] Add support for `KVM_GET_XSAVE2` ioctls #261

Open roypat opened 2 months ago

roypat commented 2 months ago

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:

roypat commented 2 months ago

cc @likebreath since iirc you were looking into a post-5.17 solution for kvm_xsave, too