#![allow(dead_code)]
static CODE: &[u8] = &[
0x40, 0x00, 0x80, 0xD2, 0x00, 0x08, 0x00, 0x91, 0x00, 0x04, 0x00, 0xD1, 0x20, 0x00, 0x00, 0xF9, 0x20, 0x01, 0x80, 0xd2, 0x00, 0x80, 0xb0, 0xf2, 0x02, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, 0x14,
];
const MEM_SIZE: usize = 0x100000;
const GUEST_ADDR: usize = 0x69420000;
const RESULT_OFFSET: usize = 0x100;
const GUEST_RESULT_ADDR: usize = GUEST_ADDR + RESULT_OFFSET;
#[cfg(target_arch = "aarch64")]
use hv::arm64::{Reg, VcpuExt};
#[cfg(target_arch = "aarch64")]
fn main() -> Result<(), hv::Error> {
use std::sync::Arc;
let load_addr = unsafe {
libc::mmap(
std::ptr::null_mut(),
MEM_SIZE,
libc::PROT_READ | libc::PROT_WRITE,
libc::MAP_ANONYMOUS | libc::MAP_PRIVATE | libc::MAP_NORESERVE,
-1,
0,
) as *mut u8
};
if load_addr == libc::MAP_FAILED as _ {
panic!("libc::mmap returned MAP_FAILED");
}
unsafe {
std::ptr::copy_nonoverlapping(CODE.as_ptr(), load_addr, CODE.len());
}
let vm = Arc::new(hv::Vm::new(std::ptr::null_mut())?);
vm.map(
load_addr,
GUEST_ADDR as _,
MEM_SIZE as _,
hv::Memory::READ | hv::Memory::WRITE | hv::Memory::EXEC,
)?;
let cpu = vm.create_cpu()?;
cpu.set_reg(Reg::PC, GUEST_ADDR as _)
.expect("Failed to set PC reg");
cpu.set_reg(Reg::X1, GUEST_RESULT_ADDR as _)
.expect("Failed to set X1");
loop {
cpu.run().expect("Failed to run CPU");
let info = cpu.exit_info();
println!("{:?}", info);
break;
}
let result_addr = unsafe { load_addr.add(RESULT_OFFSET) } as *const u64;
let result = unsafe { *result_addr };
println!("Result: {}", result);
assert_eq!(result, 3);
Ok(())
}
#[cfg(target_arch = "x86_64")]
fn main() {}