wip
This commit is contained in:
@ -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();
|
||||
|
@ -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 {
|
||||
|
@ -4,6 +4,7 @@ mod ept;
|
||||
mod register;
|
||||
pub mod vcpu;
|
||||
mod vmcs;
|
||||
mod vmexit;
|
||||
mod vmxon;
|
||||
|
||||
use core::arch::asm;
|
||||
|
@ -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(())
|
||||
}
|
||||
|
||||
|
0
nel_os_kernel/src/vmm/x86_64/intel/vmexit.rs
Normal file
0
nel_os_kernel/src/vmm/x86_64/intel/vmexit.rs
Normal file
Reference in New Issue
Block a user