summary refs log tree commit diff
path: root/src/linux.rs
diff options
context:
space:
mode:
authorZhuocheng Ding <zhuocheng.ding@intel.corp-partner.google.com>2019-12-02 15:50:20 +0800
committerCommit Bot <commit-bot@chromium.org>2020-03-05 01:02:48 +0000
commitf2e90bf0b0ca101d2925e91ca50d3e9e5ea2fdb7 (patch)
tree20a8210f21c3e530c80e45146fbb91f284064507 /src/linux.rs
parent50740cece43671cc42035f92cde460aad3d29494 (diff)
downloadcrosvm-f2e90bf0b0ca101d2925e91ca50d3e9e5ea2fdb7.tar
crosvm-f2e90bf0b0ca101d2925e91ca50d3e9e5ea2fdb7.tar.gz
crosvm-f2e90bf0b0ca101d2925e91ca50d3e9e5ea2fdb7.tar.bz2
crosvm-f2e90bf0b0ca101d2925e91ca50d3e9e5ea2fdb7.tar.lz
crosvm-f2e90bf0b0ca101d2925e91ca50d3e9e5ea2fdb7.tar.xz
crosvm-f2e90bf0b0ca101d2925e91ca50d3e9e5ea2fdb7.tar.zst
crosvm-f2e90bf0b0ca101d2925e91ca50d3e9e5ea2fdb7.zip
Add logic to setup PIC/IOAPIC.
TODO: Route irqfd to PIC/IOAPIC to make them fully work.

BUG=chromium:908689
TEST=None

Change-Id: I301287b1cf32cfccffce6c52ebbb5e123931178e
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1945796
Reviewed-by: Daniel Verkamp <dverkamp@chromium.org>
Tested-by: kokoro <noreply+kokoro@google.com>
Commit-Queue: Zhuocheng Ding <zhuocheng.ding@intel.corp-partner.google.com>
Diffstat (limited to 'src/linux.rs')
-rw-r--r--src/linux.rs14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/linux.rs b/src/linux.rs
index 007e18e..ad35407 100644
--- a/src/linux.rs
+++ b/src/linux.rs
@@ -1356,6 +1356,7 @@ fn run_vcpu(
     start_barrier: Arc<Barrier>,
     io_bus: devices::Bus,
     mmio_bus: devices::Bus,
+    split_irqchip: Option<(Arc<Mutex<devices::Pic>>, Arc<Mutex<devices::Ioapic>>)>,
     exit_evt: EventFd,
     requires_kvmclock_ctrl: bool,
     run_mode_arc: Arc<VcpuRunMode>,
@@ -1417,6 +1418,13 @@ fn run_vcpu(
                         }) => {
                             mmio_bus.write(address, &data[..size]);
                         }
+                        Ok(VcpuExit::IoapicEoi{vector}) => {
+                            if let Some((_, ioapic)) = &split_irqchip {
+                                ioapic.lock().end_of_interrupt(vector);
+                            } else {
+                                panic!("userspace ioapic not found in split irqchip mode, should be impossible.");
+                            }
+                        },
                         Ok(VcpuExit::Hlt) => break,
                         Ok(VcpuExit::Shutdown) => break,
                         Ok(VcpuExit::FailEntry {
@@ -1589,10 +1597,15 @@ pub fn run_config(cfg: Config) -> Result<()> {
         msg_socket::pair::<VmMemoryResponse, VmMemoryRequest>().map_err(Error::CreateSocket)?;
     control_sockets.push(TaggedControlSocket::VmMemory(gpu_host_socket));
 
+    let (ioapic_host_socket, ioapic_device_socket) =
+        msg_socket::pair::<VmIrqResponse, VmIrqRequest>().map_err(Error::CreateSocket)?;
+    control_sockets.push(TaggedControlSocket::VmIrq(ioapic_host_socket));
+
     let sandbox = cfg.sandbox;
     let linux = Arch::build_vm(
         components,
         cfg.split_irqchip,
+        ioapic_device_socket,
         &cfg.serial_parameters,
         simple_jail(&cfg, "serial")?,
         |mem, vm, sys_allocator, exit_evt| {
@@ -1739,6 +1752,7 @@ fn run_control(
             vcpu_thread_barrier.clone(),
             linux.io_bus.clone(),
             linux.mmio_bus.clone(),
+            linux.split_irqchip.clone(),
             linux.exit_evt.try_clone().map_err(Error::CloneEventFd)?,
             linux.vm.check_extension(Cap::KvmclockCtrl),
             run_mode_arc.clone(),