diff options
Diffstat (limited to 'examples')
-rw-r--r-- | examples/real_mode.rs | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/examples/real_mode.rs b/examples/real_mode.rs new file mode 100644 index 0000000..39d1796 --- /dev/null +++ b/examples/real_mode.rs @@ -0,0 +1,48 @@ +use kvm_rs::kvm::Kvm; +use kvm_rs::vcpu::KvmExit; +use kvm_rs::{PhysAddr, UserMem}; + +fn main() -> std::io::Result<()> { + // Create VM & VCPU. + let vm = Kvm::new()?.create_vm()?; + let vcpu = vm.create_vpcu(0)?; + + // Map memory for guest VM and initialize with guest image. + let mem = UserMem::with_init(0x1000, include_bytes!("../guest/guest16"))?; + unsafe { + vm.set_user_memory_region(PhysAddr(0x0), &mem)?; + } + + // Initialize VPCU registers. + let mut regs = vcpu.get_regs()?; + regs.rip = 0; + regs.rflags.0 = 0x2; + vcpu.set_regs(regs)?; + + // Initialize VPCU special registers. + let mut sregs = vcpu.get_sregs()?; + sregs.cs.base = 0; + sregs.cs.selector = 0; + vcpu.set_sregs(sregs)?; + + // Run VCPU until `hlt` instruction. + while let Ok(exit) = vcpu.run() { + match exit { + KvmExit::Halt => break, + KvmExit::IoOut(_port, data) => { + let s = std::str::from_utf8(data).unwrap(); + print!("{}", s); + } + KvmExit::MmioWrite(addr, data) => { + println!( + "MMIO_WRITE: addr={:#x} len={} data={:#x?}", + addr, + data.len(), + data + ); + } + }; + } + + Ok(()) +} |