Skip to main content

PagedRange

Struct PagedRange 

pub struct PagedRange<'a> { /* private fields */ }
Expand description

A single logically-contiguous byte range spread across guest pages.

PagedRange is defined by a GPN (guest page number) slice, a byte offset into that slice’s implied flat address space, and a length.

§Interior-page constraint

The first page may start at an arbitrary byte offset and the last page may end before the page boundary, but all interior pages are fully covered. There is no way to skip bytes within an interior page.

  VALID:     ░░████  ██████  ██████  ███░░░
  INVALID:   ░░████  ░░████  ██████  ███░░░
                      ▲ interior page cannot start at non-zero offset

This means two guest memory regions starting at arbitrary GPAs cannot always be represented by a single PagedRange. Use PagedRanges when you need to concatenate multiple independent regions.

§Construction

Use PagedRange::new(offset, len, gpns) where offset is the byte offset into the page list and len is the total byte length. The GPN slice must be large enough to cover offset + len bytes.

Implementations§

§

impl<'a> PagedRange<'a>

pub const PAGE_SIZE: usize = PAGE_SIZE

The page size for GPNs. This is always 4KB.

pub const fn new( offset: usize, len: usize, gpns: &'a [u64], ) -> Option<PagedRange<'a>>

Creates a new range over gpns, starting at offset bytes into the page list, extending for len bytes.

Returns None if offset or len are out of bounds.

pub const fn empty() -> PagedRange<'a>

Returns the empty range.

pub fn try_subrange(&self, offset: usize, len: usize) -> Option<PagedRange<'a>>

Returns a subrange of this range, or None if the subrange is outside this range.

pub fn subrange(&self, offset: usize, len: usize) -> PagedRange<'a>

Returns a subrange of this range.

Panics if the subrange is outside this range.

pub fn len(&self) -> usize

Returns the length of the range in bytes.

pub fn is_empty(&self) -> bool

Returns whether the range is empty.

pub fn offset(&self) -> usize

Returns the byte offset into the first page of the range.

Only the first page can have a non-zero offset; all subsequent pages covered by the range are implicitly page-aligned.

pub fn gpns(&self) -> &'a [u64]

Returns the range’s list of page numbers.

pub fn skip(&mut self, len: usize)

Skips the first len bytes of the range.

Panics if len is larger than the range’s length.

pub fn truncate(&mut self, len: usize)

Truncates the range to len bytes.

Panics if len is larger than the range’s length.

pub fn split(self, offset: usize) -> (PagedRange<'a>, PagedRange<'a>)

Splits the range at offset.

Panics if offset is outside the range.

pub fn try_split( self, offset: usize, ) -> Option<(PagedRange<'a>, PagedRange<'a>)>

Splits the range at offset, returning None if offset is outside the range.

pub fn pop_front_range(&mut self) -> Option<Result<AddressRange, InvalidGpn>>

Removes and returns the first contiguous range.

pub fn ranges(self) -> PagedRangeRangeIter<'a>

Returns an iterator over the [AddressRange]s represented by this range.

Trait Implementations§

§

impl<'a> Clone for PagedRange<'a>

§

fn clone(&self) -> PagedRange<'a>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl<'a> Debug for PagedRange<'a>

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl<'a> GuestMemoryView<'a> for PagedRange<'a>

Source§

type Reader = PagedRangeReader<'a>

The MemoryRead implementation type
Source§

type Writer = PagedRangeWriter<'a>

The MemoryWrite implementation type
Source§

fn reader(self, mem: &'a GuestMemory) -> PagedRangeReader<'a>

Returns a MemoryRead implementation for the ranges.
Source§

fn writer(self, mem: &'a GuestMemory) -> PagedRangeWriter<'a>

Returns a MemoryWrite implementation for the ranges.
§

impl<'a> Copy for PagedRange<'a>

Auto Trait Implementations§

§

impl<'a> Freeze for PagedRange<'a>

§

impl<'a> RefUnwindSafe for PagedRange<'a>

§

impl<'a> Send for PagedRange<'a>

§

impl<'a> Sync for PagedRange<'a>

§

impl<'a> Unpin for PagedRange<'a>

§

impl<'a> UnsafeUnpin for PagedRange<'a>

§

impl<'a> UnwindSafe for PagedRange<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more