pub struct IoVecBufferMut<const L: u16 = FIRECRACKER_MAX_QUEUE_SIZE> {
pub vecs: IovDeque<L>,
pub len: u32,
}Expand description
This is essentially a wrapper of a Vec<libc::iovec> which can be passed to libc::readv.
It describes a write-only buffer passed to us by the guest that is scattered across multiple
memory regions. Additionally, this wrapper provides methods that allow reading arbitrary ranges
of data from that buffer.
L const generic value must be a multiple of 256 as required by the IovDeque requirements.
Fields§
§vecs: IovDeque<L>§len: u32Implementations§
Source§impl<const L: u16> IoVecBufferMut<L>
impl<const L: u16> IoVecBufferMut<L>
Sourcepub unsafe fn append_descriptor_chain(
&mut self,
mem: &GuestMemoryMmap,
head: DescriptorChain,
) -> Result<ParsedDescriptorChain, IoVecError>
pub unsafe fn append_descriptor_chain( &mut self, mem: &GuestMemoryMmap, head: DescriptorChain, ) -> Result<ParsedDescriptorChain, IoVecError>
Append a DescriptorChain in this IoVecBufferMut
§Safety
The descriptor chain cannot be referencing the same memory location as another chain
Sourcepub unsafe fn load_descriptor_chain(
&mut self,
mem: &GuestMemoryMmap,
head: DescriptorChain,
) -> Result<(), IoVecError>
pub unsafe fn load_descriptor_chain( &mut self, mem: &GuestMemoryMmap, head: DescriptorChain, ) -> Result<(), IoVecError>
Create an IoVecBufferMut from a DescriptorChain
This will clear any previous iovec objects in the buffer and load the new
DescriptorChain.
§Safety
The descriptor chain cannot be referencing the same memory location as another chain
Sourcepub fn drop_chain_front(&mut self, parse_descriptor: &ParsedDescriptorChain)
pub fn drop_chain_front(&mut self, parse_descriptor: &ParsedDescriptorChain)
Drop descriptor chain from the IoVecBufferMut front
This will drop memory described by the IoVecBufferMut from the beginning.
Sourcepub fn drop_chain_back(&mut self, parse_descriptor: &ParsedDescriptorChain)
pub fn drop_chain_back(&mut self, parse_descriptor: &ParsedDescriptorChain)
Drop descriptor chain from the IoVecBufferMut back
This will drop memory described by the IoVecBufferMut from the beginning.
Sourcepub unsafe fn from_descriptor_chain(
mem: &GuestMemoryMmap,
head: DescriptorChain,
) -> Result<Self, IoVecError>
pub unsafe fn from_descriptor_chain( mem: &GuestMemoryMmap, head: DescriptorChain, ) -> Result<Self, IoVecError>
Create an IoVecBuffer from a DescriptorChain
§Safety
The descriptor chain cannot be referencing the same memory location as another chain
Sourcepub fn len(&self) -> u32
pub fn len(&self) -> u32
Get the total length of the memory regions covered by this IoVecBuffer
Sourcepub fn as_iovec_mut_slice(&mut self) -> &mut [iovec]
pub fn as_iovec_mut_slice(&mut self) -> &mut [iovec]
Returns a pointer to the memory keeping the iovec structs
Sourcepub fn write_all_volatile_at(
&mut self,
buf: &[u8],
offset: usize,
) -> Result<(), VolatileMemoryError>
pub fn write_all_volatile_at( &mut self, buf: &[u8], offset: usize, ) -> Result<(), VolatileMemoryError>
Writes a number of bytes into the IoVecBufferMut starting at a given offset.
This will try to fill IoVecBufferMut writing bytes from the buf starting from
the given offset. It will write as many bytes from buf as they fit inside the
IoVecBufferMut starting from offset.
§Returns
Ok(()) if the entire contents of buf could be written to this IoVecBufferMut,
Err(VolatileMemoryError::PartialBuffer) if only part of buf could be transferred, and
Err(VolatileMemoryError::OutOfBounds) if offset >= self.len().
Trait Implementations§
Source§impl<const L: u16> Debug for IoVecBufferMut<L>
impl<const L: u16> Debug for IoVecBufferMut<L>
impl<const L: u16> Send for IoVecBufferMut<L>
Auto Trait Implementations§
impl<const L: u16> Freeze for IoVecBufferMut<L>
impl<const L: u16> RefUnwindSafe for IoVecBufferMut<L>
impl<const L: u16 = FIRECRACKER_MAX_QUEUE_SIZE> !Sync for IoVecBufferMut<L>
impl<const L: u16> Unpin for IoVecBufferMut<L>
impl<const L: u16> UnwindSafe for IoVecBufferMut<L>
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> 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.