diff options
author | Zhuocheng Ding <zhuocheng.ding@intel.corp-partner.google.com> | 2019-12-02 15:50:16 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-02-21 09:33:19 +0000 |
commit | 04b44e3df02e87de704080e131ed90afdf2dfd7e (patch) | |
tree | 852770c5b6301139d21857fec07a8df5622acd66 /x86_64 | |
parent | c6b73e30c86cc42f8bb7069f1b01c1fcfa60aa25 (diff) | |
download | crosvm-04b44e3df02e87de704080e131ed90afdf2dfd7e.tar crosvm-04b44e3df02e87de704080e131ed90afdf2dfd7e.tar.gz crosvm-04b44e3df02e87de704080e131ed90afdf2dfd7e.tar.bz2 crosvm-04b44e3df02e87de704080e131ed90afdf2dfd7e.tar.lz crosvm-04b44e3df02e87de704080e131ed90afdf2dfd7e.tar.xz crosvm-04b44e3df02e87de704080e131ed90afdf2dfd7e.tar.zst crosvm-04b44e3df02e87de704080e131ed90afdf2dfd7e.zip |
devices: IOAPIC: implement interrupt routing
This change implements MSI routing and injection, so that service_irq can actually inject an interrupt into guest. BUG=chromium:908689 TEST=Unit tests in file. Change-Id: I2db4f00f569db56f5765c707faaa87c64fd3da9f Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1945795 Reviewed-by: Stephen Barber <smbarber@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Zhuocheng Ding <zhuocheng.ding@intel.corp-partner.google.com>
Diffstat (limited to 'x86_64')
-rw-r--r-- | x86_64/src/lib.rs | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/x86_64/src/lib.rs b/x86_64/src/lib.rs index 5ab0445..487273e 100644 --- a/x86_64/src/lib.rs +++ b/x86_64/src/lib.rs @@ -581,12 +581,26 @@ impl X8664arch { /// * `split_irqchip` - Whether to use a split IRQ chip. /// * `mem` - The memory to be used by the guest. fn create_vm(kvm: &Kvm, split_irqchip: bool, mem: GuestMemory) -> Result<Vm> { - let vm = Vm::new(&kvm, mem).map_err(Error::CreateVm)?; + let mut vm = Vm::new(&kvm, mem).map_err(Error::CreateVm)?; let tss_addr = GuestAddress(0xfffbd000); vm.set_tss_addr(tss_addr).map_err(Error::SetTssAddr)?; if !split_irqchip { vm.create_pit().map_err(Error::CreatePit)?; vm.create_irq_chip().map_err(Error::CreateIrqChip)?; + } else { + for i in 0..kvm::NUM_IOAPIC_PINS { + // Add dummy MSI routes to replace the default IRQChip routes. + let route = IrqRoute { + gsi: i as u32, + source: IrqSource::Msi { + address: 0, + data: 0, + }, + }; + // Safe to ignore errors because errors are caused by the default routes and dummy + // MSI routes will always be registered. + let _ = vm.add_irq_route_entry(route); + } } Ok(vm) } |