pub struct VfioPciDevice {
Show 28 fields device: Arc<VfioDevice>, config: VfioPciConfig, hotplug: bool, hotplug_bus_number: Option<u8>, preferred_address: PciAddress, pci_address: Option<PciAddress>, interrupt_evt: Option<IrqLevelEvent>, acpi_notification_evt: Option<Event>, mmio_regions: Vec<PciBarConfiguration>, io_regions: Vec<PciBarConfiguration>, pm_cap: Option<Arc<Mutex<VfioPmCap>>>, msi_cap: Option<VfioMsiCap>, msix_cap: Option<Arc<Mutex<VfioMsixCap>>>, irq_type: Option<VfioIrqType>, vm_memory_client: VmMemoryClient, device_data: Option<DeviceData>, pm_evt: Option<Event>, is_in_low_power: Arc<Mutex<bool>>, worker_thread: Option<WorkerThread<VfioPciWorker>>, vm_socket_vm: Option<Tube>, sysfs_path: PathBuf, ext_caps: Vec<ExtCap>, vcfg_shm_mmap: Option<MemoryMapping>, mapped_mmio_bars: BTreeMap<PciBarIndex, (u64, Vec<VmMemoryRegionId>)>, activated: bool, acpi_notifier_val: Arc<Mutex<Vec<u32>>>, gpe: Option<u32>, base_class_code: PciClassCode,
}
Expand description

Implements the Vfio Pci device, then a pci device is added into vm

Fields§

§device: Arc<VfioDevice>§config: VfioPciConfig§hotplug: bool§hotplug_bus_number: Option<u8>§preferred_address: PciAddress§pci_address: Option<PciAddress>§interrupt_evt: Option<IrqLevelEvent>§acpi_notification_evt: Option<Event>§mmio_regions: Vec<PciBarConfiguration>§io_regions: Vec<PciBarConfiguration>§pm_cap: Option<Arc<Mutex<VfioPmCap>>>§msi_cap: Option<VfioMsiCap>§msix_cap: Option<Arc<Mutex<VfioMsixCap>>>§irq_type: Option<VfioIrqType>§vm_memory_client: VmMemoryClient§device_data: Option<DeviceData>§pm_evt: Option<Event>§is_in_low_power: Arc<Mutex<bool>>§worker_thread: Option<WorkerThread<VfioPciWorker>>§vm_socket_vm: Option<Tube>§sysfs_path: PathBuf§ext_caps: Vec<ExtCap>§vcfg_shm_mmap: Option<MemoryMapping>§mapped_mmio_bars: BTreeMap<PciBarIndex, (u64, Vec<VmMemoryRegionId>)>§activated: bool§acpi_notifier_val: Arc<Mutex<Vec<u32>>>§gpe: Option<u32>§base_class_code: PciClassCode

Implementations§

source§

impl VfioPciDevice

source

pub fn new( sysfs_path: &Path, device: VfioDevice, hotplug: bool, hotplug_bus_number: Option<u8>, guest_address: Option<PciAddress>, vfio_device_socket_msi: Tube, vfio_device_socket_msix: Tube, vm_memory_client: VmMemoryClient, vfio_device_socket_vm: Tube ) -> Result<Self, PciDeviceError>

Constructs a new Vfio Pci device for the give Vfio device

source

pub fn pci_address(&self) -> Option<PciAddress>

Gets the pci address of the device, if one has already been allocated.

source

pub fn is_gfx(&self) -> bool

source

fn is_intel_gfx(&self) -> bool

source

fn enable_acpi_notification(&mut self) -> Result<(), PciDeviceError>

source

fn disable_acpi_notification(&mut self) -> Result<(), PciDeviceError>

source

fn test_acpi_notification(&mut self, val: u32) -> Result<(), PciDeviceError>

source

fn enable_intx(&mut self)

source

fn disable_intx(&mut self)

source

fn disable_irqs(&mut self)

source

fn enable_msi(&mut self)

source

fn disable_msi(&mut self)

source

fn enable_msix(&mut self)

source

fn disable_msix(&mut self)

source

fn msix_vectors_update(&self) -> Result<(), VfioError>

source

fn msix_vector_update(&self, index: usize, irqfd: Option<&Event>)

source

fn adjust_bar_mmap( &self, bar_mmaps: Vec<vfio_region_sparse_mmap_area>, remove_mmaps: &[AddressRange] ) -> Vec<vfio_region_sparse_mmap_area>

source

fn remove_bar_mmap_msix( &self, bar_index: PciBarIndex, bar_mmaps: Vec<vfio_region_sparse_mmap_area> ) -> Vec<vfio_region_sparse_mmap_area>

source

