Skip to content

Commit 0e048e6

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 91bfa9e commit 0e048e6

File tree

2 files changed

+7
-1
lines changed

2 files changed

+7
-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: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use std::{fmt, io};
1111

1212
#[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))]
1313
use devices::fdt::DeviceInfoForFDT;
14+
use devices::legacy::IrqChip;
1415
use devices::{BusDevice, DeviceType};
1516
use kernel::cmdline as kernel_cmdline;
1617
use kvm_ioctls::{IoEventAddress, VmFd};
@@ -192,6 +193,7 @@ impl MMIODeviceManager {
192193
&mut self,
193194
vm: &VmFd,
194195
cmdline: &mut kernel_cmdline::Cmdline,
196+
intc: IrqChip,
195197
serial: Arc<Mutex<devices::legacy::Serial>>,
196198
) -> Result<()> {
197199
if self.irq > self.last_irq {
@@ -201,6 +203,8 @@ impl MMIODeviceManager {
201203
vm.register_irqfd(serial.lock().unwrap().interrupt_evt(), self.irq)
202204
.map_err(Error::RegisterIrqFd)?;
203205

206+
serial.lock().unwrap().set_intc(intc);
207+
204208
self.bus
205209
.insert(serial, self.mmio_base, MMIO_LEN)
206210
.map_err(Error::BusError)?;

0 commit comments

Comments
 (0)