From 6e34ecdc892f5a263b80c33b5d8c116110b5afed Mon Sep 17 00:00:00 2001 From: Masato Imai Date: Sat, 9 Aug 2025 14:06:29 +0000 Subject: [PATCH] wip --- nel_os_kernel/src/main.rs | 6 +++++- nel_os_kernel/src/vmm/x86_64/intel/ept.rs | 5 +++-- nel_os_kernel/src/vmm/x86_64/intel/mod.rs | 1 + nel_os_kernel/src/vmm/x86_64/intel/vcpu.rs | 12 ++++++++++++ nel_os_kernel/src/vmm/x86_64/intel/vmexit.rs | 0 5 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 nel_os_kernel/src/vmm/x86_64/intel/vmexit.rs diff --git a/nel_os_kernel/src/main.rs b/nel_os_kernel/src/main.rs index ffc68ab..ecee233 100644 --- a/nel_os_kernel/src/main.rs +++ b/nel_os_kernel/src/main.rs @@ -159,7 +159,11 @@ pub extern "sysv64" fn main(boot_info: &nel_os_common::BootInfo) { let mut vcpu = vmm::get_vcpu(&mut bitmap_table).unwrap(); loop { - info!("{:?}", vcpu.run(&mut bitmap_table)); + let result = vcpu.run(&mut bitmap_table); + if let Err(e) = result { + error!("VCPU run failed: {}", e); + break; + } } hlt_loop(); diff --git a/nel_os_kernel/src/vmm/x86_64/intel/ept.rs b/nel_os_kernel/src/vmm/x86_64/intel/ept.rs index 6ccc09c..ee8d12b 100644 --- a/nel_os_kernel/src/vmm/x86_64/intel/ept.rs +++ b/nel_os_kernel/src/vmm/x86_64/intel/ept.rs @@ -1,6 +1,6 @@ use modular_bitfield::{ bitfield, - prelude::{B3, B4, B52, B53}, + prelude::{B1, B3, B4, B52, B53}, }; use x86_64::{ structures::paging::{FrameAllocator, PhysFrame, Size4KiB}, @@ -325,7 +325,8 @@ pub struct EntryBase { pub accessed: bool, pub dirty: bool, pub exec_user: bool, - pub phys: B53, + reserved: B1, + pub phys: B52, } impl EntryBase { diff --git a/nel_os_kernel/src/vmm/x86_64/intel/mod.rs b/nel_os_kernel/src/vmm/x86_64/intel/mod.rs index 83614b2..e66f369 100644 --- a/nel_os_kernel/src/vmm/x86_64/intel/mod.rs +++ b/nel_os_kernel/src/vmm/x86_64/intel/mod.rs @@ -4,6 +4,7 @@ mod ept; mod register; pub mod vcpu; mod vmcs; +mod vmexit; mod vmxon; use core::arch::asm; diff --git a/nel_os_kernel/src/vmm/x86_64/intel/vcpu.rs b/nel_os_kernel/src/vmm/x86_64/intel/vcpu.rs index 1ea5462..4caaff5 100644 --- a/nel_os_kernel/src/vmm/x86_64/intel/vcpu.rs +++ b/nel_os_kernel/src/vmm/x86_64/intel/vcpu.rs @@ -76,6 +76,11 @@ impl IntelVCpu { VmxExitReason::HLT => { info!("VM hlt"); } + VmxExitReason::EPT_VIOLATION => { + let guest_address = vmread(vmcs::ro::GUEST_PHYSICAL_ADDR_FULL)?; + info!("EPT Violation at guest address: {:#x}", guest_address); + return Err("EPT Violation"); + } _ => { info!("VM exit reason: {:?}", exit_reason); } @@ -153,6 +158,13 @@ impl IntelVCpu { let eptp = ept::EPTP::init(&self.ept.root_table); vmwrite(x86::vmx::vmcs::control::EPTP_FULL, u64::from(eptp))?; + info!( + "GPA 0x0 -> HPA {:#x}", + self.ept + .get_phys_addr(0) + .ok_or("Failed to get physical address")? + ); + Ok(()) } diff --git a/nel_os_kernel/src/vmm/x86_64/intel/vmexit.rs b/nel_os_kernel/src/vmm/x86_64/intel/vmexit.rs new file mode 100644 index 0000000..e69de29