pub struct MMU { /* private fields */ }
Implementations§
source§impl MMU
impl MMU
pub fn mmap(&mut self, addr: VA, size: u64, perms: Permissions) -> Result<()>
pub fn munmap(&mut self, addr: VA, size: u64) -> Result<()>
pub fn mprotect(&mut self, addr: VA, size: u64, perms: Permissions) -> Result<()>
sourcepub fn read(
&self,
addr: VA,
buf: &mut [u8],
perms: Permissions
) -> Result<(), MMUError>
pub fn read(
&self,
addr: VA,
buf: &mut [u8],
perms: Permissions
) -> Result<(), MMUError>
read up to one page worth of data from the given address. read will not span more than two pages.
perms
are the permissions used to access the data.
these should match the permissions of the underlying page.
if the page does not have these permissions, then the access will fail.
Errors: MMUError::AddressNotMapped - if the page is not mapped. MMUError::AccessViolation - if the given address is not readable/executable.
sourcepub fn read_u8(&self, addr: VA) -> Result<u8, MMUError>
pub fn read_u8(&self, addr: VA) -> Result<u8, MMUError>
Errors:
- MMUError::AddressNotMapped when the given address is not mapped.
- MMUError::AccessViolation when the given address is not readable.
sourcepub fn read_u16(&self, addr: VA) -> Result<u16, MMUError>
pub fn read_u16(&self, addr: VA) -> Result<u16, MMUError>
Errors:
- MMUError::AddressNotMapped when the given address is not mapped.
- MMUError::AccessViolation when the given address is not readable.
sourcepub fn read_u32(&self, addr: VA) -> Result<u32, MMUError>
pub fn read_u32(&self, addr: VA) -> Result<u32, MMUError>
Errors:
- MMUError::AddressNotMapped when the given address is not mapped.
- MMUError::AccessViolation when the given address is not readable.
sourcepub fn read_u64(&self, addr: VA) -> Result<u64, MMUError>
pub fn read_u64(&self, addr: VA) -> Result<u64, MMUError>
Errors:
- MMUError::AddressNotMapped when the given address is not mapped.
- MMUError::AccessViolation when the given address is not readable.
sourcepub fn read_u128(&self, addr: VA) -> Result<u128, MMUError>
pub fn read_u128(&self, addr: VA) -> Result<u128, MMUError>
Errors:
- MMUError::AddressNotMapped when the given address is not mapped.
- MMUError::AccessViolation when the given address is not readable.
sourcepub fn read_page(&self, addr: VA) -> Result<[u8; 4096], MMUError>
pub fn read_page(&self, addr: VA) -> Result<[u8; 4096], MMUError>
read one page worth of data from the given page-aligned address.
panics if addr
is not page-aligned.
Errors:
- MMUError::AddressNotMapped when the given address is not mapped.
- MMUError::AccessViolation when the given address is not readable.
sourcepub fn fetch(&self, addr: VA) -> Result<[u8; 16], MMUError>
pub fn fetch(&self, addr: VA) -> Result<[u8; 16], MMUError>
read 16-bytes of data from the given address.
Errors:
- MMUError::AddressNotMapped when the given address is not mapped.
- MMUError::AccessViolation when the given address is not executable.
sourcepub fn write(&mut self, addr: VA, buf: &[u8]) -> Result<(), MMUError>
pub fn write(&mut self, addr: VA, buf: &[u8]) -> Result<(), MMUError>
write up one one page worth of data to the given address.
Errors:
- MMUError::AddressNotMapped when the given address is not mapped.
- MMUError::AccessViolation when the given address is not writable.
sourcepub fn write_u8(&mut self, addr: VA, value: u8) -> Result<(), MMUError>
pub fn write_u8(&mut self, addr: VA, value: u8) -> Result<(), MMUError>
Errors:
- MMUError::AddressNotMapped when the given address is not mapped.
- MMUError::AccessViolation when the given address is not writable.
sourcepub fn write_u16(&mut self, addr: VA, value: u16) -> Result<(), MMUError>
pub fn write_u16(&mut self, addr: VA, value: u16) -> Result<(), MMUError>
Errors:
- MMUError::AddressNotMapped when the given address is not mapped.
- MMUError::AccessViolation when the given address is not writable.
sourcepub fn write_u32(&mut self, addr: VA, value: u32) -> Result<(), MMUError>
pub fn write_u32(&mut self, addr: VA, value: u32) -> Result<(), MMUError>
Errors:
- MMUError::AddressNotMapped when the given address is not mapped.
- MMUError::AccessViolation when the given address is not writable.
sourcepub fn write_u64(&mut self, addr: VA, value: u64) -> Result<(), MMUError>
pub fn write_u64(&mut self, addr: VA, value: u64) -> Result<(), MMUError>
Errors:
- MMUError::AddressNotMapped when the given address is not mapped.
- MMUError::AccessViolation when the given address is not writable.
sourcepub fn write_u128(&mut self, addr: VA, value: u128) -> Result<(), MMUError>
pub fn write_u128(&mut self, addr: VA, value: u128) -> Result<(), MMUError>
Errors:
- MMUError::AddressNotMapped when the given address is not mapped.
- MMUError::AccessViolation when the given address is not writable.
sourcepub fn write_page(&mut self, addr: VA, value: &[u8]) -> Result<(), MMUError>
pub fn write_page(&mut self, addr: VA, value: &[u8]) -> Result<(), MMUError>
write one page worth of data from the given page-aligned address.
panics if addr
is not page-aligned.
panics if value
is not one page in size.
Errors:
- MMUError::AddressNotMapped when the given address is not mapped.
- MMUError::AccessViolation when the given address is not writable.
sourcepub fn poke(&mut self, addr: VA, buf: &[u8]) -> Result<(), MMUError>
pub fn poke(&mut self, addr: VA, buf: &[u8]) -> Result<(), MMUError>
write up one one page worth of data to the given address. does not respect the write permission, so should not be called by instruction emulation. appropriate to be used by users of an emulator to tweak memory.
Errors:
- MMUError::AddressNotMapped when the given address is not mapped.
sourcepub fn poke_u8(&mut self, addr: VA, value: u8) -> Result<(), MMUError>
pub fn poke_u8(&mut self, addr: VA, value: u8) -> Result<(), MMUError>
Errors:
- MMUError::AddressNotMapped when the given address is not mapped.
sourcepub fn poke_u16(&mut self, addr: VA, value: u16) -> Result<(), MMUError>
pub fn poke_u16(&mut self, addr: VA, value: u16) -> Result<(), MMUError>
Errors:
- MMUError::AddressNotMapped when the given address is not mapped.
sourcepub fn poke_u32(&mut self, addr: VA, value: u32) -> Result<(), MMUError>
pub fn poke_u32(&mut self, addr: VA, value: u32) -> Result<(), MMUError>
Errors:
- MMUError::AddressNotMapped when the given address is not mapped.
sourcepub fn poke_u64(&mut self, addr: VA, value: u64) -> Result<(), MMUError>
pub fn poke_u64(&mut self, addr: VA, value: u64) -> Result<(), MMUError>
Errors:
- MMUError::AddressNotMapped when the given address is not mapped.
Trait Implementations§
Auto Trait Implementations§
impl RefUnwindSafe for MMU
impl Send for MMU
impl Sync for MMU
impl Unpin for MMU
impl UnwindSafe for MMU
Blanket Implementations§
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds. Read more§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
.tap_borrow()
only in debug builds, and is erased in release
builds. Read more§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
.tap_borrow_mut()
only in debug builds, and is erased in release
builds. Read more§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
.tap_ref()
only in debug builds, and is erased in release
builds. Read more§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
.tap_ref_mut()
only in debug builds, and is erased in release
builds. Read more