use nixvm::abi::Arch;
use nixvm::fs::MountTable;
use nixvm::kernel::Kernel;
use nixvm::vcpu::Backend;
use nixvm::vcpu::GuestMemory;
use nixvm::vcpu::interp::InterpBackend;
use nixvm::vcpu::mem::{PAGE_SIZE, Prot};
fn run(program: &[u32], rw_page: Option<u64>) -> i32 {
let base = 0x1_0000u64;
let mut mem = GuestMemory::new(base, 256 * PAGE_SIZE);
mem.map(base, PAGE_SIZE, Prot::rx()).unwrap();
if let Some(p) = rw_page {
mem.map(p, PAGE_SIZE, Prot::rw()).unwrap();
}
let mut bytes = Vec::new();
for w in program {
bytes.extend_from_slice(&w.to_le_bytes());
}
mem.write_init(base, &bytes).unwrap();
let backend = InterpBackend::new(Arch::Aarch64).unwrap();
let vcpu = backend.new_vcpu(base, base + 250 * PAGE_SIZE).unwrap();
let mut kernel = Kernel::new(Arch::Aarch64, MountTable::new());
let code = kernel.run(vcpu, mem).unwrap();
assert!(
kernel.unsupported().is_empty(),
"{:?}",
kernel.unsupported()
);
code
}
#[test]
fn getpid_returns_one() {
let program = [0xD280_1588, 0xD400_0001, 0xD280_0BA8, 0xD400_0001];
assert_eq!(run(&program, None), 1);
}
#[test]
fn uname_fills_sysname() {
let program = [
0xD284_0000, 0xF2A0_0020, 0xAA00_03E9, 0xD280_1408, 0xD400_0001, 0x3940_0120, 0xD280_0BA8, 0xD400_0001, ];
assert_eq!(run(&program, Some(0x1_2000)), i32::from(b'L'));
}