Skip to content

Commit b06bff5

Browse files
committed
device_manager/aarch64: register intc on serial
We were missing registering the IrqChip on legacy serial devices, which meant they couldn't trigger IRQs. This issue went under the radar because only a few guests rely on them (so far, only NetBSD). Let's fix it here. Signed-off-by: Sergio Lopez <slp@redhat.com>
1 parent 11e7522 commit b06bff5

File tree

2 files changed

+8
-1
lines changed

2 files changed

+8
-1
lines changed

src/vmm/src/builder.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -870,6 +870,7 @@ pub fn build_microvm(
870870
&vm,
871871
&mut mmio_device_manager,
872872
&mut kernel_cmdline,
873+
intc.clone(),
873874
serial_devices,
874875
)?;
875876
}
@@ -1623,11 +1624,12 @@ fn attach_legacy_devices(
16231624
vm: &Vm,
16241625
mmio_device_manager: &mut MMIODeviceManager,
16251626
kernel_cmdline: &mut kernel::cmdline::Cmdline,
1627+
intc: IrqChip,
16261628
serial: Vec<Arc<Mutex<Serial>>>,
16271629
) -> std::result::Result<(), StartMicrovmError> {
16281630
for s in serial {
16291631
mmio_device_manager
1630-
.register_mmio_serial(vm.fd(), kernel_cmdline, s)
1632+
.register_mmio_serial(vm.fd(), kernel_cmdline, intc.clone(), s)
16311633
.map_err(Error::RegisterMMIODevice)
16321634
.map_err(StartMicrovmError::Internal)?;
16331635
}

src/vmm/src/device_manager/kvm/mmio.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ use std::{fmt, io};
1111

1212
#[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))]
1313
use devices::fdt::DeviceInfoForFDT;
14+
#[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))]
15+
use devices::legacy::IrqChip;
1416
use devices::{BusDevice, DeviceType};
1517
use kernel::cmdline as kernel_cmdline;
1618
use kvm_ioctls::{IoEventAddress, VmFd};
@@ -192,6 +194,7 @@ impl MMIODeviceManager {
192194
&mut self,
193195
vm: &VmFd,
194196
cmdline: &mut kernel_cmdline::Cmdline,
197+
intc: IrqChip,
195198
serial: Arc<Mutex<devices::legacy::Serial>>,
196199
) -> Result<()> {
197200
if self.irq > self.last_irq {
@@ -201,6 +204,8 @@ impl MMIODeviceManager {
201204
vm.register_irqfd(serial.lock().unwrap().interrupt_evt(), self.irq)
202205
.map_err(Error::RegisterIrqFd)?;
203206

207+
serial.lock().unwrap().set_intc(intc);
208+
204209
self.bus
205210
.insert(serial, self.mmio_base, MMIO_LEN)
206211
.map_err(Error::BusError)?;

0 commit comments

Comments
 (0)