summary refs log tree commit diff
path: root/arch/src/lib.rs
diff options
context:
space:
mode:
authorDylan Reid <dgreid@chromium.org>2018-07-09 13:35:40 -0700
committerchrome-bot <chrome-bot@chromium.org>2018-10-01 11:30:01 -0700
commitaa12c74bff702e25dffb0c2de0240754c9c51c90 (patch)
tree8a8895d89becb20530a546dfd975135a71af1b1b /arch/src/lib.rs
parentc5a6762081979e3a1e16028a6542deda27465534 (diff)
downloadcrosvm-aa12c74bff702e25dffb0c2de0240754c9c51c90.tar
crosvm-aa12c74bff702e25dffb0c2de0240754c9c51c90.tar.gz
crosvm-aa12c74bff702e25dffb0c2de0240754c9c51c90.tar.bz2
crosvm-aa12c74bff702e25dffb0c2de0240754c9c51c90.tar.lz
crosvm-aa12c74bff702e25dffb0c2de0240754c9c51c90.tar.xz
crosvm-aa12c74bff702e25dffb0c2de0240754c9c51c90.tar.zst
crosvm-aa12c74bff702e25dffb0c2de0240754c9c51c90.zip
devices: pci: add ioeventfds to PciDevice trait
VirtioDevices and potentially others need to register ioeventfds that
will be triggered when guests write to certain addresses. Allow
PciDevices to return an array of ioeventfds that the VM can install.

Change-Id: I2524c4e8c04f75a8d7868cac998304aecbb29c40
Signed-off-by: Dylan Reid <dgreid@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/1237360
Commit-Ready: Daniel Verkamp <dverkamp@chromium.org>
Tested-by: Daniel Verkamp <dverkamp@chromium.org>
Diffstat (limited to 'arch/src/lib.rs')
-rw-r--r--arch/src/lib.rs15
1 files changed, 12 insertions, 3 deletions
diff --git a/arch/src/lib.rs b/arch/src/lib.rs
index 807a4df..afea720 100644
--- a/arch/src/lib.rs
+++ b/arch/src/lib.rs
@@ -20,7 +20,7 @@ use devices::{Bus, BusError, PciDevice, PciDeviceError, PciInterruptPin,
               PciRoot, ProxyDevice, Serial};
 use devices::virtio::VirtioDevice;
 use io_jail::Minijail;
-use kvm::{IoeventAddress, Kvm, Vm, Vcpu};
+use kvm::{IoeventAddress, Kvm, NoDatamatch, Vm, Vcpu};
 use sys_util::{EventFd, GuestMemory, syslog};
 use resources::SystemAllocator;
 
@@ -136,7 +136,8 @@ impl fmt::Display for DeviceRegistrationError {
 /// Creates a root PCI device for use by this Vm.
 pub fn generate_pci_root(devices: Vec<(Box<PciDevice + 'static>, Minijail)>,
                          mmio_bus: &mut Bus,
-                         resources: &mut SystemAllocator)
+                         resources: &mut SystemAllocator,
+                         vm: &mut Vm)
     -> std::result::Result<(PciRoot, Vec<(u32, PciInterruptPin)>), DeviceRegistrationError>
 {
     let mut root = PciRoot::new();
@@ -146,7 +147,9 @@ pub fn generate_pci_root(devices: Vec<(Box<PciDevice + 'static>, Minijail)>,
         syslog::push_fds(&mut keep_fds);
 
         let irqfd = EventFd::new().map_err(DeviceRegistrationError::EventFdCreate)?;
-        let irq_num = resources.allocate_irq().ok_or(DeviceRegistrationError::AllocateIrq)? as u32;
+        let irq_num = resources
+            .allocate_irq()
+            .ok_or(DeviceRegistrationError::AllocateIrq)? as u32;
         let pci_irq_pin = match dev_idx % 4 {
             0 => PciInterruptPin::IntA,
             1 => PciInterruptPin::IntB,
@@ -160,6 +163,12 @@ pub fn generate_pci_root(devices: Vec<(Box<PciDevice + 'static>, Minijail)>,
         let ranges = device
             .allocate_io_bars(resources)
             .map_err(DeviceRegistrationError::AllocateIoAddrs)?;
+        for (event, addr) in device.ioeventfds() {
+            let io_addr = IoeventAddress::Mmio(addr);
+            vm.register_ioevent(&event, io_addr, NoDatamatch)
+                .map_err(DeviceRegistrationError::RegisterIoevent)?;
+            keep_fds.push(event.as_raw_fd());
+        }
         let proxy = ProxyDevice::new(device, &jail, keep_fds)
             .map_err(DeviceRegistrationError::ProxyDeviceCreation)?;
         let arced_dev = Arc::new(Mutex::new(proxy));