diff --git a/src/vmm/ept.rs b/src/vmm/ept.rs new file mode 100644 index 0000000..1827b96 --- /dev/null +++ b/src/vmm/ept.rs @@ -0,0 +1,30 @@ +use bitfield::bitfield; +use x86_64::PhysAddr; + +bitfield! { + pub struct EntryBase(u64); + impl Debug; + + pub read, set_read: 0; + pub write, set_write: 1; + pub exec_super, set_exec_super: 2; + pub typ, set_typ: 5, 3; + pub ignore_pat, set_ignore_pat: 6; + pub map_memory, set_map_memory: 7; + pub accessed, set_accessed: 8; + pub dirty, set_dirty: 9; + pub exec_user, set_exec_user: 10; + pub phys, set_phys: 63, 12; +} + +impl EntryBase { + pub fn present(&self) -> bool { + self.read() || self.write() || self.exec_super() + } + + pub fn address(&self) -> PhysAddr { + PhysAddr::new(self.phys() << 12) + } + + pub fn new_map_table() {} +} diff --git a/src/vmm/mod.rs b/src/vmm/mod.rs index 68f9713..88b8b76 100644 --- a/src/vmm/mod.rs +++ b/src/vmm/mod.rs @@ -1,3 +1,4 @@ +pub mod ept; pub mod error; pub mod register; pub mod support; diff --git a/src/vmm/vcpu.rs b/src/vmm/vcpu.rs index 52d50bd..84ef83e 100644 --- a/src/vmm/vcpu.rs +++ b/src/vmm/vcpu.rs @@ -351,9 +351,11 @@ impl VCpu { result == 0 }; - self.launch_done = true; + if !self.launch_done && success { + self.launch_done = true; + } - if success { + if !success { let error = InstructionError::read(); if error.0 != 0 { return Err(error); @@ -530,7 +532,7 @@ impl VCpu { "pop r14", "pop r15", "pop rbp", - "mov rax, 1", + "mov rax, 0", "ret", const RAX_OFFSET, const RCX_OFFSET,