holey-bytes/hbvm/fuzz/fuzz_targets/vm.rs

83 lines
2 KiB
Rust
Raw Normal View History

2023-07-25 23:01:53 +00:00
#![no_main]
use {
2023-07-25 23:11:21 +00:00
hbvm::{
mem::{
softpaging::{
paging::{PageTable, Permission},
HandlePageFault, PageSize, SoftPagedMem,
},
Address, MemoryAccessReason,
2023-08-09 00:33:03 +00:00
},
Vm,
2023-07-25 23:01:53 +00:00
},
libfuzzer_sys::fuzz_target,
};
fuzz_target!(|data: &[u8]| {
2023-11-03 08:49:42 +00:00
let mut vm = unsafe {
Vm::<_, 16384>::new(
SoftPagedMem::<_, true> {
pf_handler: TestTrapHandler,
program: data,
root_pt: Box::into_raw(Default::default()),
icache: Default::default(),
},
Address::new(4),
)
};
2023-11-03 08:49:42 +00:00
// Alloc and map some memory
let pages = [
alloc_and_map(&mut vm.memory, 0),
alloc_and_map(&mut vm.memory, 4096),
];
2023-11-03 08:49:42 +00:00
// Run VM
let _ = vm.run();
2023-08-17 23:28:02 +00:00
2023-11-03 08:49:42 +00:00
// Unmap and dealloc the memory
for (i, page) in pages.into_iter().enumerate() {
unmap_and_dealloc(&mut vm.memory, page, i as u64 * 4096);
2023-07-25 23:01:53 +00:00
}
2023-11-03 08:49:42 +00:00
let _ = unsafe { Box::from_raw(vm.memory.root_pt) };
2023-07-25 23:01:53 +00:00
});
2023-08-09 00:33:03 +00:00
fn alloc_and_map(memory: &mut SoftPagedMem<TestTrapHandler>, at: u64) -> *mut u8 {
2023-07-26 10:22:28 +00:00
let ptr = Box::into_raw(Box::<Page>::default()).cast();
unsafe {
memory
.map(ptr, Address::new(at), Permission::Write, PageSize::Size4K)
2023-07-26 10:22:28 +00:00
.unwrap()
};
ptr
}
2023-08-09 00:33:03 +00:00
fn unmap_and_dealloc(memory: &mut SoftPagedMem<TestTrapHandler>, ptr: *mut u8, from: u64) {
memory.unmap(Address::new(from)).unwrap();
2023-07-26 10:22:28 +00:00
let _ = unsafe { Box::from_raw(ptr.cast::<Page>()) };
}
#[repr(align(4096))]
struct Page([u8; 4096]);
impl Default for Page {
fn default() -> Self {
unsafe { std::mem::MaybeUninit::zeroed().assume_init() }
}
}
2023-07-25 23:01:53 +00:00
struct TestTrapHandler;
impl HandlePageFault for TestTrapHandler {
fn page_fault(
&mut self,
_: MemoryAccessReason,
2023-08-09 00:33:03 +00:00
_: &mut PageTable,
_: Address,
2023-07-25 23:01:53 +00:00
_: PageSize,
_: *mut u8,
) -> bool {
false
}
}