diff --git a/vm-virtio/src/console.rs b/vm-virtio/src/console.rs index d18433ac3..ad0384b72 100755 --- a/vm-virtio/src/console.rs +++ b/vm-virtio/src/console.rs @@ -17,7 +17,7 @@ use std::thread; use super::Error as DeviceError; use super::{ ActivateError, ActivateResult, DeviceEventT, Queue, VirtioDevice, VirtioDeviceType, - VirtioInterruptType, VIRTIO_F_VERSION_1, + VirtioInterruptType, VIRTIO_F_IOMMU_PLATFORM, VIRTIO_F_VERSION_1, }; use crate::VirtioInterrupt; use std::sync::atomic::{AtomicU64, Ordering}; @@ -338,8 +338,13 @@ impl Console { out: Box, cols: u16, rows: u16, + iommu: bool, ) -> io::Result<(Console, Arc)> { - let avail_features = 1u64 << VIRTIO_F_VERSION_1 | 1u64 << VIRTIO_CONSOLE_F_SIZE; + let mut avail_features = 1u64 << VIRTIO_F_VERSION_1 | 1u64 << VIRTIO_CONSOLE_F_SIZE; + + if iommu { + avail_features |= 1u64 << VIRTIO_F_IOMMU_PLATFORM; + } let input_evt = EventFd::new(EFD_NONBLOCK).unwrap(); let config_evt = EventFd::new(EFD_NONBLOCK).unwrap(); diff --git a/vm-virtio/src/lib.rs b/vm-virtio/src/lib.rs index 46c975290..bf4485123 100755 --- a/vm-virtio/src/lib.rs +++ b/vm-virtio/src/lib.rs @@ -50,6 +50,7 @@ const DEVICE_FEATURES_OK: u32 = 0x08; const DEVICE_FAILED: u32 = 0x80; const VIRTIO_F_VERSION_1: u32 = 32; +const VIRTIO_F_IOMMU_PLATFORM: u32 = 33; const VIRTIO_F_IN_ORDER: u32 = 35; // Types taken from linux/virtio_ids.h diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index 8548c462f..21029fdb5 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -414,8 +414,9 @@ impl DeviceManager { }; let (col, row) = get_win_size(); let console_input = if let Some(writer) = console_writer { - let (virtio_console_device, console_input) = vm_virtio::Console::new(writer, col, row) - .map_err(DeviceManagerError::CreateVirtioConsole)?; + let (virtio_console_device, console_input) = + vm_virtio::Console::new(writer, col, row, false) + .map_err(DeviceManagerError::CreateVirtioConsole)?; virtio_devices .push(Box::new(virtio_console_device) as Box); Some(console_input)