From 3ffc105f833e383830a9a973be3cb16225f95109 Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Tue, 10 May 2022 22:23:18 +0100 Subject: [PATCH] hypervisor, vm-device: Relocate InterruptSourceConfig Move this enum from vm-device to hypervisor crate so that hypervisor crate does not gain an extra dependency. Signed-off-by: Rob Bradford --- Cargo.lock | 2 +- hypervisor/Cargo.toml | 1 - hypervisor/src/kvm/mod.rs | 3 +-- hypervisor/src/mshv/mod.rs | 3 +-- hypervisor/src/vm.rs | 34 +++++++++++++++++++++++++++++++++- vm-device/Cargo.toml | 1 + vm-device/src/interrupt/mod.rs | 34 +--------------------------------- 7 files changed, 38 insertions(+), 40 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 318855cef..d6594d9d9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -356,7 +356,6 @@ dependencies = [ "serde_derive", "serde_json", "thiserror", - "vm-device", "vm-memory", "vmm-sys-util", ] @@ -1297,6 +1296,7 @@ name = "vm-device" version = "0.1.0" dependencies = [ "anyhow", + "hypervisor", "serde", "serde_derive", "serde_json", diff --git a/hypervisor/Cargo.toml b/hypervisor/Cargo.toml index 92423d9f5..eebb5f6cc 100644 --- a/hypervisor/Cargo.toml +++ b/hypervisor/Cargo.toml @@ -23,7 +23,6 @@ mshv-ioctls = { git = "https://github.com/rust-vmm/mshv", branch = "main", optio serde = { version = "1.0.137", features = ["rc"] } serde_derive = "1.0.137" serde_json = "1.0.81" -vm-device = { path = "../vm-device" } vm-memory = { version = "0.7.0", features = ["backend-mmap", "backend-atomic"] } vmm-sys-util = { version = "0.9.0", features = ["with-serde"] } diff --git a/hypervisor/src/kvm/mod.rs b/hypervisor/src/kvm/mod.rs index 19592af1f..ab217acc0 100644 --- a/hypervisor/src/kvm/mod.rs +++ b/hypervisor/src/kvm/mod.rs @@ -17,7 +17,7 @@ use crate::cpu; use crate::device; use crate::hypervisor; use crate::vec_with_array_field; -use crate::vm::{self, VmOps}; +use crate::vm::{self, InterruptSourceConfig, VmOps}; #[cfg(target_arch = "aarch64")] use crate::{arm64_core_reg_id, offset__of}; use kvm_ioctls::{NoDatamatch, VcpuFd, VmFd}; @@ -32,7 +32,6 @@ use std::result; #[cfg(target_arch = "x86_64")] use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::{Arc, RwLock}; -use vm_device::interrupt::InterruptSourceConfig; use vmm_sys_util::eventfd::EventFd; // x86_64 dependencies #[cfg(target_arch = "x86_64")] diff --git a/hypervisor/src/mshv/mod.rs b/hypervisor/src/mshv/mod.rs index 3ac344137..fa0ef3160 100644 --- a/hypervisor/src/mshv/mod.rs +++ b/hypervisor/src/mshv/mod.rs @@ -11,7 +11,7 @@ use crate::cpu; use crate::cpu::Vcpu; use crate::hypervisor; use crate::vec_with_array_field; -use crate::vm::{self, VmOps}; +use crate::vm::{self, InterruptSourceConfig, VmOps}; pub use mshv_bindings::*; pub use mshv_ioctls::IoEventAddress; use mshv_ioctls::{set_registers_64, Mshv, NoDatamatch, VcpuFd, VmFd}; @@ -23,7 +23,6 @@ use vm::DataMatch; #[cfg(target_arch = "x86_64")] pub mod x86_64; use crate::device; -use vm_device::interrupt::InterruptSourceConfig; use vmm_sys_util::eventfd::EventFd; #[cfg(target_arch = "x86_64")] pub use x86_64::VcpuMshvState as CpuState; diff --git a/hypervisor/src/vm.rs b/hypervisor/src/vm.rs index 9c2076e44..20ea84f4f 100644 --- a/hypervisor/src/vm.rs +++ b/hypervisor/src/vm.rs @@ -28,7 +28,6 @@ use kvm_ioctls::Cap; use std::fs::File; use std::sync::Arc; use thiserror::Error; -use vm_device::interrupt::InterruptSourceConfig; use vmm_sys_util::eventfd::EventFd; /// @@ -217,6 +216,39 @@ pub enum HypervisorVmError { /// pub type Result = std::result::Result; +/// Configuration data for legacy interrupts. +/// +/// On x86 platforms, legacy interrupts means those interrupts routed through PICs or IOAPICs. +#[derive(Copy, Clone, Debug)] +pub struct LegacyIrqSourceConfig { + pub irqchip: u32, + pub pin: u32, +} + +/// Configuration data for MSI/MSI-X interrupts. +/// +/// On x86 platforms, these interrupts are vectors delivered directly to the LAPIC. +#[derive(Copy, Clone, Debug, Default)] +pub struct MsiIrqSourceConfig { + /// High address to delivery message signaled interrupt. + pub high_addr: u32, + /// Low address to delivery message signaled interrupt. + pub low_addr: u32, + /// Data to write to delivery message signaled interrupt. + pub data: u32, + /// Unique ID of the device to delivery message signaled interrupt. + pub devid: u32, +} + +/// Configuration data for an interrupt source. +#[derive(Copy, Clone, Debug)] +pub enum InterruptSourceConfig { + /// Configuration data for Legacy interrupts. + LegacyIrq(LegacyIrqSourceConfig), + /// Configuration data for PciMsi, PciMsix and generic MSI interrupts. + MsiIrq(MsiIrqSourceConfig), +} + /// /// Trait to represent a Vm /// diff --git a/vm-device/Cargo.toml b/vm-device/Cargo.toml index d115cb9cd..1a020bee7 100644 --- a/vm-device/Cargo.toml +++ b/vm-device/Cargo.toml @@ -11,6 +11,7 @@ mshv = ["vfio-ioctls/mshv"] [dependencies] anyhow = "1.0.57" +hypervisor = { path = "../hypervisor" } thiserror = "1.0.31" serde = { version = "1.0.137", features = ["rc"] } serde_derive = "1.0.137" diff --git a/vm-device/src/interrupt/mod.rs b/vm-device/src/interrupt/mod.rs index 7c44404de..b0ff25ac9 100644 --- a/vm-device/src/interrupt/mod.rs +++ b/vm-device/src/interrupt/mod.rs @@ -57,6 +57,7 @@ //! * The virtual device backend requests the interrupt manager to create an interrupt group //! according to guest configuration information +pub use hypervisor::vm::{InterruptSourceConfig, LegacyIrqSourceConfig, MsiIrqSourceConfig}; use std::sync::Arc; use vmm_sys_util::eventfd::EventFd; @@ -66,39 +67,6 @@ pub type Result = std::io::Result; /// Data type to store an interrupt source identifier. pub type InterruptIndex = u32; -/// Configuration data for legacy interrupts. -/// -/// On x86 platforms, legacy interrupts means those interrupts routed through PICs or IOAPICs. -#[derive(Copy, Clone, Debug)] -pub struct LegacyIrqSourceConfig { - pub irqchip: u32, - pub pin: u32, -} - -/// Configuration data for MSI/MSI-X interrupts. -/// -/// On x86 platforms, these interrupts are vectors delivered directly to the LAPIC. -#[derive(Copy, Clone, Debug, Default)] -pub struct MsiIrqSourceConfig { - /// High address to delivery message signaled interrupt. - pub high_addr: u32, - /// Low address to delivery message signaled interrupt. - pub low_addr: u32, - /// Data to write to delivery message signaled interrupt. - pub data: u32, - /// Unique ID of the device to delivery message signaled interrupt. - pub devid: u32, -} - -/// Configuration data for an interrupt source. -#[derive(Copy, Clone, Debug)] -pub enum InterruptSourceConfig { - /// Configuration data for Legacy interrupts. - LegacyIrq(LegacyIrqSourceConfig), - /// Configuration data for PciMsi, PciMsix and generic MSI interrupts. - MsiIrq(MsiIrqSourceConfig), -} - /// Configuration data for legacy, pin based interrupt groups. /// /// A legacy interrupt group only takes one irq number as its configuration.