fn add_bar_mmap( &self, index: PciBarIndex, bar_addr: u64 ) -> Vec<VmMemoryRegionId>

source

fn remove_bar_mmap(&self, mmap_ids: &[VmMemoryRegionId])

source

fn disable_bars_mmap(&mut self)

source

fn commit_bars_mmap(&mut self)

source

fn close(&mut self)

source

fn start_work_thread(&mut self)

source

fn collect_bars(&mut self) -> Vec<PciBarConfiguration>

source

fn configure_barmem(&mut self, bar_info: &PciBarConfiguration, bar_addr: u64)

source

fn allocate_root_barmem( &mut self, mem_bars: &[PciBarConfiguration], resources: &mut SystemAllocator ) -> Result<Vec<BarRange>, PciDeviceError>

source

fn allocate_nonroot_barmem( &mut self, mem_bars: &mut [PciBarConfiguration], resources: &mut SystemAllocator ) -> Result<Vec<BarRange>, PciDeviceError>

source

pub fn get_max_iova(&self) -> u64

Return the supported iova max address of the Vfio Pci device

source

fn get_ext_cap_by_reg(&self, reg: u32) -> Option<ExtCap>

source

fn is_skipped_reg(&self, reg: u32) -> bool

Trait Implementations§

source§

impl PciDevice for VfioPciDevice

source§

fn debug_label(&self) -> String

Returns a label suitable for debug output.
source§

fn preferred_address(&self) -> Option<PciAddress>

Preferred PCI address for this device, if any.
source§

fn allocate_address( &mut self, resources: &mut SystemAllocator ) -> Result<PciAddress, PciDeviceError>

Allocate and return an unique bus, device and function number for this device. May be called multiple times; on subsequent calls, the device should return the same address it returned from the first call.
source§

fn keep_rds(&self) -> Vec<RawDescriptor>

A vector of device-specific file descriptors that must be kept open after jailing. Must be called before the process is jailed.
source§

fn preferred_irq(&self) -> PreferredIrq

Preferred IRQ for this device. The device may request a specific pin and IRQ number by returning a Fixed value. If a device does not support INTx# interrupts at all, it should return None. Otherwise, an appropriate IRQ will be allocated automatically. The device’s assign_irq function will be called with its assigned IRQ either way.
source§

fn assign_irq( &mut self, irq_evt: IrqLevelEvent, pin: PciInterruptPin, irq_num: u32 )

Assign a legacy PCI IRQ to this device. The device may write to irq_evt to trigger an interrupt. When irq_resample_evt is signaled, the device should re-assert irq_evt if necessary.
source§

fn allocate_io_bars( &mut self, resources: &mut SystemAllocator ) -> Result<Vec<BarRange>, PciDeviceError>

Allocates the needed IO BAR space using the allocate function which takes a size and returns an address. Returns a Vec of BarRange{addr, size, prefetchable}.
source§

fn allocate_device_bars( &mut self, resources: &mut SystemAllocator ) -> Result<Vec<BarRange>, PciDeviceError>

Allocates the needed device BAR space. Returns a Vec of BarRange{addr, size, prefetchable}. Unlike MMIO BARs (see allocate_io_bars), device BARs are not expected to incur VM exits Read more
source§

fn get_bar_configuration(&self, bar_num: usize) -> Option<PciBarConfiguration>

Returns the configuration of a base address register, if present.
source§

fn register_device_capabilities(&mut self) -> Result<(), PciDeviceError>

Register any capabilties specified by the device.
source§

fn read_config_register(&self, reg_idx: usize) -> u32

Reads from a PCI configuration register. Read more
source§

fn write_config_register(&mut self, reg_idx: usize, offset: u64, data: &[u8])

Writes to a PCI configuration register. Read more
source§

fn read_virtual_config_register(&self, reg_idx: usize) -> u32

Reads from a virtual config register. Read more
source§

fn write_virtual_config_register(&mut self, reg_idx: usize, value: u32)

Writes to a virtual config register. Read more
source§

fn read_bar(&mut self, bar_index: PciBarIndex, offset: u64, data: &mut [u8])

Reads from a BAR region mapped in to the device. Read more
source§

fn write_bar(&mut self, bar_index: PciBarIndex, offset: u64, data: &[u8])

Writes to a BAR region mapped in to the device. Read more
source§

fn destroy_device(&mut self)

Invoked when the device is destroyed
source§

fn generate_acpi_methods(&mut self) -> (Vec<u8>, Option<(u32, MemoryMapping)>)

Construct customized acpi method, and return the AML code and shared memory
source§

fn set_gpe(&mut self, resources: &mut SystemAllocator) -> Option<u32>

source§

fn get_vm_memory_client(&self) -> Option<&VmMemoryClient>

