add support for sse

This commit is contained in:
Masato Imai
2025-05-08 05:08:44 +00:00
parent 570dd19af6
commit 27be632322
4 changed files with 48 additions and 12 deletions

View File

@ -22,6 +22,8 @@ use core::panic::PanicInfo;
use bootloader::entry_point; use bootloader::entry_point;
#[cfg(test)] #[cfg(test)]
use bootloader::BootInfo; use bootloader::BootInfo;
use x86_64::registers::control::Cr4;
use x86_64::registers::control::Cr4Flags;
pub trait Testable { pub trait Testable {
fn run(&self) -> (); fn run(&self) -> ();
@ -103,4 +105,6 @@ pub fn init() {
interrupts::PICS.lock().initialize(); interrupts::PICS.lock().initialize();
} }
x86_64::instructions::interrupts::enable(); x86_64::instructions::interrupts::enable();
let cr = Cr4::read() | Cr4Flags::OSFXSR;
unsafe { Cr4::write(cr) };
} }

View File

@ -28,15 +28,16 @@ const R12_OFFSET: usize = offset_of!(GuestRegisters, r12);
const R13_OFFSET: usize = offset_of!(GuestRegisters, r13); const R13_OFFSET: usize = offset_of!(GuestRegisters, r13);
const R14_OFFSET: usize = offset_of!(GuestRegisters, r14); const R14_OFFSET: usize = offset_of!(GuestRegisters, r14);
const R15_OFFSET: usize = offset_of!(GuestRegisters, r15); const R15_OFFSET: usize = offset_of!(GuestRegisters, r15);
const XMM0_OFFSET: usize = offset_of!(GuestRegisters, xmm0);
const XMM1_OFFSET: usize = offset_of!(GuestRegisters, xmm1);
const XMM2_OFFSET: usize = offset_of!(GuestRegisters, xmm2);
const XMM3_OFFSET: usize = offset_of!(GuestRegisters, xmm3);
const XMM4_OFFSET: usize = offset_of!(GuestRegisters, xmm4);
const XMM5_OFFSET: usize = offset_of!(GuestRegisters, xmm5);
const XMM6_OFFSET: usize = offset_of!(GuestRegisters, xmm6);
const XMM7_OFFSET: usize = offset_of!(GuestRegisters, xmm7);
global_asm!( global_asm!(
".global guest_entry",
".type guest_entry, @function",
"guest_entry:",
"2: hlt",
"jmp 2b",
".size guest_entry, . - guest_entry",
".global asm_vm_entry_resume", ".global asm_vm_entry_resume",
".type asm_vm_entry_resume, @function", ".type asm_vm_entry_resume, @function",
"asm_vm_entry_resume:", "asm_vm_entry_resume:",
@ -67,6 +68,14 @@ global_asm!(
"mov r13, [rax+{13}]", "mov r13, [rax+{13}]",
"mov r14, [rax+{14}]", "mov r14, [rax+{14}]",
"mov r15, [rax+{15}]", "mov r15, [rax+{15}]",
"movaps xmm0, [rax+{17}]",
"movaps xmm1, [rax+{18}]",
"movaps xmm2, [rax+{19}]",
"movaps xmm3, [rax+{20}]",
"movaps xmm4, [rax+{21}]",
"movaps xmm5, [rax+{22}]",
"movaps xmm6, [rax+{23}]",
"movaps xmm7, [rax+{24}]",
"mov rax, [rax+{16}]", "mov rax, [rax+{16}]",
"vmresume", "vmresume",
"mov ax, 1", "mov ax, 1",
@ -112,6 +121,14 @@ global_asm!(
"mov r14, [rax+{14}]", "mov r14, [rax+{14}]",
"mov r15, [rax+{15}]", "mov r15, [rax+{15}]",
"mov rax, [rax+{16}]", "mov rax, [rax+{16}]",
"movaps xmm0, [rax+{17}]",
"movaps xmm1, [rax+{18}]",
"movaps xmm2, [rax+{19}]",
"movaps xmm3, [rax+{20}]",
"movaps xmm4, [rax+{21}]",
"movaps xmm5, [rax+{22}]",
"movaps xmm6, [rax+{23}]",
"movaps xmm7, [rax+{24}]",
"vmlaunch", "vmlaunch",
"mov ax, 1", "mov ax, 1",
"add rsp, 8", "add rsp, 8",
@ -145,6 +162,14 @@ global_asm!(
"mov [rax+{13}], r13", "mov [rax+{13}], r13",
"mov [rax+{14}], r14", "mov [rax+{14}], r14",
"mov [rax+{15}], r15", "mov [rax+{15}], r15",
"movaps [rax+{17}], xmm0",
"movaps [rax+{18}], xmm1",
"movaps [rax+{19}], xmm2",
"movaps [rax+{20}], xmm3",
"movaps [rax+{21}], xmm4",
"movaps [rax+{22}], xmm5",
"movaps [rax+{23}], xmm6",
"movaps [rax+{24}], xmm7",
"pop rbx", "pop rbx",
"pop r12", "pop r12",
"pop r13", "pop r13",
@ -172,4 +197,12 @@ global_asm!(
const R14_OFFSET, const R14_OFFSET,
const R15_OFFSET, const R15_OFFSET,
const RAX_OFFSET, const RAX_OFFSET,
const XMM0_OFFSET,
const XMM1_OFFSET,
const XMM2_OFFSET,
const XMM3_OFFSET,
const XMM4_OFFSET,
const XMM5_OFFSET,
const XMM6_OFFSET,
const XMM7_OFFSET,
); );

View File

@ -78,8 +78,8 @@ pub fn handle_cpuid_exit(vcpu: &mut VCpu) {
acpi: true, acpi: true,
mmx: false, mmx: false,
fxsr: true, fxsr: true,
sse: false, sse: true,
sse2: false, sse2: true,
ss: false, ss: false,
htt: false, htt: false,
tm: false, tm: false,

View File

@ -352,9 +352,8 @@ impl VCpu {
info!("Setting up guest state"); info!("Setting up guest state");
unsafe { unsafe {
let cr0 = Cr0::empty() let cr0 = (Cr0::empty() | Cr0::CR0_PROTECTED_MODE | Cr0::CR0_NUMERIC_ERROR)
| Cr0::CR0_PROTECTED_MODE & !Cr0::CR0_ENABLE_PAGING;
| Cr0::CR0_NUMERIC_ERROR & !Cr0::CR0_ENABLE_PAGING;
vmwrite(vmcs::guest::CR0, cr0.bits() as u64)?; vmwrite(vmcs::guest::CR0, cr0.bits() as u64)?;
vmwrite(vmcs::guest::CR3, cr3())?; vmwrite(vmcs::guest::CR3, cr3())?;
vmwrite(vmcs::guest::CR4, cr4().bits() as u64)?; vmwrite(vmcs::guest::CR4, cr4().bits() as u64)?;