diff options
author | Zhuocheng Ding <zhuocheng.ding@intel.corp-partner.google.com> | 2019-12-02 15:50:20 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-03-05 01:02:48 +0000 |
commit | f2e90bf0b0ca101d2925e91ca50d3e9e5ea2fdb7 (patch) | |
tree | 20a8210f21c3e530c80e45146fbb91f284064507 /src/linux.rs | |
parent | 50740cece43671cc42035f92cde460aad3d29494 (diff) | |
download | crosvm-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.rs | 14 |
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(), |