Out of program execution parameter
This commit is contained in:
parent
de811c172e
commit
73eed89ab3
|
@ -16,7 +16,7 @@ fuzz_target!(|data: &[u8]| {
|
||||||
if validate(data).is_ok() {
|
if validate(data).is_ok() {
|
||||||
let mut vm = unsafe {
|
let mut vm = unsafe {
|
||||||
Vm::<_, 16384>::new(
|
Vm::<_, 16384>::new(
|
||||||
SoftPagedMem {
|
SoftPagedMem::<_, true> {
|
||||||
pf_handler: TestTrapHandler,
|
pf_handler: TestTrapHandler,
|
||||||
program: data,
|
program: data,
|
||||||
root_pt: Box::into_raw(Default::default()),
|
root_pt: Box::into_raw(Default::default()),
|
||||||
|
|
|
@ -17,7 +17,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
} else {
|
} else {
|
||||||
unsafe {
|
unsafe {
|
||||||
let mut vm = Vm::<_, 0>::new(
|
let mut vm = Vm::<_, 0>::new(
|
||||||
SoftPagedMem {
|
SoftPagedMem::<_, true> {
|
||||||
pf_handler: TestTrapHandler,
|
pf_handler: TestTrapHandler,
|
||||||
program: &prog,
|
program: &prog,
|
||||||
root_pt: Box::into_raw(Default::default()),
|
root_pt: Box::into_raw(Default::default()),
|
||||||
|
|
|
@ -10,7 +10,7 @@ use {
|
||||||
derive_more::Display,
|
derive_more::Display,
|
||||||
};
|
};
|
||||||
|
|
||||||
impl<'p, A> SoftPagedMem<'p, A> {
|
impl<'p, A, const OUT_PROG_EXEC: bool> SoftPagedMem<'p, A, OUT_PROG_EXEC> {
|
||||||
/// Maps host's memory into VM's memory
|
/// Maps host's memory into VM's memory
|
||||||
///
|
///
|
||||||
/// # Safety
|
/// # Safety
|
||||||
|
|
|
@ -18,8 +18,12 @@ use {
|
||||||
};
|
};
|
||||||
|
|
||||||
/// HoleyBytes software paged memory
|
/// HoleyBytes software paged memory
|
||||||
|
///
|
||||||
|
/// - `OUT_PROG_EXEC`: set to `false` to disable executing program
|
||||||
|
/// not contained in initially provided program, even the pages
|
||||||
|
/// are executable
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct SoftPagedMem<'p, PfH> {
|
pub struct SoftPagedMem<'p, PfH, const OUT_PROG_EXEC: bool = true> {
|
||||||
/// Root page table
|
/// Root page table
|
||||||
pub root_pt: *mut PageTable,
|
pub root_pt: *mut PageTable,
|
||||||
/// Page fault handler
|
/// Page fault handler
|
||||||
|
@ -30,7 +34,9 @@ pub struct SoftPagedMem<'p, PfH> {
|
||||||
pub icache: ICache,
|
pub icache: ICache,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'p, PfH: HandlePageFault> Memory for SoftPagedMem<'p, PfH> {
|
impl<'p, PfH: HandlePageFault, const OUT_PROG_EXEC: bool> Memory
|
||||||
|
for SoftPagedMem<'p, PfH, OUT_PROG_EXEC>
|
||||||
|
{
|
||||||
/// Load value from an address
|
/// Load value from an address
|
||||||
///
|
///
|
||||||
/// # Safety
|
/// # Safety
|
||||||
|
@ -70,7 +76,7 @@ impl<'p, PfH: HandlePageFault> Memory for SoftPagedMem<'p, PfH> {
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
unsafe fn prog_read<T>(&mut self, addr: u64) -> Option<T> {
|
unsafe fn prog_read<T>(&mut self, addr: u64) -> Option<T> {
|
||||||
if addr as usize > self.program.len() {
|
if OUT_PROG_EXEC && addr as usize > self.program.len() {
|
||||||
return self.icache.fetch::<T>(addr, self.root_pt);
|
return self.icache.fetch::<T>(addr, self.root_pt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,7 +88,7 @@ impl<'p, PfH: HandlePageFault> Memory for SoftPagedMem<'p, PfH> {
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
unsafe fn prog_read_unchecked<T>(&mut self, addr: u64) -> T {
|
unsafe fn prog_read_unchecked<T>(&mut self, addr: u64) -> T {
|
||||||
if addr as usize > self.program.len() {
|
if OUT_PROG_EXEC && addr as usize > self.program.len() {
|
||||||
return self
|
return self
|
||||||
.icache
|
.icache
|
||||||
.fetch::<T>(addr as _, self.root_pt)
|
.fetch::<T>(addr as _, self.root_pt)
|
||||||
|
@ -93,7 +99,7 @@ impl<'p, PfH: HandlePageFault> Memory for SoftPagedMem<'p, PfH> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'p, PfH: HandlePageFault> SoftPagedMem<'p, PfH> {
|
impl<'p, PfH: HandlePageFault, const OUT_PROG_EXEC: bool> SoftPagedMem<'p, PfH, OUT_PROG_EXEC> {
|
||||||
// Everyone behold, the holy function, the god of HBVM memory accesses!
|
// Everyone behold, the holy function, the god of HBVM memory accesses!
|
||||||
|
|
||||||
/// Split address to pages, check their permissions and feed pointers with offset
|
/// Split address to pages, check their permissions and feed pointers with offset
|
||||||
|
|
Loading…
Reference in a new issue