Skip to main content

MsixEmulator

Struct MsixEmulator 

Source
pub struct MsixEmulator { /* private fields */ }
Expand description

Emulator for the hardware-level interface required to configure and trigger MSI-X interrupts on a PCI device.

Implementations§

Source§

impl MsixEmulator

Source

pub fn new( bar: u8, count: u16, msi_target: &MsiTarget, ) -> (Self, impl PciCapability + use<>)

Create a new MsixEmulator instance, along with with its associated PciCapability structure.

This implementation of MSI-X expects a dedicated BAR to store the vector and pending tables.


DEVNOTE: This current implementation of MSI-X isn’t particularly “flexible” with respect to the various ways the PCI spec allows MSI-X to be implemented. e.g: it uses a shared BAR for the table and BPA, with fixed offsets into the BAR for both of those tables. It would be nice to re-visit this code and make it more flexible.

Source

pub fn bar_len(&self) -> u64

Return the total length of the MSI-X BAR (Actually, the notion that there is an “MSI-X BAR” is an issue to fix sometime. MSI-X tables are often in the same bar as other things.)

Source

pub fn read_u32(&self, offset: u64) -> u32

Read a u32 from the MSI-X BAR at the given offset.

Source

pub fn write_u32(&mut self, offset: u64, val: u32)

Write a u32 to the MSI-X BAR at the given offset.

Source

pub fn interrupt(&self, index: u16) -> Option<Interrupt>

Return an [Interrupt] associated with the particular MSI-X vector, or None if the index is out of bounds.

Source

pub fn set_pending_bit(&self, index: u16)

Sets the pending bit for the given vector index.

Used by device passthrough (e.g., VFIO with irqfd) to record that an interrupt arrived while the vector was masked, so PBA reads return the correct pending state.

Source

pub fn enable_irqfd( &self, irqfd: &dyn IrqFd, register: impl FnOnce(&[&Event]) -> Result<()>, ) -> Result<()>

Enable kernel-mediated interrupt delivery for all vectors.

Creates one irqfd route per vector using the provided [IrqFd] interface. The register callback receives references to the events for all vectors. The caller uses this to pass events to the interrupt source (e.g., VFIO map_msix or vhost-user SET_VRING_CALL). After the callback returns, the routes are installed in the emulator. When the guest programs MSI-X table entries, the emulator automatically updates the kernel’s MSI routing.

Call disable_irqfd to tear down the routes.

Source

pub fn disable_irqfd(&self)

Tear down kernel-mediated interrupt delivery.

Drops all irqfd routes, unregistering them from the hypervisor and freeing GSI allocations.

Trait Implementations§

Source§

impl Clone for MsixEmulator

Source§

fn clone(&self) -> MsixEmulator

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

Auto Trait Implementations§

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