Gets a reference to the API client for sending VmMemoryRequest. Any devices that uses ioevents must provide this.
source§

fn setup_pci_config_mapping( &mut self, _shmem: &SharedMemory, _base: usize, _len: usize ) -> Result<bool, Error>

Provides a memory region to back MMIO access to the configuration space. If the device can keep the memory region up to date, then it should return Ok(true), after which no more calls to read_config_register will be made. If support isn’t implemented, it should return Ok(false). Otherwise, it should return an error (a failure here is not treated as a fatal setup error). Read more
source§

fn on_device_sandboxed(&mut self)

Invoked when the device is sandboxed.
source§

fn generate_acpi(&mut self, sdts: Vec<SDT>) -> Option<Vec<SDT>>

source§

fn get_removed_children_devices(&self) -> Vec<PciAddress>

Get the removed children devices under pci bridge
source§

fn get_new_pci_bus(&self) -> Option<Arc<Mutex<PciBus>>>

Get the pci bus generated by this pci device
source§

fn configure_bridge_window( &mut self, _resources: &mut SystemAllocator, _bar_ranges: &[BarRange] ) -> Result<Vec<BarRange>, Error>

if device is a pci brdige, configure pci bridge window
source§

fn set_subordinate_bus(&mut self, _bus_no: u8)

if device is a pci bridge, configure subordinate bus number
source§

fn supports_iommu(&self) -> bool

Indicates whether the device supports IOMMU
source§

fn set_iommu(&mut self, _iommu: IpcMemoryMapper) -> Result<()>

Sets the IOMMU for the device if supports_iommu()
source§

fn as_virtio_pci_device(&self) -> Option<&VirtioPciDevice>

source§

impl Suspendable for VfioPciDevice

source§

fn sleep(&mut self) -> Result<()>

Stop all threads related to the device. Sleep should be idempotent.
source§

fn wake(&mut self) -> Result<()>

Create/Resume all threads related to the device. Wake should be idempotent.
source§

fn snapshot(&mut self) -> Result<Value>

Save the device state in an image that can be restored.
source§

fn restore(&mut self, _data: Value) -> Result<()>

Load a saved snapshot of an image.

Auto Trait Implementations§

Blanket Implementations§

source§

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

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

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

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

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

source§

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

Mutably borrows from an owned value. Read more
source§

impl<T> BusDevice for Twhere T: PciDevice,

source§

fn debug_label(&self) -> String

Returns a label suitable for debug output.
source§

fn device_id(&self) -> DeviceId

Returns a unique id per device type suitable for metrics gathering.
source§

fn read(&mut self, info: BusAccessInfo, data: &mut [u8])

Reads at offset from this device
source§

fn write(&mut self, info: BusAccessInfo, data: &[u8])

Writes at offset into this device
source§

fn config_register_write( &mut self, reg_idx: usize, offset: u64, data: &[u8] ) -> ConfigWriteResult

Sets a register in the configuration space. Only used by PCI. Read more
source§

fn config_register_read(&self, reg_idx: usize) -> u32

Gets a register from the configuration space. Only used by PCI. Read more
source§

fn init_pci_config_mapping( &mut self, shmem: &SharedMemory, base: usize, len: usize ) -> bool

Provides a memory region to back MMIO access to the configuration space. If the device can keep the memory region up to date, then it should return true, after which no more calls to config_register_read will be made. Otherwise the device should return false. Read more
source§

fn virtual_config_register_write(&mut self, reg_idx: usize, value: u32)

Sets a register in the virtual config space. Only used by PCI. Read more
source§

fn virtual_config_register_read(&self, reg_idx: usize) -> u32

Gets a register from the virtual config space. Only used by PCI. Read more
source§

fn on_sandboxed(&mut self)

Invoked when the device is sandboxed.
source§

fn get_ranges(&self) -> Vec<(BusRange, BusType), Global>

Gets a list of all ranges registered by this BusDevice.
source§

fn destroy_device(&mut self)

Invoked when the device is destroyed
source§

fn is_bridge(&self) -> Option<u8>

Returns the secondary bus number if this bus device is pci bridge
source§

impl<T> BusDeviceObj for Twhere T: 'static + PciDevice,

§

impl<T> Downcast for Twhere T: Any,

§

fn into_any(self: Box<T, Global>) -> Box<dyn Any, Global>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T, Global>) -> Rc<dyn Any, Global>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for Twhere T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T, Global>) -> Arc<dyn Any + Sync + Send, Global>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere 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, U> TryFrom<U> for Twhere U: Into<T>,

§

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 Twhere U: TryFrom<T>,

§

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<V, T> VZip<V> for Twhere V: MultiLane<T>,

§

fn vzip(self) -> V