summary refs log tree commit diff
path: root/x86_64
diff options
context:
space:
mode:
authorDaniel Verkamp <dverkamp@chromium.org>2018-09-24 15:00:36 -0700
committerchrome-bot <chrome-bot@chromium.org>2018-10-02 09:17:25 -0700
commitd635acbaf348c0863bc05b8f889b2fa5f8156aaa (patch)
tree02319a17d31193be6f28663570cab51ec7be2f9f /x86_64
parenta158e310380bfcbb63fa5015d01c58fc0f0731da (diff)
downloadcrosvm-d635acbaf348c0863bc05b8f889b2fa5f8156aaa.tar
crosvm-d635acbaf348c0863bc05b8f889b2fa5f8156aaa.tar.gz
crosvm-d635acbaf348c0863bc05b8f889b2fa5f8156aaa.tar.bz2
crosvm-d635acbaf348c0863bc05b8f889b2fa5f8156aaa.tar.lz
crosvm-d635acbaf348c0863bc05b8f889b2fa5f8156aaa.tar.xz
crosvm-d635acbaf348c0863bc05b8f889b2fa5f8156aaa.tar.zst
crosvm-d635acbaf348c0863bc05b8f889b2fa5f8156aaa.zip
linux: Convert all virtio devices to PCI
Change the main create_virtio_devs() function to create virtio devices
using the PCI transport rather than MMIO.

BUG=chromium:854766
TEST=Boot crosvm and verify that all virtio devices still work

Change-Id: I9a6e60b21edea1e5ac2b3ae5c91793d45cf5063a
Signed-off-by: Daniel Verkamp <dverkamp@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/1241541
Reviewed-by: Dylan Reid <dgreid@chromium.org>
Diffstat (limited to 'x86_64')
-rw-r--r--x86_64/Cargo.toml1
-rw-r--r--x86_64/src/lib.rs24
2 files changed, 10 insertions, 15 deletions
diff --git a/x86_64/Cargo.toml b/x86_64/Cargo.toml
index d814814..687dec9 100644
--- a/x86_64/Cargo.toml
+++ b/x86_64/Cargo.toml
@@ -8,6 +8,7 @@ build = "build.rs"
 arch = { path = "../arch" }
 data_model = { path = "../data_model" }
 devices = { path = "../devices" }
+io_jail = { path = "../io_jail" }
 kvm_sys = { path = "../kvm_sys" }
 kvm = { path = "../kvm" }
 sys_util = { path = "../sys_util" }
diff --git a/x86_64/src/lib.rs b/x86_64/src/lib.rs
index a372a95..22eb2c5 100644
--- a/x86_64/src/lib.rs
+++ b/x86_64/src/lib.rs
@@ -6,6 +6,7 @@ extern crate arch;
 extern crate byteorder;
 extern crate data_model;
 extern crate devices;
+extern crate io_jail;
 extern crate kvm;
 extern crate kvm_sys;
 extern crate libc;
@@ -67,10 +68,11 @@ use std::ffi::{CStr, CString};
 use std::io::{self, stdout};
 use std::sync::{Arc, Mutex};
 
-use arch::{RunnableLinuxVm, VirtioDeviceStub, VmComponents};
+use arch::{RunnableLinuxVm, VmComponents};
 use bootparam::boot_params;
 use bootparam::E820_RAM;
-use devices::{PciConfigIo, PciInterruptPin};
+use devices::{PciConfigIo, PciDevice, PciInterruptPin};
+use io_jail::Minijail;
 use sys_util::{EventFd, GuestAddress, GuestMemory};
 use resources::{AddressRanges, SystemAllocator};
 use kvm::*;
@@ -252,7 +254,7 @@ fn arch_memory_regions(size: u64) -> Vec<(GuestAddress, u64)> {
 impl arch::LinuxArch for X8664arch {
     fn build_vm<F>(mut components: VmComponents, virtio_devs: F) -> Result<RunnableLinuxVm>
         where
-            F: FnOnce(&GuestMemory, &EventFd) -> Result<Vec<VirtioDeviceStub>>
+            F: FnOnce(&GuestMemory, &EventFd) -> Result<Vec<(Box<PciDevice + 'static>, Minijail)>>
     {
         let mut resources = Self::get_resource_allocator(components.memory_mb,
                                                          components.wayland_dmabuf);
@@ -275,29 +277,21 @@ impl arch::LinuxArch for X8664arch {
 
         let mut mmio_bus = devices::Bus::new();
 
-        let (pci, pci_irqs) = arch::generate_pci_root(components.pci_devices,
+        let exit_evt = EventFd::new().map_err(Error::CreateEventFd)?;
+
+        let pci_devices = virtio_devs(&mem, &exit_evt)?;
+        let (pci, pci_irqs) = arch::generate_pci_root(pci_devices,
                                                       &mut mmio_bus,
                                                       &mut resources,
                                                       &mut vm)
             .map_err(Error::CreatePciRoot)?;
         let pci_bus = Arc::new(Mutex::new(PciConfigIo::new(pci)));
 
-        let exit_evt = EventFd::new().map_err(Error::CreateEventFd)?;
         let (io_bus, stdio_serial) = Self::setup_io_bus(
             &mut vm,
             exit_evt.try_clone().map_err(Error::CloneEventFd)?,
             Some(pci_bus.clone()))?;
 
-
-        // Create a list of mmio devices to be added.
-        let mmio_devs = virtio_devs(&mem, &exit_evt)?;
-
-        for stub in mmio_devs {
-            arch::register_mmio(&mut mmio_bus, &mut vm, stub.dev, stub.jail,
-                                &mut resources, &mut cmdline)
-                .map_err(Error::RegisterVsock)?;
-        }
-
         for param in components.extra_kernel_params {
             cmdline.insert_str(&param).map_err(Error::Cmdline)?;
         }