use crate::{x86::controlregs::{Cr4, Xcr0, cr4, cr4_write, xcr0_write}, cputure::GuestRegisters, vmexit::ExitType};
pub fn handle_xsetbv(guest_registers: &mut GuestRegisters) -> ExitType {
log::trace!("Handling XSETBV VM VM exit...");
let xcr: u32 = guest_registers.rcx as u32;
let value = (guest_registers.rax & 0xffff_ffff) | ((guest_registers.rdx & 0xffff_ffff) << 32);
let value = Xcr0::from_bits_truncate(value);
log::trace!("XSETBV executed with xcr: {:#x}, value: {:#x}", xcr, value);
cr4_write(cr4() | Cr4::CR4_ENABLE_OS_XSAVE);
xsetbv(value);
log::trace!("XSETBV VM exit handled successfully!");
return ExitType::IncrementRIP;
}
pub fn xsetbv(val: Xcr0) {
xcr0_write(val);
}