extern crate kvm;
extern crate memmap;
use kvm::{Capability, Exit, IoDirection, System, Vcpu, VirtualMachine};
use memmap::{Mmap, Protection};
fn main() {
let mut anon_mmap = Mmap::anonymous(2 * (1 << 20), Protection::ReadWrite)
.unwrap();
let slice = unsafe { anon_mmap.as_mut_slice() };
slice[0x100000] = 0xe4;
slice[0x100001] = 0x01;
let sys = System::initialize().unwrap();
let mut vm = VirtualMachine::create(&sys).unwrap();
assert!(vm.check_capability(Capability::UserMemory) > 0);
vm.set_user_memory_region(0, slice, 0).unwrap();
let mut vcpu = Vcpu::create(&mut vm).unwrap();
let mut cpuid = sys.get_supported_cpuid().unwrap();
vcpu.set_cpuid2(&mut cpuid).unwrap();
let mut sregs = vcpu.get_sregs().unwrap();
sregs.cs.base = 0x0;
sregs.cs.limit = 0xffffffff;
sregs.cs.selector = 0x8;
sregs.cs._type = 0xb;
sregs.cs.present = 1;
sregs.cs.dpl = 0;
sregs.cs.db = 0;
sregs.cs.s = 1;
sregs.cs.l = 0;
sregs.cs.g = 1;
sregs.cs.avl = 0;
sregs.cr0 = 0x50033;
vcpu.set_sregs(&sregs).unwrap();
let mut regs = vcpu.get_regs().unwrap();
regs.rip = 0x100000;
regs.rflags = 0x2;
vcpu.set_regs(®s).unwrap();
let run = unsafe { vcpu.run() }.unwrap();
assert!(run.exit_reason == Exit::Io);
let io = unsafe { *run.io() };
assert!(io.direction == IoDirection::In);
assert!(io.size == 1);
assert!(io.port == 0x1);
unsafe {
println!("{:#?}", *run.io());
}
}