use super::bindings::{KVM_REG_SIZE_U64, KVM_REG_X86};
pub const KVM_X86_REG_TYPE_MSR: u32 = 2;
pub const KVM_X86_REG_TYPE_KVM: u32 = 3;
pub const KVM_REG_GUEST_SSP: u32 = 0;
const fn kvm_x86_reg_id(reg_type: u32, size: u64, index: u32) -> u64 {
KVM_REG_X86 | ((reg_type as u64) << 32) | size | index as u64
}
pub const fn kvm_x86_reg_msr(index: u32) -> u64 {
kvm_x86_reg_id(KVM_X86_REG_TYPE_MSR, KVM_REG_SIZE_U64, index)
}
pub const fn kvm_x86_reg_kvm(index: u32) -> u64 {
let size = if index == KVM_REG_GUEST_SSP {
KVM_REG_SIZE_U64
} else {
0
};
kvm_x86_reg_id(KVM_X86_REG_TYPE_KVM, size, index)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_guest_ssp_id_matches_the_kernel() {
assert_eq!(kvm_x86_reg_kvm(KVM_REG_GUEST_SSP), 0x2030_0003_0000_0000);
}
#[test]
fn test_msr_id_carries_type_size_and_index() {
assert_eq!(kvm_x86_reg_msr(0xc000_0080), 0x2030_0002_c000_0080);
}
#[test]
fn test_unknown_kvm_register_has_no_size() {
assert_eq!(kvm_x86_reg_kvm(1), 0x2000_0003_0000_0001);
}
}