pub struct VmWriter<'a, Fallibility = Fallible> {
cursor: *mut u8,
end: *mut u8,
phantom: PhantomData<(&'a mut [u8], Fallibility)>,
}
Expand description
VmWriter
is a writer for writing data to a contiguous range of memory.
The memory range write by VmWriter
can be in either kernel space or user space.
When the operating range is in kernel space, the memory within that range
is guaranteed to be valid, and the corresponding memory writes are infallible.
When the operating range is in user space, it is ensured that the page table of
the process creating the VmWriter
is active for the duration of 'a
,
and the corresponding memory writes are considered fallible.
When perform writing with a VmReader
, if one of them represents typed memory,
it can ensure that the writing range in this writer and reading range in the
reader are not overlapped.
NOTE: The overlap mentioned above is at both the virtual address level
and physical address level. There is not guarantee for the operation results
of VmReader
and VmWriter
in overlapping untyped addresses, and it is
the user’s responsibility to handle this situation.
Fields§
§cursor: *mut u8
§end: *mut u8
§phantom: PhantomData<(&'a mut [u8], Fallibility)>
Implementations§
Source§impl<'a> VmWriter<'a, Infallible>
impl<'a> VmWriter<'a, Infallible>
Sourcepub unsafe fn from_kernel_space(ptr: *mut u8, len: usize) -> Self
pub unsafe fn from_kernel_space(ptr: *mut u8, len: usize) -> Self
Sourcepub fn write(&mut self, reader: &mut VmReader<'_, Infallible>) -> usize
pub fn write(&mut self, reader: &mut VmReader<'_, Infallible>) -> usize
Writes all data from the reader until one of the two conditions is met:
- The reader has no remaining data.
- The writer has no available space.
Returns the number of bytes written.
Sourcepub fn write_val<T: Pod>(&mut self, new_val: &T) -> Result<()>
pub fn write_val<T: Pod>(&mut self, new_val: &T) -> Result<()>
Writes a value of Pod
type.
If the length of the Pod
type exceeds self.avail()
,
this method will return Err
.
Sourcepub fn write_once<T: PodOnce>(&mut self, new_val: &T) -> Result<()>
pub fn write_once<T: PodOnce>(&mut self, new_val: &T) -> Result<()>
Writes a value of the PodOnce
type using one non-tearing memory store.
If the length of the PodOnce
type exceeds self.remain()
, this method will return Err
.
§Panics
This method will panic if the current position of the writer does not meet the alignment
requirements of type T
.
Sourcepub fn fill<T: Pod>(&mut self, value: T) -> usize
pub fn fill<T: Pod>(&mut self, value: T) -> usize
Fills the available space by repeating value
.
Returns the number of values written.
§Panics
The size of the available space must be a multiple of the size of value
.
Otherwise, the method would panic.
Sourcepub fn to_fallible(self) -> VmWriter<'a, Fallible>
pub fn to_fallible(self) -> VmWriter<'a, Fallible>
Converts to a fallible writer.
Source§impl VmWriter<'_, Fallible>
impl VmWriter<'_, Fallible>
Sourcepub unsafe fn from_user_space(ptr: *mut u8, len: usize) -> Self
pub unsafe fn from_user_space(ptr: *mut u8, len: usize) -> Self
Constructs a VmWriter
from a pointer and a length, which represents
a memory range in user space.
The current context should be consistently associated with valid user space during the
entire lifetime 'a
. This is for correct semantics and is not a safety requirement.
§Safety
ptr
must be in user space for len
bytes.
- ptr..ptr + len should be within user space.
Sourcepub fn write_val<T: Pod>(&mut self, new_val: &T) -> Result<()>
pub fn write_val<T: Pod>(&mut self, new_val: &T) -> Result<()>
Writes a value of Pod
type.
If the length of the Pod
type exceeds self.avail()
,
or the value can not be write completely,
this method will return Err
.
If the memory write failed, this method will return Err
and the current writer’s cursor remains pointing to
the original starting position.
Sourcepub fn fill_zeros(&mut self, len: usize) -> Result<usize, (Error, usize)>
pub fn fill_zeros(&mut self, len: usize) -> Result<usize, (Error, usize)>
Writes len
zeros to the target memory.
This method attempts to fill up to len
bytes with zeros. If the available
memory from the current cursor position is less than len
, it will only fill
the available space.
If the memory write failed due to an unresolvable page fault, this method
will return Err
with the length set so far.
Source§impl<Fallibility> VmWriter<'_, Fallibility>
impl<Fallibility> VmWriter<'_, Fallibility>
Trait Implementations§
Source§impl<'a> FallibleVmWrite<Fallible> for VmWriter<'a, Infallible>
impl<'a> FallibleVmWrite<Fallible> for VmWriter<'a, Infallible>
Source§impl<'a> FallibleVmWrite<Infallible> for VmWriter<'a, Fallible>
impl<'a> FallibleVmWrite<Infallible> for VmWriter<'a, Fallible>
Source§fn write_fallible(
&mut self,
reader: &mut VmReader<'_, Infallible>,
) -> Result<usize, (Error, usize)>
fn write_fallible( &mut self, reader: &mut VmReader<'_, Infallible>, ) -> Result<usize, (Error, usize)>
Auto Trait Implementations§
impl<'a, Fallibility> Freeze for VmWriter<'a, Fallibility>
impl<'a, Fallibility> RefUnwindSafe for VmWriter<'a, Fallibility>where
Fallibility: RefUnwindSafe,
impl<'a, Fallibility = Fallible> !Send for VmWriter<'a, Fallibility>
impl<'a, Fallibility = Fallible> !Sync for VmWriter<'a, Fallibility>
impl<'a, Fallibility> Unpin for VmWriter<'a, Fallibility>where
Fallibility: Unpin,
impl<'a, Fallibility = Fallible> !UnwindSafe for VmWriter<'a, Fallibility>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§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,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§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,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§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) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
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) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.§impl<T> Pointee for T
impl<T> Pointee for T
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
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.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.