summary refs log tree commit diff
path: root/x86_64
diff options
context:
space:
mode:
authorZhuocheng Ding <zhuocheng.ding@intel.corp-partner.google.com>2019-12-02 15:50:16 +0800
committerCommit Bot <commit-bot@chromium.org>2020-02-21 09:33:19 +0000
commit04b44e3df02e87de704080e131ed90afdf2dfd7e (patch)
tree852770c5b6301139d21857fec07a8df5622acd66 /x86_64
parentc6b73e30c86cc42f8bb7069f1b01c1fcfa60aa25 (diff)
downloadcrosvm-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.rs16
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)
     }