diff --git a/Cargo.toml b/Cargo.toml index b04f6ea9..5086003d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,7 @@ authors = ["Changyuan Lyu "] license = "Apache-2.0" repository = "https://github.com/google/alioth" version = "0.6.0" -edition = "2021" +edition = "2024" [workspace.dependencies] parking_lot = { version = "0.12", features = ["hardware-lock-elision"] } diff --git a/alioth-cli/src/main.rs b/alioth-cli/src/main.rs index 76e36d03..fcc2eef2 100644 --- a/alioth-cli/src/main.rs +++ b/alioth-cli/src/main.rs @@ -22,7 +22,7 @@ use std::path::PathBuf; use alioth::board::BoardConfig; #[cfg(target_arch = "x86_64")] use alioth::device::fw_cfg::FwCfgItemParam; -use alioth::errors::{trace_error, DebugTrace}; +use alioth::errors::{DebugTrace, trace_error}; use alioth::hv::Coco; #[cfg(target_os = "macos")] use alioth::hv::Hvf; @@ -45,7 +45,7 @@ use alioth::vm::Machine; use clap::{Args, Parser, Subcommand}; use flexi_logger::{FileSpec, Logger}; use serde::Deserialize; -use serde_aco::{help_text, Help}; +use serde_aco::{Help, help_text}; use snafu::{ResultExt, Snafu}; #[derive(Parser, Debug)] @@ -387,7 +387,9 @@ fn main_run(args: RunArgs) -> Result<(), Error> { let param = match serde_aco::from_args(&blk, &objects) { Ok(param) => param, Err(serde_aco::Error::ExpectedMapEq) => { - eprintln!("Please update the cmd line to --blk path={blk}, see https://github.com/google/alioth/pull/72 for details"); + eprintln!( + "Please update the cmd line to --blk path={blk}, see https://github.com/google/alioth/pull/72 for details" + ); BlockParam { path: blk.into(), ..Default::default() diff --git a/alioth/src/arch/aarch64/reg.rs b/alioth/src/arch/aarch64/reg.rs index dbb1d0bd..eaa02c39 100644 --- a/alioth/src/arch/aarch64/reg.rs +++ b/alioth/src/arch/aarch64/reg.rs @@ -56,7 +56,7 @@ pub enum Reg { } pub const fn encode(op0: u16, op1: u16, crn: u16, crm: u16, op2: u16) -> u16 { - op0 << 14 | op1 << 11 | crn << 7 | crm << 3 | op2 + (op0 << 14) | (op1 << 11) | (crn << 7) | (crm << 3) | op2 } c_enum! { diff --git a/alioth/src/board/aarch64.rs b/alioth/src/board/aarch64.rs index b89a2c68..4bdd5df9 100644 --- a/alioth/src/board/aarch64.rs +++ b/alioth/src/board/aarch64.rs @@ -25,7 +25,7 @@ use crate::arch::layout::{ RAM_32_START, }; use crate::arch::reg::SReg; -use crate::board::{Board, BoardConfig, Result, VcpuGuard, PCIE_MMIO_64_SIZE}; +use crate::board::{Board, BoardConfig, PCIE_MMIO_64_SIZE, Result, VcpuGuard}; use crate::firmware::dt::{DeviceTree, Node, PropVal}; use crate::hv::{GicV2, GicV3, Hypervisor, Its, Vcpu, Vm}; use crate::loader::{ExecType, InitState}; @@ -293,7 +293,7 @@ where Gic::V3 { .. } => 0, }; for pin in irq_pins { - interrupts.extend([ppi, pin, cpu_mask << 8 | level_trigger]); + interrupts.extend([ppi, pin, (cpu_mask << 8) | level_trigger]); } let node = Node { props: HashMap::from([ diff --git a/alioth/src/board/board.rs b/alioth/src/board/board.rs index 44e7e6f4..65f34ff8 100644 --- a/alioth/src/board/board.rs +++ b/alioth/src/board/board.rs @@ -20,8 +20,8 @@ mod x86_64; #[cfg(target_os = "linux")] use std::collections::HashMap; use std::ffi::CStr; -use std::sync::mpsc::{Receiver, Sender}; use std::sync::Arc; +use std::sync::mpsc::{Receiver, Sender}; use std::thread::JoinHandle; use libc::{MAP_PRIVATE, MAP_SHARED}; @@ -37,16 +37,16 @@ use crate::arch::layout::{ }; #[cfg(target_arch = "x86_64")] use crate::device::fw_cfg::FwCfg; -use crate::errors::{trace_error, DebugTrace}; +use crate::errors::{DebugTrace, trace_error}; use crate::hv::{Coco, Vcpu, Vm, VmEntry, VmExit}; #[cfg(target_arch = "x86_64")] use crate::loader::xen; -use crate::loader::{firmware, linux, ExecType, InitState, Payload}; +use crate::loader::{ExecType, InitState, Payload, firmware, linux}; use crate::mem::emulated::Mmio; use crate::mem::mapped::ArcMemPages; use crate::mem::{MemBackend, MemConfig, MemRegion, MemRegionType, Memory}; -use crate::pci::bus::PciBus; use crate::pci::Bdf; +use crate::pci::bus::PciBus; #[cfg(target_os = "linux")] use crate::vfio::container::Container; #[cfg(target_os = "linux")] diff --git a/alioth/src/board/x86_64.rs b/alioth/src/board/x86_64.rs index 33604405..0d57bf76 100644 --- a/alioth/src/board/x86_64.rs +++ b/alioth/src/board/x86_64.rs @@ -12,13 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::arch::x86_64::{CpuidResult, __cpuid}; +use std::arch::x86_64::{__cpuid, CpuidResult}; use std::collections::HashMap; use std::iter::zip; use std::marker::PhantomData; use std::mem::{offset_of, size_of, size_of_val}; -use std::sync::atomic::{AtomicU32, Ordering}; use std::sync::Arc; +use std::sync::atomic::{AtomicU32, Ordering}; use parking_lot::Mutex; use snafu::ResultExt; @@ -29,16 +29,16 @@ use crate::arch::layout::{ BIOS_DATA_END, EBDA_END, EBDA_START, MEM_64_START, PORT_ACPI_RESET, PORT_ACPI_SLEEP_CONTROL, RAM_32_SIZE, }; -use crate::arch::msr::{MiscEnable, IA32_MISC_ENABLE}; +use crate::arch::msr::{IA32_MISC_ENABLE, MiscEnable}; use crate::arch::reg::{Reg, SegAccess, SegReg, SegRegVal}; use crate::arch::sev::SnpPageType; -use crate::board::{error, Board, BoardConfig, Result, VcpuGuard, PCIE_MMIO_64_SIZE}; +use crate::board::{Board, BoardConfig, PCIE_MMIO_64_SIZE, Result, VcpuGuard, error}; use crate::firmware::acpi::bindings::{ AcpiTableFadt, AcpiTableHeader, AcpiTableRsdp, AcpiTableXsdt3, }; use crate::firmware::acpi::reg::{FadtReset, FadtSleepControl}; use crate::firmware::acpi::{ - create_fadt, create_madt, create_mcfg, create_rsdp, create_xsdt, AcpiTable, + AcpiTable, create_fadt, create_madt, create_mcfg, create_rsdp, create_xsdt, }; use crate::hv::{Coco, Hypervisor, Vcpu, Vm}; use crate::loader::InitState; diff --git a/alioth/src/device/console.rs b/alioth/src/device/console.rs index 78451135..805ac1fa 100644 --- a/alioth/src/device/console.rs +++ b/alioth/src/device/console.rs @@ -18,8 +18,8 @@ use std::sync::Arc; use std::thread::JoinHandle; use libc::{ - cfmakeraw, fcntl, tcgetattr, tcsetattr, termios, F_GETFL, F_SETFL, OPOST, O_NONBLOCK, - STDIN_FILENO, STDOUT_FILENO, TCSANOW, + F_GETFL, F_SETFL, O_NONBLOCK, OPOST, STDIN_FILENO, STDOUT_FILENO, TCSANOW, cfmakeraw, fcntl, + tcgetattr, tcsetattr, termios, }; use mio::unix::SourceFd; use mio::{Events, Interest, Poll, Token, Waker}; diff --git a/alioth/src/device/fw_cfg/acpi.rs b/alioth/src/device/fw_cfg/acpi.rs index be2db46e..27357c38 100644 --- a/alioth/src/device/fw_cfg/acpi.rs +++ b/alioth/src/device/fw_cfg/acpi.rs @@ -16,9 +16,9 @@ use std::mem::{offset_of, size_of}; use zerocopy::{Immutable, IntoBytes}; -use crate::device::fw_cfg::{create_file_name, FwCfgContent, FwCfgItem, FILE_NAME_SIZE}; -use crate::firmware::acpi::bindings::{AcpiTableHeader, AcpiTableRsdp}; +use crate::device::fw_cfg::{FILE_NAME_SIZE, FwCfgContent, FwCfgItem, create_file_name}; use crate::firmware::acpi::AcpiTable; +use crate::firmware::acpi::bindings::{AcpiTableHeader, AcpiTableRsdp}; pub const COMMAND_ALLOCATE: u32 = 0x1; pub const COMMAND_ADD_POINTER: u32 = 0x2; diff --git a/alioth/src/device/pvpanic.rs b/alioth/src/device/pvpanic.rs index 7bfe2681..c33bcb1f 100644 --- a/alioth/src/device/pvpanic.rs +++ b/alioth/src/device/pvpanic.rs @@ -20,7 +20,7 @@ use crate::mem::emulated::{Action, Mmio}; use crate::mem::{self, MemRegion}; use crate::pci::cap::PciCapList; use crate::pci::config::{ - CommonHeader, DeviceHeader, EmulatedConfig, HeaderType, PciConfig, BAR_MEM64, BAR_PREFETCHABLE, + BAR_MEM64, BAR_PREFETCHABLE, CommonHeader, DeviceHeader, EmulatedConfig, HeaderType, PciConfig, }; use crate::pci::{self, Pci, PciBar}; diff --git a/alioth/src/device/serial.rs b/alioth/src/device/serial.rs index ce34318e..6d009c7d 100644 --- a/alioth/src/device/serial.rs +++ b/alioth/src/device/serial.rs @@ -237,7 +237,7 @@ where reg.divisor = (reg.divisor & 0xff00) | byte as u16; } DIVISOR_LATCH_MSB if reg.line_control.divisor_latch_access() => { - reg.divisor = (reg.divisor & 0x00ff) | (byte as u16) << 8; + reg.divisor = (reg.divisor & 0x00ff) | ((byte as u16) << 8); } TX_HOLDING_REGISTER => { if reg.modem_control.loop_back() { diff --git a/alioth/src/errors.rs b/alioth/src/errors.rs index e0ae24ec..f055bfe8 100644 --- a/alioth/src/errors.rs +++ b/alioth/src/errors.rs @@ -15,7 +15,7 @@ use std::error::Error; use std::fmt; -pub use macros::{trace_error, DebugTrace}; +pub use macros::{DebugTrace, trace_error}; pub trait DebugTrace: Error { fn debug_trace(&self, f: &mut fmt::Formatter) -> Result; diff --git a/alioth/src/firmware/acpi/acpi.rs b/alioth/src/firmware/acpi/acpi.rs index ea453689..bdd047de 100644 --- a/alioth/src/firmware/acpi/acpi.rs +++ b/alioth/src/firmware/acpi/acpi.rs @@ -17,7 +17,7 @@ pub mod reg; use std::mem::{offset_of, size_of}; -use zerocopy::{transmute, FromBytes, IntoBytes}; +use zerocopy::{FromBytes, IntoBytes, transmute}; use crate::arch::layout::PCIE_CONFIG_START; #[cfg(target_arch = "x86_64")] diff --git a/alioth/src/firmware/acpi/reg.rs b/alioth/src/firmware/acpi/reg.rs index cd813c27..04d93e10 100644 --- a/alioth/src/firmware/acpi/reg.rs +++ b/alioth/src/firmware/acpi/reg.rs @@ -13,8 +13,8 @@ // limitations under the License. use crate::firmware::acpi::bindings::FadtSleepControlReg; -use crate::mem::emulated::{Action, Mmio}; use crate::mem::Result; +use crate::mem::emulated::{Action, Mmio}; pub const FADT_RESET_VAL: u8 = b'r'; @@ -25,9 +25,11 @@ impl Mmio for FadtReset { fn size(&self) -> u64 { 1 } + fn read(&self, _offset: u64, _size: u8) -> Result { Ok(0) } + fn write(&self, _offset: u64, _size: u8, val: u64) -> Result { if val as u8 == FADT_RESET_VAL { Ok(Action::Reset) diff --git a/alioth/src/hv/hv.rs b/alioth/src/hv/hv.rs index 8d48fcb3..aacd961c 100644 --- a/alioth/src/hv/hv.rs +++ b/alioth/src/hv/hv.rs @@ -39,7 +39,7 @@ use crate::arch::reg::{DtReg, DtRegVal, SegReg, SegRegVal}; use crate::arch::reg::{Reg, SReg}; #[cfg(target_arch = "x86_64")] use crate::arch::sev::{SevPolicy, SnpPageType, SnpPolicy}; -use crate::errors::{trace_error, DebugTrace}; +use crate::errors::{DebugTrace, trace_error}; #[cfg(target_os = "macos")] pub use self::hvf::Hvf; diff --git a/alioth/src/hv/hvf/bindings.rs b/alioth/src/hv/hvf/bindings.rs index e4e12fe6..cf851c33 100644 --- a/alioth/src/hv/hvf/bindings.rs +++ b/alioth/src/hv/hvf/bindings.rs @@ -97,7 +97,7 @@ bitflags! { } #[link(name = "Hypervisor", kind = "framework")] -extern "C" { +unsafe extern "C" { pub fn hv_vm_create(config: *mut i32) -> i32; pub fn hv_vm_destroy() -> i32; pub fn hv_vcpu_create(vcpu: &mut u64, exit: &mut *mut HvVcpuExit, config: *mut c_void) -> i32; diff --git a/alioth/src/hv/hvf/hvf.rs b/alioth/src/hv/hvf/hvf.rs index 4b77be1c..1735c940 100644 --- a/alioth/src/hv/hvf/hvf.rs +++ b/alioth/src/hv/hvf/hvf.rs @@ -24,7 +24,7 @@ use std::ptr::null_mut; use parking_lot::Mutex; use snafu::ResultExt; -use crate::hv::{error, Hypervisor, Result, VmConfig}; +use crate::hv::{Hypervisor, Result, VmConfig, error}; use self::bindings::hv_vm_create; use self::vm::HvfVm; @@ -60,6 +60,7 @@ pub struct Hvf {} impl Hypervisor for Hvf { type Vm = HvfVm; + fn create_vm(&self, _config: &VmConfig) -> Result { let ret = unsafe { hv_vm_create(null_mut()) }; check_ret(ret).context(error::CreateVm)?; diff --git a/alioth/src/hv/hvf/vcpu/vcpu.rs b/alioth/src/hv/hvf/vcpu/vcpu.rs index 9e8593bc..17575eab 100644 --- a/alioth/src/hv/hvf/vcpu/vcpu.rs +++ b/alioth/src/hv/hvf/vcpu/vcpu.rs @@ -19,11 +19,11 @@ use snafu::ResultExt; use crate::arch::reg::{Reg, SReg}; use crate::hv::hvf::bindings::{ - hv_vcpu_destroy, hv_vcpu_get_reg, hv_vcpu_get_sys_reg, hv_vcpu_run, hv_vcpu_set_reg, - hv_vcpu_set_sys_reg, HvExitReason, HvReg, HvVcpuExit, + HvExitReason, HvReg, HvVcpuExit, hv_vcpu_destroy, hv_vcpu_get_reg, hv_vcpu_get_sys_reg, + hv_vcpu_run, hv_vcpu_set_reg, hv_vcpu_set_sys_reg, }; use crate::hv::hvf::check_ret; -use crate::hv::{error, Result, Vcpu, VmEntry, VmExit}; +use crate::hv::{Result, Vcpu, VmEntry, VmExit, error}; #[derive(Debug)] pub struct HvfVcpu { @@ -165,7 +165,7 @@ mod test { use std::ptr::null_mut; use assert_matches::assert_matches; - use libc::{mmap, MAP_ANONYMOUS, MAP_FAILED, MAP_PRIVATE, PROT_READ, PROT_WRITE}; + use libc::{MAP_ANONYMOUS, MAP_FAILED, MAP_PRIVATE, PROT_READ, PROT_WRITE, mmap}; use crate::arch::reg::Reg; use crate::ffi; diff --git a/alioth/src/hv/hvf/vcpu/vmentry.rs b/alioth/src/hv/hvf/vcpu/vmentry.rs index a939456b..6c52f41c 100644 --- a/alioth/src/hv/hvf/vcpu/vmentry.rs +++ b/alioth/src/hv/hvf/vcpu/vmentry.rs @@ -12,10 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. +use crate::hv::VmExit; use crate::hv::hvf::bindings::hv_vcpu_set_reg; use crate::hv::hvf::check_ret; use crate::hv::hvf::vcpu::HvfVcpu; -use crate::hv::VmExit; impl HvfVcpu { pub fn entry_mmio(&mut self, data: u64) { diff --git a/alioth/src/hv/hvf/vcpu/vmexit.rs b/alioth/src/hv/hvf/vcpu/vmexit.rs index 61932304..109f3fb6 100644 --- a/alioth/src/hv/hvf/vcpu/vmexit.rs +++ b/alioth/src/hv/hvf/vcpu/vmexit.rs @@ -13,7 +13,7 @@ // limitations under the License. use crate::arch::reg::{EsrEl2DataAbort, EsrEl2Ec, Reg}; -use crate::hv::hvf::bindings::{hv_vcpu_get_reg, HvReg, HvVcpuExitException}; +use crate::hv::hvf::bindings::{HvReg, HvVcpuExitException, hv_vcpu_get_reg}; use crate::hv::hvf::check_ret; use crate::hv::hvf::vcpu::HvfVcpu; use crate::hv::{Vcpu, VmExit}; diff --git a/alioth/src/hv/hvf/vm.rs b/alioth/src/hv/hvf/vm.rs index 862119fc..7184c2ed 100644 --- a/alioth/src/hv/hvf/vm.rs +++ b/alioth/src/hv/hvf/vm.rs @@ -21,13 +21,13 @@ use parking_lot::Mutex; use snafu::ResultExt; use crate::hv::hvf::bindings::{ - hv_vcpu_create, hv_vm_destroy, hv_vm_map, hv_vm_unmap, HvMemoryFlag, + HvMemoryFlag, hv_vcpu_create, hv_vm_destroy, hv_vm_map, hv_vm_unmap, }; use crate::hv::hvf::check_ret; use crate::hv::hvf::vcpu::HvfVcpu; use crate::hv::{ - error, GicV2, GicV3, IoeventFd, IoeventFdRegistry, IrqFd, IrqSender, Its, MemMapOption, - MsiSender, Result, Vm, VmExit, VmMemory, + GicV2, GicV3, IoeventFd, IoeventFdRegistry, IrqFd, IrqSender, Its, MemMapOption, MsiSender, + Result, Vm, VmExit, VmMemory, error, }; #[derive(Debug)] @@ -37,6 +37,7 @@ impl VmMemory for HvfMemory { fn deregister_encrypted_range(&self, _range: &[u8]) -> Result<()> { unimplemented!() } + fn mem_map(&self, gpa: u64, size: u64, hva: usize, option: MemMapOption) -> Result<()> { if option.log_dirty { return error::Capability { cap: "log dirty" }.fail(); @@ -94,24 +95,31 @@ impl IrqFd for HvfIrqFd { fn get_addr_hi(&self) -> u32 { unimplemented!() } + fn get_addr_lo(&self) -> u32 { unimplemented!() } + fn get_data(&self) -> u32 { unimplemented!() } + fn get_masked(&self) -> bool { unimplemented!() } + fn set_addr_hi(&self, _val: u32) -> Result<()> { unimplemented!() } + fn set_addr_lo(&self, _val: u32) -> Result<()> { unimplemented!() } + fn set_data(&self, _val: u32) -> Result<()> { unimplemented!() } + fn set_masked(&self, _val: bool) -> Result { unimplemented!() } @@ -122,9 +130,11 @@ pub struct HvfMsiSender {} impl MsiSender for HvfMsiSender { type IrqFd = HvfIrqFd; + fn create_irqfd(&self) -> Result { unimplemented!() } + fn send(&self, _addr: u64, _data: u32) -> Result<()> { unimplemented!() } @@ -146,12 +156,15 @@ pub struct HvfIoeventFdRegistry {} impl IoeventFdRegistry for HvfIoeventFdRegistry { type IoeventFd = HvfIoeventFd; + fn create(&self) -> Result { unimplemented!() } + fn deregister(&self, _fd: &Self::IoeventFd) -> Result<()> { unimplemented!() } + fn register( &self, _fd: &Self::IoeventFd, @@ -170,21 +183,27 @@ impl GicV2 for HvfGicV2 { fn init(&self) -> Result<()> { unimplemented!() } + fn get_dist_reg(&self, _cpu_index: u32, _offset: u16) -> Result { unimplemented!() } + fn set_dist_reg(&self, _cpu_index: u32, _offset: u16, _val: u32) -> Result<()> { unimplemented!() } + fn get_cpu_reg(&self, _cpu_index: u32, _offset: u16) -> Result { unimplemented!() } + fn set_cpu_reg(&self, _cpu_index: u32, _offset: u16, _val: u32) -> Result<()> { unimplemented!() } + fn get_num_irqs(&self) -> Result { unimplemented!() } + fn set_num_irqs(&self, _val: u32) -> Result<()> { unimplemented!() } @@ -223,16 +242,23 @@ impl Drop for HvfVm { } impl Vm for HvfVm { - type Vcpu = HvfVcpu; + type GicV2 = HvfGicV2; + type GicV3 = HvfGicV3; + type IoeventFdRegistry = HvfIoeventFdRegistry; + type IrqSender = HvfIrqSender; + type Its = HvfIts; type Memory = HvfMemory; type MsiSender = HvfMsiSender; - type IoeventFdRegistry = HvfIoeventFdRegistry; + type Vcpu = HvfVcpu; + fn create_ioeventfd_registry(&self) -> Result { unimplemented!() } + fn create_msi_sender(&self, _devid: u32) -> Result { unimplemented!() } + fn create_vcpu(&self, id: u32) -> Result { let mut exit = null_mut(); let mut vcpu_id = 0; @@ -246,15 +272,15 @@ impl Vm for HvfVm { exit_reg: None, }) } + fn create_vm_memory(&mut self) -> Result { Ok(HvfMemory {}) } + fn stop_vcpu(_id: u32, _handle: &JoinHandle) -> Result<()> { unimplemented!() } - type GicV2 = HvfGicV2; - fn create_gic_v2( &self, _distributor_base: u64, @@ -263,11 +289,10 @@ impl Vm for HvfVm { unimplemented!() } - type IrqSender = HvfIrqSender; fn create_irq_sender(&self, _pin: u8) -> Result { unimplemented!() } - type GicV3 = HvfGicV3; + fn create_gic_v3( &self, _distributor_base: u64, @@ -276,7 +301,7 @@ impl Vm for HvfVm { ) -> Result { unimplemented!() } - type Its = HvfIts; + fn create_its(&self, _base: u64) -> Result { unimplemented!() } diff --git a/alioth/src/hv/kvm/aarch64.rs b/alioth/src/hv/kvm/aarch64.rs index 02833c11..45eb77e1 100644 --- a/alioth/src/hv/kvm/aarch64.rs +++ b/alioth/src/hv/kvm/aarch64.rs @@ -14,9 +14,9 @@ use std::os::fd::OwnedFd; +use crate::hv::kvm::Kvm; use crate::hv::kvm::bindings::KvmVmType; use crate::hv::kvm::vm::KvmVm; -use crate::hv::kvm::Kvm; use crate::hv::{Result, VmConfig}; impl Kvm { diff --git a/alioth/src/hv/kvm/device.rs b/alioth/src/hv/kvm/device.rs index e0ab80c8..a6c62783 100644 --- a/alioth/src/hv/kvm/device.rs +++ b/alioth/src/hv/kvm/device.rs @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::mem::{size_of_val, MaybeUninit}; +use std::mem::{MaybeUninit, size_of_val}; use std::os::fd::{AsFd, AsRawFd, BorrowedFd, FromRawFd, OwnedFd, RawFd}; use snafu::ResultExt; diff --git a/alioth/src/hv/kvm/ioctls.rs b/alioth/src/hv/kvm/ioctls.rs index 62f7163d..d5cedfe6 100644 --- a/alioth/src/hv/kvm/ioctls.rs +++ b/alioth/src/hv/kvm/ioctls.rs @@ -15,8 +15,8 @@ #[cfg(not(target_arch = "x86_64"))] use crate::hv::kvm::bindings::KvmOneReg; use crate::hv::kvm::bindings::{ - KvmCap, KvmEncRegion, KvmIoEventFd, KvmIrqRouting, KvmIrqfd, KvmMemoryAttributes, KvmMsi, - KvmUserspaceMemoryRegion, KvmUserspaceMemoryRegion2, KvmVmType, KVMIO, + KVMIO, KvmCap, KvmEncRegion, KvmIoEventFd, KvmIrqRouting, KvmIrqfd, KvmMemoryAttributes, + KvmMsi, KvmUserspaceMemoryRegion, KvmUserspaceMemoryRegion2, KvmVmType, }; #[cfg(target_arch = "x86_64")] use crate::hv::kvm::bindings::{ diff --git a/alioth/src/hv/kvm/kvm.rs b/alioth/src/hv/kvm/kvm.rs index f2a36caf..09042f3d 100644 --- a/alioth/src/hv/kvm/kvm.rs +++ b/alioth/src/hv/kvm/kvm.rs @@ -38,27 +38,27 @@ use std::mem::{size_of, transmute}; use std::os::fd::{FromRawFd, OwnedFd}; use std::path::{Path, PathBuf}; use std::ptr::null_mut; -use std::sync::atomic::AtomicU32; use std::sync::Arc; +use std::sync::atomic::AtomicU32; use libc::SIGRTMIN; -use parking_lot::lock_api::RwLock; use parking_lot::Mutex; +use parking_lot::lock_api::RwLock; use serde::Deserialize; use serde_aco::Help; use snafu::{ResultExt, Snafu}; #[cfg(target_arch = "x86_64")] use crate::arch::cpuid::CpuidIn; -use crate::errors::{trace_error, DebugTrace}; +use crate::errors::{DebugTrace, trace_error}; use crate::ffi; -use crate::hv::{error, Hypervisor, MemMapOption, Result, VmConfig}; +use crate::hv::{Hypervisor, MemMapOption, Result, VmConfig, error}; +use self::bindings::KVM_API_VERSION; #[cfg(target_arch = "aarch64")] use self::bindings::KvmDevType; -use self::bindings::KVM_API_VERSION; #[cfg(target_arch = "x86_64")] -use self::bindings::{KvmCpuid2, KvmCpuid2Flag, KvmCpuidEntry2, KVM_MAX_CPUID_ENTRIES}; +use self::bindings::{KVM_MAX_CPUID_ENTRIES, KvmCpuid2, KvmCpuid2Flag, KvmCpuidEntry2}; #[cfg(target_arch = "x86_64")] use self::ioctls::kvm_get_supported_cpuid; use self::ioctls::{kvm_create_vm, kvm_get_api_version, kvm_get_vcpu_mmap_size}; diff --git a/alioth/src/hv/kvm/sev/sev.rs b/alioth/src/hv/kvm/sev/sev.rs index 8f2a3798..6f0f44dd 100644 --- a/alioth/src/hv/kvm/sev/sev.rs +++ b/alioth/src/hv/kvm/sev/sev.rs @@ -23,11 +23,11 @@ use std::path::Path; use snafu::ResultExt; -use crate::hv::kvm::kvm_error; use crate::hv::Result; +use crate::hv::kvm::kvm_error; use crate::ioctl_writeread; -use self::bindings::{SevIssueCmd, SEV_RET_SUCCESS}; +use self::bindings::{SEV_RET_SUCCESS, SevIssueCmd}; const SEV_IOC_TYPE: u8 = b'S'; diff --git a/alioth/src/hv/kvm/vcpu/aarch64.rs b/alioth/src/hv/kvm/vcpu/aarch64.rs index 13ba74bc..7c77d786 100644 --- a/alioth/src/hv/kvm/vcpu/aarch64.rs +++ b/alioth/src/hv/kvm/vcpu/aarch64.rs @@ -20,10 +20,10 @@ use crate::hv::kvm::ioctls::{ kvm_arm_preferred_target, kvm_arm_vcpu_init, kvm_get_one_reg, kvm_set_one_reg, }; use crate::hv::kvm::vcpu::KvmVcpu; -use crate::hv::{error, Result}; +use crate::hv::{Result, error}; const fn encode_reg(reg: Reg) -> u64 { - 0x6030_0000_0010_0000 | (reg as u64) << 1 + 0x6030_0000_0010_0000 | ((reg as u64) << 1) } const fn encode_system_reg(reg: SReg) -> u64 { diff --git a/alioth/src/hv/kvm/vcpu/vcpu.rs b/alioth/src/hv/kvm/vcpu/vcpu.rs index f3fe9906..d55d7e5f 100644 --- a/alioth/src/hv/kvm/vcpu/vcpu.rs +++ b/alioth/src/hv/kvm/vcpu/vcpu.rs @@ -27,7 +27,7 @@ use std::os::fd::{OwnedFd, RawFd}; use std::ptr::null_mut; use std::sync::Arc; -use libc::{mmap, munmap, MAP_FAILED, MAP_SHARED, PROT_READ, PROT_WRITE}; +use libc::{MAP_FAILED, MAP_SHARED, PROT_READ, PROT_WRITE, mmap, munmap}; use snafu::ResultExt; #[cfg(target_arch = "x86_64")] @@ -39,8 +39,8 @@ use crate::ffi; use crate::hv::kvm::bindings::{KvmExit, KvmRun}; use crate::hv::kvm::ioctls::kvm_run; use crate::hv::kvm::vm::VmInner; -use crate::hv::kvm::{kvm_error, KvmError}; -use crate::hv::{error, Error, Result, Vcpu, VmEntry, VmExit}; +use crate::hv::kvm::{KvmError, kvm_error}; +use crate::hv::{Error, Result, Vcpu, VmEntry, VmExit, error}; pub(super) struct KvmRunBlock { addr: usize, @@ -62,11 +62,11 @@ impl KvmRunBlock { } pub(super) unsafe fn data_slice(&self, offset: usize, count: usize) -> &[T] { - std::slice::from_raw_parts((self.addr + offset) as *const T, count) + unsafe { std::slice::from_raw_parts((self.addr + offset) as *const T, count) } } pub(super) unsafe fn data_slice_mut(&mut self, offset: usize, count: usize) -> &mut [T] { - std::slice::from_raw_parts_mut((self.addr + offset) as *mut T, count) + unsafe { std::slice::from_raw_parts_mut((self.addr + offset) as *mut T, count) } } } diff --git a/alioth/src/hv/kvm/vcpu/x86_64.rs b/alioth/src/hv/kvm/vcpu/x86_64.rs index 839359b1..30a9cc56 100644 --- a/alioth/src/hv/kvm/vcpu/x86_64.rs +++ b/alioth/src/hv/kvm/vcpu/x86_64.rs @@ -21,7 +21,7 @@ use snafu::ResultExt; use crate::arch::cpuid::CpuidIn; use crate::arch::reg::{DtReg, DtRegVal, Reg, SReg, SegAccess, SegReg, SegRegVal}; use crate::hv::kvm::bindings::{ - KvmCpuid2, KvmCpuid2Flag, KvmCpuidEntry2, KvmMsrEntry, KvmMsrs, KvmRegs, KVM_MAX_CPUID_ENTRIES, + KVM_MAX_CPUID_ENTRIES, KvmCpuid2, KvmCpuid2Flag, KvmCpuidEntry2, KvmMsrEntry, KvmMsrs, KvmRegs, MAX_IO_MSRS, }; use crate::hv::kvm::ioctls::{ @@ -30,7 +30,7 @@ use crate::hv::kvm::ioctls::{ }; use crate::hv::kvm::kvm_error; use crate::hv::kvm::vcpu::KvmVcpu; -use crate::hv::{error, Error, Result}; +use crate::hv::{Error, Result, error}; macro_rules! set_kvm_sreg { ($kvm_sregs:ident, $sreg:ident, $val:expr) => { @@ -327,7 +327,7 @@ mod test { use std::ptr::null_mut; use assert_matches::assert_matches; - use libc::{mmap, MAP_ANONYMOUS, MAP_FAILED, MAP_SHARED, PROT_EXEC, PROT_READ, PROT_WRITE}; + use libc::{MAP_ANONYMOUS, MAP_FAILED, MAP_SHARED, PROT_EXEC, PROT_READ, PROT_WRITE, mmap}; use crate::arch::msr::Efer; use crate::arch::paging::Entry; @@ -341,8 +341,8 @@ mod test { #[test] #[cfg_attr(not(feature = "test-hv"), ignore)] fn test_vcpu_regs() { - use crate::hv::kvm::KvmConfig; use crate::hv::VmConfig; + use crate::hv::kvm::KvmConfig; let kvm = Kvm::new(KvmConfig::default()).unwrap(); let vm_config = VmConfig { coco: None }; @@ -374,12 +374,12 @@ mod test { } let sregs = [ - (SReg::Cr0, 1 << 0 | 1 << 5 | 1 << 31), + (SReg::Cr0, (1 << 0) | (1 << 5) | (1 << 31)), (SReg::Cr2, 0xffff88ac93e00000), (SReg::Cr3, 0x1362d001), (SReg::Cr4, 1 << 5), (SReg::Cr8, 0x0), - (SReg::Efer, 1 << 8 | 1 << 10), + (SReg::Efer, (1 << 8) | (1 << 10)), (SReg::ApicBase, 0xfee00900), ]; let seg_regs = [ @@ -489,8 +489,8 @@ mod test { #[test] #[cfg_attr(not(feature = "test-hv"), ignore)] fn test_kvm_run() { - use crate::hv::kvm::KvmConfig; use crate::hv::VmConfig; + use crate::hv::kvm::KvmConfig; let kvm = Kvm::new(KvmConfig::default()).unwrap(); let vm_config = VmConfig { coco: None }; diff --git a/alioth/src/hv/kvm/vm/aarch64.rs b/alioth/src/hv/kvm/vm/aarch64.rs index 5fe16b87..53100b72 100644 --- a/alioth/src/hv/kvm/vm/aarch64.rs +++ b/alioth/src/hv/kvm/vm/aarch64.rs @@ -12,12 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. +use crate::hv::kvm::Result; use crate::hv::kvm::bindings::{ KvmDevArmVgicCtrl, KvmDevArmVgicGrp, KvmDevType, KvmVgicAddrType, KvmVgicV3RedistRegion, }; use crate::hv::kvm::device::KvmDevice; use crate::hv::kvm::vm::KvmVm; -use crate::hv::kvm::Result; use crate::hv::{GicV2, GicV3, Its}; #[derive(Debug)] @@ -36,26 +36,26 @@ impl GicV2 for KvmGicV2 { } fn get_dist_reg(&self, cpu_index: u32, offset: u16) -> Result { - let attr = (cpu_index as u64) << 32 | (offset as u64); + let attr = ((cpu_index as u64) << 32) | (offset as u64); let v = self.dev.get_attr(KvmDevArmVgicGrp::DIST_REGS.raw(), attr)?; Ok(v) } fn set_dist_reg(&self, cpu_index: u32, offset: u16, val: u32) -> Result<()> { - let attr = (cpu_index as u64) << 32 | (offset as u64); + let attr = ((cpu_index as u64) << 32) | (offset as u64); self.dev .set_attr(KvmDevArmVgicGrp::DIST_REGS.raw(), attr, &val)?; Ok(()) } fn get_cpu_reg(&self, cpu_index: u32, offset: u16) -> Result { - let attr = (cpu_index as u64) << 32 | (offset as u64); + let attr = ((cpu_index as u64) << 32) | (offset as u64); let v = self.dev.get_attr(KvmDevArmVgicGrp::CPU_REGS.raw(), attr)?; Ok(v) } fn set_cpu_reg(&self, cpu_index: u32, offset: u16, val: u32) -> Result<()> { - let attr = (cpu_index as u64) << 32 | (offset as u64); + let attr = ((cpu_index as u64) << 32) | (offset as u64); self.dev .set_attr(KvmDevArmVgicGrp::CPU_REGS.raw(), attr, &val)?; Ok(()) diff --git a/alioth/src/hv/kvm/vm/vm.rs b/alioth/src/hv/kvm/vm/vm.rs index f7414133..80102edb 100644 --- a/alioth/src/hv/kvm/vm/vm.rs +++ b/alioth/src/hv/kvm/vm/vm.rs @@ -21,26 +21,26 @@ use std::collections::HashMap; use std::io::ErrorKind; use std::os::fd::{AsFd, AsRawFd, BorrowedFd, FromRawFd, OwnedFd, RawFd}; use std::os::unix::thread::JoinHandleExt; -use std::sync::atomic::{AtomicU32, Ordering}; use std::sync::Arc; +use std::sync::atomic::{AtomicU32, Ordering}; use std::thread::JoinHandle; -use libc::{eventfd, write, EFD_CLOEXEC, EFD_NONBLOCK, SIGRTMIN}; +use libc::{EFD_CLOEXEC, EFD_NONBLOCK, SIGRTMIN, eventfd, write}; use parking_lot::{Mutex, RwLock}; use snafu::ResultExt; #[cfg(target_arch = "x86_64")] use crate::arch::sev::{SnpPageType, SnpPolicy}; use crate::ffi; -#[cfg(target_arch = "aarch64")] -use crate::hv::kvm::bindings::KvmMsiFlag; #[cfg(target_arch = "x86_64")] use crate::hv::kvm::bindings::KVM_IRQCHIP_IOAPIC; +#[cfg(target_arch = "aarch64")] +use crate::hv::kvm::bindings::KvmMsiFlag; use crate::hv::kvm::bindings::{ - KvmCap, KvmEncRegion, KvmIoEventFd, KvmIoEventFdFlag, KvmIrqRouting, KvmIrqRoutingEntry, - KvmIrqRoutingIrqchip, KvmIrqRoutingMsi, KvmIrqfd, KvmIrqfdFlag, KvmMemFlag, KvmMemoryAttribute, - KvmMemoryAttributes, KvmMsi, KvmUserspaceMemoryRegion, KvmUserspaceMemoryRegion2, - KVM_IRQ_ROUTING_IRQCHIP, KVM_IRQ_ROUTING_MSI, + KVM_IRQ_ROUTING_IRQCHIP, KVM_IRQ_ROUTING_MSI, KvmCap, KvmEncRegion, KvmIoEventFd, + KvmIoEventFdFlag, KvmIrqRouting, KvmIrqRoutingEntry, KvmIrqRoutingIrqchip, KvmIrqRoutingMsi, + KvmIrqfd, KvmIrqfdFlag, KvmMemFlag, KvmMemoryAttribute, KvmMemoryAttributes, KvmMsi, + KvmUserspaceMemoryRegion, KvmUserspaceMemoryRegion2, }; use crate::hv::kvm::ioctls::{ kvm_check_extension, kvm_create_vcpu, kvm_ioeventfd, kvm_irqfd, kvm_memory_encrypt_reg_region, @@ -48,10 +48,10 @@ use crate::hv::kvm::ioctls::{ kvm_set_user_memory_region, kvm_set_user_memory_region2, kvm_signal_msi, }; use crate::hv::kvm::vcpu::{KvmRunBlock, KvmVcpu}; -use crate::hv::kvm::{kvm_error, KvmError}; +use crate::hv::kvm::{KvmError, kvm_error}; use crate::hv::{ - error, Error, IoeventFd, IoeventFdRegistry, IrqFd, IrqSender, MemMapOption, MsiSender, Result, - Vm, VmMemory, + Error, IoeventFd, IoeventFdRegistry, IrqFd, IrqSender, MemMapOption, MsiSender, Result, Vm, + VmMemory, error, }; #[cfg(target_arch = "x86_64")] @@ -429,7 +429,9 @@ macro_rules! impl_irqfd_method { impl IrqFd for KvmIrqFd { impl_irqfd_method!(addr_lo, get_addr_lo, set_addr_lo); + impl_irqfd_method!(addr_hi, get_addr_hi, set_addr_hi); + impl_irqfd_method!(data, get_data, set_data); fn get_masked(&self) -> bool { @@ -558,6 +560,7 @@ pub struct KvmIoeventFdRegistry { impl IoeventFdRegistry for KvmIoeventFdRegistry { type IoeventFd = KvmIoeventFd; + fn create(&self) -> Result { let fd = ffi!(unsafe { eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK) }).context(error::IoeventFd)?; @@ -605,11 +608,17 @@ impl IoeventFdRegistry for KvmIoeventFdRegistry { } impl Vm for KvmVm { - type Vcpu = KvmVcpu; + #[cfg(target_arch = "aarch64")] + type GicV2 = aarch64::KvmGicV2; + #[cfg(target_arch = "aarch64")] + type GicV3 = aarch64::KvmGicV3; + type IoeventFdRegistry = KvmIoeventFdRegistry; type IrqSender = KvmIrqSender; - type MsiSender = KvmMsiSender; + #[cfg(target_arch = "aarch64")] + type Its = aarch64::KvmIts; type Memory = KvmMemory; - type IoeventFdRegistry = KvmIoeventFdRegistry; + type MsiSender = KvmMsiSender; + type Vcpu = KvmVcpu; fn create_vcpu(&self, id: u32) -> Result { let vcpu_fd = unsafe { kvm_create_vcpu(&self.vm, id) }.context(error::CreateVcpu)?; @@ -727,15 +736,11 @@ impl Vm for KvmVm { self.kvm_snp_launch_finish() } - #[cfg(target_arch = "aarch64")] - type GicV2 = aarch64::KvmGicV2; #[cfg(target_arch = "aarch64")] fn create_gic_v2(&self, distributor_base: u64, cpu_interface_base: u64) -> Result { self.kvm_create_gic_v2(distributor_base, cpu_interface_base) } - #[cfg(target_arch = "aarch64")] - type GicV3 = aarch64::KvmGicV3; #[cfg(target_arch = "aarch64")] fn create_gic_v3( &self, @@ -746,8 +751,6 @@ impl Vm for KvmVm { self.kvm_create_gic_v3(distributor_base, redistributor_base, redistributor_count) } - #[cfg(target_arch = "aarch64")] - type Its = aarch64::KvmIts; #[cfg(target_arch = "aarch64")] fn create_its(&self, base: u64) -> Result { self.kvm_create_its(base) @@ -759,7 +762,7 @@ mod test { use std::ptr::null_mut; use assert_matches::assert_matches; - use libc::{mmap, MAP_ANONYMOUS, MAP_FAILED, MAP_PRIVATE, PROT_EXEC, PROT_READ, PROT_WRITE}; + use libc::{MAP_ANONYMOUS, MAP_FAILED, MAP_PRIVATE, PROT_EXEC, PROT_READ, PROT_WRITE, mmap}; use super::*; use crate::ffi; diff --git a/alioth/src/hv/kvm/vm/x86_64.rs b/alioth/src/hv/kvm/vm/x86_64.rs index ca9a945d..536e55db 100644 --- a/alioth/src/hv/kvm/vm/x86_64.rs +++ b/alioth/src/hv/kvm/vm/x86_64.rs @@ -17,17 +17,17 @@ use std::os::fd::{AsFd, AsRawFd}; use snafu::ResultExt; use crate::arch::sev::{SnpPageType, SnpPolicy}; +use crate::hv::Result; use crate::hv::kvm::ioctls::kvm_memory_encrypt_op; +use crate::hv::kvm::sev::SevFd; use crate::hv::kvm::sev::bindings::{ - KvmSevCmd, KvmSevLaunchMeasure, KvmSevLaunchStart, KvmSevLaunchUpdateData, - KvmSevSnpLaunchFinish, KvmSevSnpLaunchStart, KvmSevSnpLaunchUpdate, KVM_SEV_LAUNCH_FINISH, - KVM_SEV_LAUNCH_MEASURE, KVM_SEV_LAUNCH_START, KVM_SEV_LAUNCH_UPDATE_DATA, - KVM_SEV_LAUNCH_UPDATE_VMSA, KVM_SEV_SNP_LAUNCH_FINISH, KVM_SEV_SNP_LAUNCH_START, - KVM_SEV_SNP_LAUNCH_UPDATE, + KVM_SEV_LAUNCH_FINISH, KVM_SEV_LAUNCH_MEASURE, KVM_SEV_LAUNCH_START, + KVM_SEV_LAUNCH_UPDATE_DATA, KVM_SEV_LAUNCH_UPDATE_VMSA, KVM_SEV_SNP_LAUNCH_FINISH, + KVM_SEV_SNP_LAUNCH_START, KVM_SEV_SNP_LAUNCH_UPDATE, KvmSevCmd, KvmSevLaunchMeasure, + KvmSevLaunchStart, KvmSevLaunchUpdateData, KvmSevSnpLaunchFinish, KvmSevSnpLaunchStart, + KvmSevSnpLaunchUpdate, }; -use crate::hv::kvm::sev::SevFd; -use crate::hv::kvm::{kvm_error, KvmError, KvmVm}; -use crate::hv::Result; +use crate::hv::kvm::{KvmError, KvmVm, kvm_error}; #[derive(Debug)] pub struct VmArch { diff --git a/alioth/src/hv/kvm/vmexit.rs b/alioth/src/hv/kvm/vmexit.rs index 75983f0b..e2a3055a 100644 --- a/alioth/src/hv/kvm/vmexit.rs +++ b/alioth/src/hv/kvm/vmexit.rs @@ -13,7 +13,7 @@ // limitations under the License. use crate::hv::kvm::bindings::{ - KvmExitIo, KvmMapGpaRangeFlag, KvmSystemEvent, KVM_HC_MAP_GPA_RANGE, + KVM_HC_MAP_GPA_RANGE, KvmExitIo, KvmMapGpaRangeFlag, KvmSystemEvent, }; use crate::hv::kvm::vcpu::KvmVcpu; use crate::hv::{Error, VmExit}; diff --git a/alioth/src/hv/kvm/x86_64.rs b/alioth/src/hv/kvm/x86_64.rs index 90da5ea3..d559586e 100644 --- a/alioth/src/hv/kvm/x86_64.rs +++ b/alioth/src/hv/kvm/x86_64.rs @@ -21,11 +21,11 @@ use crate::hv::kvm::ioctls::{ kvm_check_extension, kvm_create_guest_memfd, kvm_create_irqchip, kvm_enable_cap, kvm_set_identity_map_addr, kvm_set_tss_addr, }; -use crate::hv::kvm::sev::bindings::{KvmSevInit, KVM_SEV_ES_INIT, KVM_SEV_INIT, KVM_SEV_INIT2}; use crate::hv::kvm::sev::SevFd; +use crate::hv::kvm::sev::bindings::{KVM_SEV_ES_INIT, KVM_SEV_INIT, KVM_SEV_INIT2, KvmSevInit}; use crate::hv::kvm::vm::{KvmVm, VmArch}; -use crate::hv::kvm::{kvm_error, Kvm}; -use crate::hv::{error, Coco, Result, VmConfig}; +use crate::hv::kvm::{Kvm, kvm_error}; +use crate::hv::{Coco, Result, VmConfig, error}; impl Kvm { pub(super) fn determine_vm_type(config: &VmConfig) -> Result { @@ -114,8 +114,8 @@ impl Kvm { #[cfg(test)] mod test { - use crate::hv::kvm::{Kvm, KvmConfig}; use crate::hv::Hypervisor; + use crate::hv::kvm::{Kvm, KvmConfig}; #[test] #[cfg_attr(not(feature = "test-hv"), ignore)] diff --git a/alioth/src/loader/firmware/aarch64.rs b/alioth/src/loader/firmware/aarch64.rs index f7a181a1..a663f530 100644 --- a/alioth/src/loader/firmware/aarch64.rs +++ b/alioth/src/loader/firmware/aarch64.rs @@ -15,8 +15,8 @@ use std::path::Path; use crate::loader::{InitState, Result}; -use crate::mem::mapped::ArcMemPages; use crate::mem::Memory; +use crate::mem::mapped::ArcMemPages; pub fn load>(_memory: &Memory, _path: P) -> Result<(InitState, ArcMemPages)> { unimplemented!() diff --git a/alioth/src/loader/firmware/x86_64.rs b/alioth/src/loader/firmware/x86_64.rs index a6af259f..e4523b14 100644 --- a/alioth/src/loader/firmware/x86_64.rs +++ b/alioth/src/loader/firmware/x86_64.rs @@ -21,7 +21,7 @@ use snafu::ResultExt; use crate::arch::layout::MEM_64_START; use crate::arch::reg::{Cr0, DtReg, DtRegVal, Reg, Rflags, SReg, SegAccess, SegReg, SegRegVal}; -use crate::loader::{error, InitState, Result}; +use crate::loader::{InitState, Result, error}; use crate::mem::mapped::ArcMemPages; use crate::mem::{MemRegion, MemRegionType, Memory}; diff --git a/alioth/src/loader/linux/aarch64.rs b/alioth/src/loader/linux/aarch64.rs index 80f6db9d..97e5e92f 100644 --- a/alioth/src/loader/linux/aarch64.rs +++ b/alioth/src/loader/linux/aarch64.rs @@ -21,9 +21,9 @@ use zerocopy::{FromBytes, FromZeros, Immutable, IntoBytes}; use crate::arch::layout::{DEVICE_TREE_START, KERNEL_IMAGE_START}; use crate::arch::reg::{Pstate, Reg}; -use crate::loader::{error, search_initramfs_address, InitState, Result}; -use crate::mem::mapped::RamBus; +use crate::loader::{InitState, Result, error, search_initramfs_address}; use crate::mem::MemRegionEntry; +use crate::mem::mapped::RamBus; #[repr(C)] #[derive(Debug, FromBytes, Immutable, IntoBytes)] diff --git a/alioth/src/loader/linux/x86_64.rs b/alioth/src/loader/linux/x86_64.rs index d6cc1de4..832ad81d 100644 --- a/alioth/src/loader/linux/x86_64.rs +++ b/alioth/src/loader/linux/x86_64.rs @@ -33,10 +33,10 @@ use crate::mem::mapped::RamBus; use crate::mem::{MemRegionEntry, MemRegionType}; use crate::loader::linux::bootparams::{ - BootE820Entry, BootParams, XLoadFlags, E820_ACPI, E820_PMEM, E820_RAM, E820_RESERVED, - MAGIC_AA55, MAGIC_HDRS, SETUP_HEADER_OFFSET, + BootE820Entry, BootParams, E820_ACPI, E820_PMEM, E820_RAM, E820_RESERVED, MAGIC_AA55, + MAGIC_HDRS, SETUP_HEADER_OFFSET, XLoadFlags, }; -use crate::loader::{error, search_initramfs_address, Error, InitState}; +use crate::loader::{Error, InitState, error, search_initramfs_address}; // loading bzImage and ramdisk above 4G in 64bit. const MINIMAL_VERSION: u16 = 0x020c; diff --git a/alioth/src/loader/loader.rs b/alioth/src/loader/loader.rs index a11b8367..9bd94733 100644 --- a/alioth/src/loader/loader.rs +++ b/alioth/src/loader/loader.rs @@ -29,7 +29,7 @@ use snafu::Snafu; #[cfg(target_arch = "x86_64")] use crate::arch::reg::{DtReg, DtRegVal, SegReg, SegRegVal}; use crate::arch::reg::{Reg, SReg}; -use crate::errors::{trace_error, DebugTrace}; +use crate::errors::{DebugTrace, trace_error}; use crate::mem::{MemRegionEntry, MemRegionType}; #[derive(Debug)] diff --git a/alioth/src/loader/xen/xen.rs b/alioth/src/loader/xen/xen.rs index 722565d9..780cc0a9 100644 --- a/alioth/src/loader/xen/xen.rs +++ b/alioth/src/loader/xen/xen.rs @@ -28,14 +28,14 @@ use crate::arch::layout::{ }; use crate::arch::reg::{Cr0, DtReg, DtRegVal, Reg, Rflags, SReg, SegAccess, SegReg, SegRegVal}; use crate::loader::elf::{ - Elf64Header, Elf64Note, Elf64ProgramHeader, Elf64SectionHeader, ELF_HEADER_MAGIC, - ELF_IDENT_CLASS_64, ELF_IDENT_LITTLE_ENDIAN, PT_NOTE, SHT_NOTE, + ELF_HEADER_MAGIC, ELF_IDENT_CLASS_64, ELF_IDENT_LITTLE_ENDIAN, Elf64Header, Elf64Note, + Elf64ProgramHeader, Elf64SectionHeader, PT_NOTE, SHT_NOTE, }; use crate::loader::xen::start_info::{ XEN_HVM_MEMMAP_TYPE_ACPI, XEN_HVM_MEMMAP_TYPE_PMEM, XEN_HVM_MEMMAP_TYPE_RAM, XEN_HVM_MEMMAP_TYPE_RESERVED, XEN_HVM_START_INFO_V1, XEN_HVM_START_MAGIC_VALUE, }; -use crate::loader::{error, search_initramfs_address, InitState, Result}; +use crate::loader::{InitState, Result, error, search_initramfs_address}; use crate::mem::mapped::RamBus; use crate::mem::{MemRegionEntry, MemRegionType}; diff --git a/alioth/src/mem/addressable.rs b/alioth/src/mem/addressable.rs index 7978aba9..d46c96fd 100644 --- a/alioth/src/mem/addressable.rs +++ b/alioth/src/mem/addressable.rs @@ -14,7 +14,7 @@ use std::ops::RangeBounds; -use crate::mem::{error, Result}; +use crate::mem::{Result, error}; pub trait SlotBackend { fn size(&self) -> u64; diff --git a/alioth/src/mem/emulated.rs b/alioth/src/mem/emulated.rs index bc9a2009..ccbf2e47 100644 --- a/alioth/src/mem/emulated.rs +++ b/alioth/src/mem/emulated.rs @@ -222,8 +222,8 @@ mod tests { use parking_lot::Mutex; use rstest::{fixture, rstest}; - use crate::mem::emulated::{Action, Mmio, MmioBus}; use crate::mem::Result; + use crate::mem::emulated::{Action, Mmio, MmioBus}; #[derive(Debug)] struct TestRange { @@ -235,10 +235,12 @@ mod tests { fn size(&self) -> u64 { self.size } + fn read(&self, offset: u64, _size: u8) -> Result { let val = *self.val.lock() >> (offset << 3); Ok(val) } + fn write(&self, offset: u64, size: u8, val: u64) -> Result { assert_eq!(size.count_ones(), 1); assert!(offset.trailing_zeros() >= size.trailing_zeros()); diff --git a/alioth/src/mem/mapped.rs b/alioth/src/mem/mapped.rs index d4080cc9..610bd678 100644 --- a/alioth/src/mem/mapped.rs +++ b/alioth/src/mem/mapped.rs @@ -22,22 +22,22 @@ use std::mem::{align_of, size_of}; #[cfg(target_os = "linux")] use std::os::fd::FromRawFd; use std::os::fd::{AsFd, AsRawFd, BorrowedFd}; -use std::ptr::{null_mut, NonNull}; +use std::ptr::{NonNull, null_mut}; use std::sync::Arc; -use libc::{ - c_void, madvise, mmap, msync, munmap, MAP_ANONYMOUS, MAP_FAILED, MAP_PRIVATE, MAP_SHARED, - MS_ASYNC, PROT_EXEC, PROT_READ, PROT_WRITE, -}; #[cfg(target_os = "linux")] use libc::{MADV_HUGEPAGE, MFD_CLOEXEC}; +use libc::{ + MAP_ANONYMOUS, MAP_FAILED, MAP_PRIVATE, MAP_SHARED, MS_ASYNC, PROT_EXEC, PROT_READ, PROT_WRITE, + c_void, madvise, mmap, msync, munmap, +}; use parking_lot::{RwLock, RwLockReadGuard}; use snafu::ResultExt; use zerocopy::{FromBytes, Immutable, IntoBytes}; use crate::ffi; use crate::mem::addressable::{Addressable, SlotBackend}; -use crate::mem::{error, Error, Result}; +use crate::mem::{Error, Result, error}; #[derive(Debug)] struct MemPages { @@ -227,6 +227,7 @@ struct Iter<'m> { impl<'m> Iterator for Iter<'m> { type Item = Result<&'m [u8]>; + fn next(&mut self) -> Option { if self.remain == 0 { return None; @@ -248,6 +249,7 @@ struct IterMut<'m> { impl<'m> Iterator for IterMut<'m> { type Item = Result<&'m mut [u8]>; + fn next(&mut self) -> Option { if self.remain == 0 { return None; diff --git a/alioth/src/mem/mem.rs b/alioth/src/mem/mem.rs index adddf83c..a95da732 100644 --- a/alioth/src/mem/mem.rs +++ b/alioth/src/mem/mem.rs @@ -25,7 +25,7 @@ use serde::Deserialize; use serde_aco::Help; use snafu::Snafu; -use crate::errors::{trace_error, DebugTrace}; +use crate::errors::{DebugTrace, trace_error}; use crate::hv::{MemMapOption, VmEntry, VmMemory}; use self::addressable::{Addressable, SlotBackend}; diff --git a/alioth/src/net/net.rs b/alioth/src/net/net.rs index 6b340734..065931e2 100644 --- a/alioth/src/net/net.rs +++ b/alioth/src/net/net.rs @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -use serde::de::{self, Visitor}; use serde::Deserialize; +use serde::de::{self, Visitor}; use serde_aco::{Help, TypedHelp}; use zerocopy::{FromBytes, Immutable, IntoBytes}; @@ -69,8 +69,8 @@ impl<'de> Deserialize<'de> for MacAddr { #[cfg(test)] mod test { - use serde::de::value::Error; use serde::de::Visitor; + use serde::de::value::Error; use crate::net::MacAddr; @@ -82,14 +82,20 @@ mod test { MacAddrVisitor.visit_borrowed_str::("ea:d7:a8:e8:c6:2f"), Ok(MacAddr([0xea, 0xd7, 0xa8, 0xe8, 0xc6, 0x2f])) ); - assert!(MacAddrVisitor - .visit_borrowed_str::("ea:d7:a8:e8:c6") - .is_err()); - assert!(MacAddrVisitor - .visit_borrowed_str::("ea:d7:a8:e8:c6:ac:ac") - .is_err()); - assert!(MacAddrVisitor - .visit_borrowed_str::("ea:d7:a8:e8:c6:2g") - .is_err()); + assert!( + MacAddrVisitor + .visit_borrowed_str::("ea:d7:a8:e8:c6") + .is_err() + ); + assert!( + MacAddrVisitor + .visit_borrowed_str::("ea:d7:a8:e8:c6:ac:ac") + .is_err() + ); + assert!( + MacAddrVisitor + .visit_borrowed_str::("ea:d7:a8:e8:c6:2g") + .is_err() + ); } } diff --git a/alioth/src/pci/bus.rs b/alioth/src/pci/bus.rs index ce6b17e4..c1690c04 100644 --- a/alioth/src/pci/bus.rs +++ b/alioth/src/pci/bus.rs @@ -14,8 +14,8 @@ use std::collections::HashMap; use std::iter::zip; -use std::sync::atomic::{AtomicU32, Ordering}; use std::sync::Arc; +use std::sync::atomic::{AtomicU32, Ordering}; use bitfield::bitfield; use parking_lot::{Mutex, RwLock}; diff --git a/alioth/src/pci/cap.rs b/alioth/src/pci/cap.rs index c067b4bd..87a3095d 100644 --- a/alioth/src/pci/cap.rs +++ b/alioth/src/pci/cap.rs @@ -23,8 +23,8 @@ use zerocopy::{FromBytes, Immutable, IntoBytes, KnownLayout}; use crate::hv::IrqFd; use crate::mem::addressable::SlotBackend; use crate::mem::emulated::{Action, Mmio, MmioBus}; -use crate::pci::config::{DeviceHeader, PciConfigArea}; use crate::pci::Error; +use crate::pci::config::{DeviceHeader, PciConfigArea}; use crate::utils::truncate_u64; use crate::{align_up, impl_mmio_for_zerocopy, mem}; @@ -70,6 +70,7 @@ impl Mmio for NullCap { fn write(&self, _offset: u64, _size: u8, _val: u64) -> mem::Result { Ok(Action::None) } + fn size(&self) -> u64 { self.size as u64 } @@ -255,6 +256,7 @@ impl Mmio for PciCapList { impl TryFrom>> for PciCapList { type Error = Error; + fn try_from(caps: Vec>) -> Result { let mut bus = MmioBus::new(); let mut ptr = size_of::() as u64; @@ -342,8 +344,11 @@ where F: IrqFd, { impl_msix_table_mmio_entry_method!(addr_lo, get_addr_lo, set_addr_lo); + impl_msix_table_mmio_entry_method!(addr_hi, get_addr_hi, set_addr_hi); + impl_msix_table_mmio_entry_method!(data, get_data, set_data); + fn set_masked(&mut self, val: bool) -> mem::Result { match self { MsixTableMmioEntry::Entry(e) => { @@ -357,6 +362,7 @@ where } } } + pub fn get_masked(&self) -> bool { match self { MsixTableMmioEntry::Entry(e) => e.control.masked(), diff --git a/alioth/src/pci/config.rs b/alioth/src/pci/config.rs index 80f329c5..941691f2 100644 --- a/alioth/src/pci/config.rs +++ b/alioth/src/pci/config.rs @@ -364,13 +364,15 @@ impl HeaderData { let lo_32 = header.bars[bar_index - 1] as u64; Some(Box::new(MoveBarCallback { bdf, - src: lo_32 | (old_val as u64) << 32, - dst: lo_32 | (masked_val as u64) << 32, + src: lo_32 | ((old_val as u64) << 32), + dst: lo_32 | ((masked_val as u64) << 32), })) } _ => { header.bars[bar_index] = masked_val; - log::info!("{bdf}: bar {bar_index}: write {val:#010x}, update: {old_val:#010x} -> {masked_val:#010x}"); + log::info!( + "{bdf}: bar {bar_index}: write {val:#010x}, update: {old_val:#010x} -> {masked_val:#010x}" + ); None } } diff --git a/alioth/src/pci/pci.rs b/alioth/src/pci/pci.rs index d5ccc992..8f2725e3 100644 --- a/alioth/src/pci/pci.rs +++ b/alioth/src/pci/pci.rs @@ -25,11 +25,11 @@ use bitfield::bitfield; use parking_lot::RwLock; use snafu::Snafu; -use crate::errors::{trace_error, DebugTrace}; +use crate::errors::{DebugTrace, trace_error}; use crate::mem; use crate::mem::{IoRegion, MemRegion, MemRegionCallback}; -use self::config::{HeaderData, PciConfig, BAR_MEM64}; +use self::config::{BAR_MEM64, HeaderData, PciConfig}; bitfield! { #[derive(Copy, Clone, Default, PartialEq, Eq, Hash, PartialOrd, Ord)] diff --git a/alioth/src/utils/ioctls.rs b/alioth/src/utils/ioctls.rs index 86057412..b3f9f0d0 100644 --- a/alioth/src/utils/ioctls.rs +++ b/alioth/src/utils/ioctls.rs @@ -51,11 +51,9 @@ macro_rules! ioctl_none { ($name:ident, $type_:expr, $nr:expr, $val:expr) => { #[allow(clippy::missing_safety_doc)] pub unsafe fn $name(fd: &F) -> ::std::io::Result { - $crate::ffi!(::libc::ioctl( - fd.as_raw_fd(), - $crate::utils::ioctls::ioctl_io($type_, $nr) as _, - $val as ::libc::c_ulong, - )) + let op = $crate::utils::ioctls::ioctl_io($type_, $nr); + let v = $val as ::libc::c_ulong; + $crate::ffi!(unsafe { ::libc::ioctl(fd.as_raw_fd(), op as _, v,) }) } }; ($name:ident, $type_:expr, $nr:expr) => { @@ -71,7 +69,8 @@ macro_rules! ioctl_write_val { fd: &F, val: ::libc::c_ulong, ) -> ::std::io::Result { - $crate::ffi!(::libc::ioctl(fd.as_raw_fd(), $code as _, val)) + let op = $code; + $crate::ffi!(unsafe { ::libc::ioctl(fd.as_raw_fd(), op as _, val) }) } }; ($name:ident, $code:expr, $ty:ty) => { @@ -80,7 +79,8 @@ macro_rules! ioctl_write_val { fd: &F, val: $ty, ) -> ::std::io::Result { - $crate::ffi!(::libc::ioctl(fd.as_raw_fd(), $code as _, val)) + let op = $code; + $crate::ffi!(unsafe { ::libc::ioctl(fd.as_raw_fd(), op as _, val) }) } }; } @@ -93,7 +93,8 @@ macro_rules! ioctl_write_ptr { fd: &F, val: &$ty, ) -> ::std::io::Result { - $crate::ffi!(::libc::ioctl(fd.as_raw_fd(), $code as _, val as *const $ty)) + let op = $code; + $crate::ffi!(unsafe { ::libc::ioctl(fd.as_raw_fd(), op as _, val as *const $ty) }) } }; @@ -103,11 +104,8 @@ macro_rules! ioctl_write_ptr { fd: &F, val: &$ty, ) -> ::std::io::Result { - $crate::ffi!(::libc::ioctl( - fd.as_raw_fd(), - $crate::utils::ioctls::ioctl_iow::<$ty>($type_, $nr) as _, - val as *const $ty, - )) + let op = $crate::utils::ioctls::ioctl_iow::<$ty>($type_, $nr); + $crate::ffi!(unsafe { ::libc::ioctl(fd.as_raw_fd(), op as _, val as *const $ty,) }) } }; } @@ -120,11 +118,8 @@ macro_rules! ioctl_write_buf { fd: &F, val: &$ty, ) -> ::std::io::Result { - $crate::ffi!(::libc::ioctl( - fd.as_raw_fd(), - $code as _, - val as *const $ty - )) + let op = $code; + $crate::ffi!(unsafe { ::libc::ioctl(fd.as_raw_fd(), op as _, val as *const $ty) }) } }; ($name:ident, $type_:expr, $nr:expr, $ty:ident) => { @@ -144,7 +139,8 @@ macro_rules! ioctl_writeread { fd: &F, val: &mut $ty, ) -> ::std::io::Result { - $crate::ffi!(::libc::ioctl(fd.as_raw_fd(), $code as _, val as *mut $ty)) + let op = $code; + $crate::ffi!(unsafe { ::libc::ioctl(fd.as_raw_fd(), op as _, val as *mut $ty) }) } }; ($name:ident, $type_:expr, $nr:expr, $ty:ty) => { @@ -160,7 +156,8 @@ macro_rules! ioctl_writeread { fd: &F, val: &mut T, ) -> ::std::io::Result { - $crate::ffi!(::libc::ioctl(fd.as_raw_fd(), $code as _, val as *mut T)) + let op = $code; + $crate::ffi!(unsafe { ::libc::ioctl(fd.as_raw_fd(), op as _, val as *mut T) }) } }; } @@ -173,11 +170,8 @@ macro_rules! ioctl_writeread_buf { fd: &F, val: &mut $ty, ) -> ::std::io::Result { - $crate::ffi!(::libc::ioctl( - fd.as_raw_fd(), - $crate::utils::ioctls::ioctl_iowr::<$ty<0>>($type_, $nr) as _, - val as *mut $ty, - )) + let op = $crate::utils::ioctls::ioctl_iowr::<$ty<0>>($type_, $nr); + $crate::ffi!(unsafe { ::libc::ioctl(fd.as_raw_fd(), op as _, val as *mut $ty,) }) } }; } @@ -196,12 +190,9 @@ macro_rules! ioctl_read { #[allow(clippy::missing_safety_doc)] pub unsafe fn $name(fd: &F) -> ::std::io::Result<$ty> { let mut val = ::core::mem::MaybeUninit::<$ty>::uninit(); - $crate::ffi!(::libc::ioctl( - fd.as_raw_fd(), - $crate::utils::ioctls::ioctl_ior::<$ty>($type_, $nr) as _, - val.as_mut_ptr() - ))?; - ::std::io::Result::Ok(val.assume_init()) + let op = $crate::utils::ioctls::ioctl_ior::<$ty>($type_, $nr); + $crate::ffi!(unsafe { ::libc::ioctl(fd.as_raw_fd(), op as _, val.as_mut_ptr(),) })?; + ::std::io::Result::Ok(unsafe { val.assume_init() }) } }; } diff --git a/alioth/src/utils/utils.rs b/alioth/src/utils/utils.rs index ee3be552..ad238931 100644 --- a/alioth/src/utils/utils.rs +++ b/alioth/src/utils/utils.rs @@ -19,7 +19,7 @@ pub mod ioctls; use std::sync::atomic::{AtomicU64, Ordering}; pub fn truncate_u64(val: u64, size: u64) -> u64 { - val & u64::MAX >> (64 - (size << 3)) + val & (u64::MAX >> (64 - (size << 3))) } #[macro_export] diff --git a/alioth/src/vfio/cdev.rs b/alioth/src/vfio/cdev.rs index b7450135..66e08462 100644 --- a/alioth/src/vfio/cdev.rs +++ b/alioth/src/vfio/cdev.rs @@ -29,7 +29,7 @@ use crate::vfio::ioctls::{ vfio_device_attach_iommufd_pt, vfio_device_bind_iommufd, vfio_device_detach_iommufd_pt, }; use crate::vfio::iommu::Ioas; -use crate::vfio::{error, Result}; +use crate::vfio::{Result, error}; #[derive(Debug)] pub struct Cdev { diff --git a/alioth/src/vfio/container.rs b/alioth/src/vfio/container.rs index 2f4ac408..452b2887 100644 --- a/alioth/src/vfio/container.rs +++ b/alioth/src/vfio/container.rs @@ -27,7 +27,7 @@ use crate::vfio::bindings::{ VfioDmaMapFlag, VfioDmaUnmapFlag, VfioIommu, VfioIommuType1DmaMap, VfioIommuType1DmaUnmap, }; use crate::vfio::ioctls::{vfio_iommu_map_dma, vfio_iommu_unmap_dma, vfio_set_iommu}; -use crate::vfio::{error, Result}; +use crate::vfio::{Result, error}; #[derive(Debug)] pub struct Container { diff --git a/alioth/src/vfio/device.rs b/alioth/src/vfio/device.rs index 50b155f2..68c364fc 100644 --- a/alioth/src/vfio/device.rs +++ b/alioth/src/vfio/device.rs @@ -19,6 +19,7 @@ use std::os::fd::AsRawFd; use std::os::unix::fs::FileExt; use crate::mem; +use crate::vfio::Result; use crate::vfio::bindings::{ VfioDeviceInfo, VfioIrqInfo, VfioIrqSet, VfioIrqSetData, VfioIrqSetFlag, VfioPciIrq, VfioRegionInfo, @@ -27,7 +28,6 @@ use crate::vfio::ioctls::{ vfio_device_get_info, vfio_device_get_irq_info, vfio_device_get_region_info, vfio_device_reset, vfio_device_set_irqs, }; -use crate::vfio::Result; pub trait Device: Debug + Send + Sync + 'static { fn fd(&self) -> &File; diff --git a/alioth/src/vfio/group.rs b/alioth/src/vfio/group.rs index f3886f32..a7a44789 100644 --- a/alioth/src/vfio/group.rs +++ b/alioth/src/vfio/group.rs @@ -26,7 +26,7 @@ use crate::vfio::device::Device; use crate::vfio::ioctls::{ vfio_group_get_device_fd, vfio_group_set_container, vfio_group_unset_container, }; -use crate::vfio::{error, Result}; +use crate::vfio::{Result, error}; #[derive(Debug)] pub struct Group { diff --git a/alioth/src/vfio/ioctls.rs b/alioth/src/vfio/ioctls.rs index c5e0773b..6681a8b7 100644 --- a/alioth/src/vfio/ioctls.rs +++ b/alioth/src/vfio/ioctls.rs @@ -14,10 +14,10 @@ use crate::utils::ioctls::ioctl_io; use crate::vfio::bindings::{ - IommuDestroy, IommuIoasAlloc, IommuIoasMap, IommuIoasUnmap, VfioDeviceAttachIommufdPt, - VfioDeviceBindIommufd, VfioDeviceDetachIommufdPt, VfioDeviceInfo, VfioIommu, - VfioIommuType1DmaMap, VfioIommuType1DmaUnmap, VfioIrqInfo, VfioIrqSet, VfioRegionInfo, - IOMMUFD_TYPE, VFIO_TYPE, + IOMMUFD_TYPE, IommuDestroy, IommuIoasAlloc, IommuIoasMap, IommuIoasUnmap, VFIO_TYPE, + VfioDeviceAttachIommufdPt, VfioDeviceBindIommufd, VfioDeviceDetachIommufdPt, VfioDeviceInfo, + VfioIommu, VfioIommuType1DmaMap, VfioIommuType1DmaUnmap, VfioIrqInfo, VfioIrqSet, + VfioRegionInfo, }; use crate::{ioctl_none, ioctl_write_buf, ioctl_write_ptr, ioctl_write_val, ioctl_writeread}; diff --git a/alioth/src/vfio/iommu.rs b/alioth/src/vfio/iommu.rs index 0ae8231d..715d08b0 100644 --- a/alioth/src/vfio/iommu.rs +++ b/alioth/src/vfio/iommu.rs @@ -27,7 +27,7 @@ use crate::vfio::bindings::{ IommuDestroy, IommuIoasAlloc, IommuIoasMap, IommuIoasMapFlag, IommuIoasUnmap, }; use crate::vfio::ioctls::{iommu_destroy, iommu_ioas_alloc, iommu_ioas_map, iommu_ioas_unmap}; -use crate::vfio::{error, Result}; +use crate::vfio::{Result, error}; #[derive(Debug)] pub struct Iommu { diff --git a/alioth/src/vfio/pci.rs b/alioth/src/vfio/pci.rs index 3ab9ac0a..7c8765f5 100644 --- a/alioth/src/vfio/pci.rs +++ b/alioth/src/vfio/pci.rs @@ -19,14 +19,14 @@ use std::mem::size_of; use std::ops::Range; use std::os::fd::{AsFd, AsRawFd}; use std::os::unix::fs::FileExt; -use std::sync::atomic::AtomicU64; use std::sync::Arc; +use std::sync::atomic::AtomicU64; use libc::{PROT_READ, PROT_WRITE}; use macros::Layout; use parking_lot::{Mutex, RwLock}; use snafu::ResultExt; -use zerocopy::{transmute, FromBytes, Immutable, IntoBytes}; +use zerocopy::{FromBytes, Immutable, IntoBytes, transmute}; use crate::errors::boxed_debug_trace; use crate::hv::{IrqFd, MsiSender}; @@ -38,8 +38,8 @@ use crate::pci::cap::{ NullCap, PciCapHdr, PciCapId, }; use crate::pci::config::{ - Command, CommonHeader, ConfigHeader, DeviceHeader, EmulatedHeader, HeaderData, HeaderType, - PciConfig, PciConfigArea, Status, BAR_IO, BAR_MEM64, + BAR_IO, BAR_MEM64, Command, CommonHeader, ConfigHeader, DeviceHeader, EmulatedHeader, + HeaderData, HeaderType, PciConfig, PciConfigArea, Status, }; use crate::pci::{self, Bdf, Pci, PciBar}; use crate::vfio::bindings::{ @@ -47,7 +47,7 @@ use crate::vfio::bindings::{ VfioRegionInfoFlag, }; use crate::vfio::device::Device; -use crate::vfio::{error, Result}; +use crate::vfio::{Result, error}; use crate::{align_down, align_up, impl_mmio_for_zerocopy, mem}; fn round_up_range(range: Range) -> Range { @@ -222,9 +222,11 @@ where fn size(&self) -> u64 { self.size } + fn read(&self, offset: u64, size: u8) -> mem::Result { self.dev.dev.read(self.offset + offset, size) } + fn write(&self, offset: u64, size: u8, val: u64) -> mem::Result { self.dev.dev.write(self.offset + offset, size, val)?; Ok(Action::None) @@ -743,7 +745,10 @@ where 0xffff }; let (addr, msg) = if ctrl.addr_64_cap() { - ((data[1] as u64) << 32 | data[0] as u64, data[2] & msg_mask) + ( + ((data[1] as u64) << 32) | data[0] as u64, + data[2] & msg_mask, + ) } else { (data[0] as u64, data[1] & msg_mask) }; diff --git a/alioth/src/vfio/vfio.rs b/alioth/src/vfio/vfio.rs index 6134804f..f15c188f 100644 --- a/alioth/src/vfio/vfio.rs +++ b/alioth/src/vfio/vfio.rs @@ -27,7 +27,7 @@ use serde::Deserialize; use serde_aco::Help; use snafu::Snafu; -use crate::errors::{trace_error, DebugTrace}; +use crate::errors::{DebugTrace, trace_error}; use self::bindings::VfioIommu; diff --git a/alioth/src/virtio/dev/balloon.rs b/alioth/src/virtio/dev/balloon.rs index 36cc74d9..5b5ece09 100644 --- a/alioth/src/virtio/dev/balloon.rs +++ b/alioth/src/virtio/dev/balloon.rs @@ -14,15 +14,15 @@ use std::fmt::Debug; use std::io::{IoSlice, IoSliceMut}; -use std::sync::mpsc::Receiver; use std::sync::Arc; +use std::sync::mpsc::Receiver; use std::thread::JoinHandle; use bitflags::bitflags; -use libc::{sysconf, _SC_PAGESIZE}; +use libc::{_SC_PAGESIZE, sysconf}; use macros::Layout; -use mio::event::Event; use mio::Registry; +use mio::event::Event; use parking_lot::RwLock; use serde::Deserialize; use serde_aco::Help; @@ -34,9 +34,9 @@ use crate::mem::mapped::{Ram, RamBus}; use crate::virtio::dev::{DevParam, DeviceId, Virtio, WakeEvent}; use crate::virtio::queue::handlers::handle_desc; use crate::virtio::queue::{Queue, VirtQueue}; -use crate::virtio::worker::mio::{ActiveMio, Mio, VirtioMio}; use crate::virtio::worker::Waker; -use crate::virtio::{IrqSender, Result, FEATURE_BUILT_IN}; +use crate::virtio::worker::mio::{ActiveMio, Mio, VirtioMio}; +use crate::virtio::{FEATURE_BUILT_IN, IrqSender, Result}; use crate::{c_enum, ffi, impl_mmio_for_zerocopy, mem}; #[repr(C, align(8))] @@ -190,11 +190,11 @@ impl Balloon { } impl Virtio for Balloon { - const DEVICE_ID: DeviceId = DeviceId::Balloon; - type Config = BalloonConfigMmio; type Feature = BalloonFeature; + const DEVICE_ID: DeviceId = DeviceId::Balloon; + fn name(&self) -> &str { &self.name } @@ -310,6 +310,7 @@ pub struct BalloonParam { impl DevParam for BalloonParam { type Device = Balloon; + fn build(self, name: impl Into>) -> Result { Balloon::new(self, name) } diff --git a/alioth/src/virtio/dev/blk.rs b/alioth/src/virtio/dev/blk.rs index 34921e3c..8d111d52 100644 --- a/alioth/src/virtio/dev/blk.rs +++ b/alioth/src/virtio/dev/blk.rs @@ -18,8 +18,8 @@ use std::io::{IoSlice, IoSliceMut, Read, Write}; use std::os::fd::AsRawFd; use std::os::unix::fs::FileExt; use std::path::PathBuf; -use std::sync::mpsc::Receiver; use std::sync::Arc; +use std::sync::mpsc::Receiver; use std::thread::JoinHandle; use bitflags::bitflags; @@ -29,8 +29,8 @@ use io_uring::cqueue::Entry as Cqe; use io_uring::opcode; #[cfg(target_os = "linux")] use io_uring::types::Fd; -use mio::event::Event; use mio::Registry; +use mio::event::Event; use serde::Deserialize; use serde_aco::Help; use snafu::ResultExt; @@ -47,7 +47,7 @@ use crate::virtio::queue::{Descriptor, Queue, VirtQueue}; use crate::virtio::worker::io_uring::{BufferAction, IoUring, VirtioIoUring}; use crate::virtio::worker::mio::{ActiveMio, Mio, VirtioMio}; use crate::virtio::worker::{Waker, WorkerApi}; -use crate::virtio::{error, DeviceId, IrqSender, Result, FEATURE_BUILT_IN}; +use crate::virtio::{DeviceId, FEATURE_BUILT_IN, IrqSender, Result, error}; use crate::{c_enum, impl_mmio_for_zerocopy}; c_enum! { @@ -277,11 +277,11 @@ impl Block { } impl Virtio for Block { - const DEVICE_ID: DeviceId = DeviceId::Block; - type Config = BlockConfig; type Feature = BlockFeature; + const DEVICE_ID: DeviceId = DeviceId::Block; + fn name(&self) -> &str { &self.name } diff --git a/alioth/src/virtio/dev/dev.rs b/alioth/src/virtio/dev/dev.rs index 2aaea8c1..411885f2 100644 --- a/alioth/src/virtio/dev/dev.rs +++ b/alioth/src/virtio/dev/dev.rs @@ -25,9 +25,9 @@ pub mod net; pub mod vsock; use std::fmt::Debug; -use std::sync::atomic::{AtomicU16, AtomicU64, AtomicU8}; -use std::sync::mpsc::{self, Receiver, Sender}; use std::sync::Arc; +use std::sync::atomic::{AtomicU8, AtomicU16, AtomicU64}; +use std::sync::mpsc::{self, Receiver, Sender}; use std::thread::JoinHandle; use bitflags::Flags; @@ -38,9 +38,9 @@ use crate::mem::emulated::Mmio; use crate::mem::mapped::{Ram, RamBus}; use crate::mem::{LayoutChanged, LayoutUpdated, MemRegion}; use crate::virtio::queue::split::SplitQueue; -use crate::virtio::queue::{Queue, VirtQueue, QUEUE_SIZE_MAX}; +use crate::virtio::queue::{QUEUE_SIZE_MAX, Queue, VirtQueue}; use crate::virtio::worker::Waker; -use crate::virtio::{error, DeviceId, IrqSender, Result, VirtioFeature}; +use crate::virtio::{DeviceId, IrqSender, Result, VirtioFeature, error}; pub trait Virtio: Debug + Send + Sync + 'static { const DEVICE_ID: DeviceId; diff --git a/alioth/src/virtio/dev/entropy.rs b/alioth/src/virtio/dev/entropy.rs index 1762f4d2..6218a22f 100644 --- a/alioth/src/virtio/dev/entropy.rs +++ b/alioth/src/virtio/dev/entropy.rs @@ -15,14 +15,14 @@ use std::fmt::Debug; use std::fs::{File, OpenOptions}; use std::os::unix::prelude::OpenOptionsExt; -use std::sync::mpsc::Receiver; use std::sync::Arc; +use std::sync::mpsc::Receiver; use std::thread::JoinHandle; use bitflags::bitflags; use libc::O_NONBLOCK; -use mio::event::Event; use mio::Registry; +use mio::event::Event; use snafu::ResultExt; use crate::hv::IoeventFd; @@ -32,9 +32,9 @@ use crate::mem::mapped::RamBus; use crate::virtio::dev::{DevParam, DeviceId, Virtio, WakeEvent}; use crate::virtio::queue::handlers::reader_to_queue; use crate::virtio::queue::{Queue, VirtQueue}; -use crate::virtio::worker::mio::{ActiveMio, Mio, VirtioMio}; use crate::virtio::worker::Waker; -use crate::virtio::{error, IrqSender, Result, FEATURE_BUILT_IN}; +use crate::virtio::worker::mio::{ActiveMio, Mio, VirtioMio}; +use crate::virtio::{FEATURE_BUILT_IN, IrqSender, Result, error}; #[derive(Debug, Clone)] pub struct EntropyConfig; @@ -80,11 +80,11 @@ impl Entropy { } impl Virtio for Entropy { - const DEVICE_ID: DeviceId = DeviceId::Entropy; - type Config = EntropyConfig; type Feature = EntropyFeature; + const DEVICE_ID: DeviceId = DeviceId::Entropy; + fn name(&self) -> &str { &self.name } @@ -158,6 +158,7 @@ pub struct EntropyParam; impl DevParam for EntropyParam { type Device = Entropy; + fn build(self, name: impl Into>) -> Result { Entropy::new(name) } diff --git a/alioth/src/virtio/dev/fs.rs b/alioth/src/virtio/dev/fs.rs index 2d8ce220..dc179ffc 100644 --- a/alioth/src/virtio/dev/fs.rs +++ b/alioth/src/virtio/dev/fs.rs @@ -17,15 +17,15 @@ use std::iter::zip; use std::mem::size_of_val; use std::os::fd::{AsRawFd, FromRawFd, OwnedFd}; use std::path::PathBuf; +use std::sync::Arc; use std::sync::atomic::Ordering; use std::sync::mpsc::Receiver; -use std::sync::Arc; use std::thread::JoinHandle; use bitflags::bitflags; use libc::{ - eventfd, mmap, EFD_CLOEXEC, EFD_NONBLOCK, MAP_ANONYMOUS, MAP_FAILED, MAP_FIXED, MAP_PRIVATE, - MAP_SHARED, PROT_NONE, + EFD_CLOEXEC, EFD_NONBLOCK, MAP_ANONYMOUS, MAP_FAILED, MAP_FIXED, MAP_PRIVATE, MAP_SHARED, + PROT_NONE, eventfd, mmap, }; use mio::event::Event; use mio::unix::SourceFd; @@ -40,11 +40,11 @@ use crate::mem::{LayoutChanged, MemRegion, MemRegionType}; use crate::virtio::dev::{DevParam, Virtio, WakeEvent}; use crate::virtio::queue::{Queue, VirtQueue}; use crate::virtio::vu::{ - error as vu_error, DeviceConfig, Error, UpdateVuMem, VirtqAddr, VirtqState, VuDev, VuFeature, + DeviceConfig, Error, UpdateVuMem, VirtqAddr, VirtqState, VuDev, VuFeature, error as vu_error, }; -use crate::virtio::worker::mio::{ActiveMio, Mio, VirtioMio}; use crate::virtio::worker::Waker; -use crate::virtio::{error, DeviceId, IrqSender, Result, VirtioFeature}; +use crate::virtio::worker::mio::{ActiveMio, Mio, VirtioMio}; +use crate::virtio::{DeviceId, IrqSender, Result, VirtioFeature, error}; use crate::{align_up, ffi, impl_mmio_for_zerocopy}; #[repr(C, align(4))] @@ -182,10 +182,11 @@ impl DevParam for VuFsParam { } impl Virtio for VuFs { - const DEVICE_ID: DeviceId = DeviceId::FileSystem; type Config = FsConfig; type Feature = FsFeature; + const DEVICE_ID: DeviceId = DeviceId::FileSystem; + fn name(&self) -> &str { &self.name } diff --git a/alioth/src/virtio/dev/net/net.rs b/alioth/src/virtio/dev/net/net.rs index 245b4ebb..3afd7983 100644 --- a/alioth/src/virtio/dev/net/net.rs +++ b/alioth/src/virtio/dev/net/net.rs @@ -22,8 +22,8 @@ use std::num::NonZeroU16; use std::os::fd::AsRawFd; use std::os::unix::prelude::OpenOptionsExt; use std::path::{Path, PathBuf}; -use std::sync::mpsc::Receiver; use std::sync::Arc; +use std::sync::mpsc::Receiver; use std::thread::JoinHandle; use bitflags::bitflags; @@ -47,10 +47,10 @@ use crate::virtio::queue::{Descriptor, Queue, VirtQueue}; use crate::virtio::worker::io_uring::{BufferAction, IoUring, VirtioIoUring}; use crate::virtio::worker::mio::{ActiveMio, Mio, VirtioMio}; use crate::virtio::worker::{Waker, WorkerApi}; -use crate::virtio::{error, IrqSender, FEATURE_BUILT_IN}; +use crate::virtio::{FEATURE_BUILT_IN, IrqSender, error}; use crate::{c_enum, impl_mmio_for_zerocopy}; -use self::tap::{tun_set_iff, tun_set_offload, tun_set_vnet_hdr_sz, TunFeature}; +use self::tap::{TunFeature, tun_set_iff, tun_set_offload, tun_set_vnet_hdr_sz}; #[repr(C, align(8))] #[derive(Debug, Default, FromBytes, Immutable, IntoBytes)] @@ -290,11 +290,11 @@ impl Net { } impl Virtio for Net { - const DEVICE_ID: DeviceId = DeviceId::Net; - type Config = NetConfig; type Feature = NetFeature; + const DEVICE_ID: DeviceId = DeviceId::Net; + fn name(&self) -> &str { &self.name } diff --git a/alioth/src/virtio/dev/vsock/vhost_vsock.rs b/alioth/src/virtio/dev/vsock/vhost_vsock.rs index e63b7726..70789b8c 100644 --- a/alioth/src/virtio/dev/vsock/vhost_vsock.rs +++ b/alioth/src/virtio/dev/vsock/vhost_vsock.rs @@ -15,12 +15,12 @@ use std::iter::zip; use std::os::fd::{AsRawFd, FromRawFd, OwnedFd}; use std::path::PathBuf; +use std::sync::Arc; use std::sync::atomic::Ordering; use std::sync::mpsc::Receiver; -use std::sync::Arc; use std::thread::JoinHandle; -use libc::{eventfd, EFD_CLOEXEC, EFD_NONBLOCK}; +use libc::{EFD_CLOEXEC, EFD_NONBLOCK, eventfd}; use mio::event::Event; use mio::unix::SourceFd; use mio::{Interest, Registry, Token}; @@ -29,15 +29,15 @@ use serde_aco::Help; use crate::ffi; use crate::hv::IoeventFd; -use crate::mem::mapped::RamBus; use crate::mem::LayoutUpdated; +use crate::mem::mapped::RamBus; use crate::virtio::dev::vsock::{VsockConfig, VsockFeature}; use crate::virtio::dev::{DevParam, DeviceId, Virtio, WakeEvent}; use crate::virtio::queue::{Queue, VirtQueue}; -use crate::virtio::vhost::bindings::{VirtqAddr, VirtqFile, VirtqState, VHOST_FILE_UNBIND}; -use crate::virtio::vhost::{error, UpdateVsockMem, VhostDev}; -use crate::virtio::worker::mio::{ActiveMio, Mio, VirtioMio}; +use crate::virtio::vhost::bindings::{VHOST_FILE_UNBIND, VirtqAddr, VirtqFile, VirtqState}; +use crate::virtio::vhost::{UpdateVsockMem, VhostDev, error}; use crate::virtio::worker::Waker; +use crate::virtio::worker::mio::{ActiveMio, Mio, VirtioMio}; use crate::virtio::{IrqSender, Result, VirtioFeature}; #[derive(Debug, Clone, Deserialize, Help)] @@ -50,6 +50,7 @@ pub struct VhostVsockParam { impl DevParam for VhostVsockParam { type Device = VhostVsock; + fn build(self, name: impl Into>) -> Result { VhostVsock::new(self, name) } @@ -100,11 +101,11 @@ impl VhostVsock { } impl Virtio for VhostVsock { - const DEVICE_ID: DeviceId = DeviceId::Socket; - type Config = VsockConfig; type Feature = VsockFeature; + const DEVICE_ID: DeviceId = DeviceId::Socket; + fn name(&self) -> &str { &self.name } diff --git a/alioth/src/virtio/pci.rs b/alioth/src/virtio/pci.rs index 4cc4a071..e7df475f 100644 --- a/alioth/src/virtio/pci.rs +++ b/alioth/src/virtio/pci.rs @@ -15,9 +15,9 @@ use std::marker::PhantomData; use std::mem::size_of; use std::os::fd::{AsFd, AsRawFd, RawFd}; +use std::sync::Arc; use std::sync::atomic::{AtomicU16, Ordering}; use std::sync::mpsc::Sender; -use std::sync::Arc; use macros::Layout; use parking_lot::{Mutex, RwLock}; @@ -31,8 +31,8 @@ use crate::pci::cap::{ MsixTableMmioEntry, PciCap, PciCapHdr, PciCapId, PciCapList, }; use crate::pci::config::{ - CommonHeader, DeviceHeader, EmulatedConfig, HeaderType, PciConfig, PciConfigArea, BAR_MEM32, - BAR_MEM64, BAR_PREFETCHABLE, + BAR_MEM32, BAR_MEM64, BAR_PREFETCHABLE, CommonHeader, DeviceHeader, EmulatedConfig, HeaderType, + PciConfig, PciConfigArea, }; use crate::pci::{self, Pci, PciBar}; use crate::utils::{ @@ -41,7 +41,7 @@ use crate::utils::{ use crate::virtio::dev::{Register, Virtio, VirtioDevice, WakeEvent}; use crate::virtio::queue::Queue; use crate::virtio::worker::Waker; -use crate::virtio::{error, DevStatus, DeviceId, IrqSender, Result}; +use crate::virtio::{DevStatus, DeviceId, IrqSender, Result, error}; use crate::{impl_mmio_for_zerocopy, mem}; const VIRTIO_MSI_NO_VECTOR: u16 = 0xffff; @@ -878,6 +878,7 @@ where fn config(&self) -> &dyn PciConfig { &self.config } + fn reset(&self) -> pci::Result<()> { self.registers.wake_up_dev(WakeEvent::Reset); self.registers.reset(); diff --git a/alioth/src/virtio/queue/handlers.rs b/alioth/src/virtio/queue/handlers.rs index 6ff38cd3..63138638 100644 --- a/alioth/src/virtio/queue/handlers.rs +++ b/alioth/src/virtio/queue/handlers.rs @@ -13,7 +13,7 @@ // limitations under the License. use std::io::{ErrorKind, Read, Write}; -use std::sync::atomic::{fence, Ordering}; +use std::sync::atomic::{Ordering, fence}; use crate::virtio::queue::{Descriptor, VirtQueue}; use crate::virtio::{IrqSender, Result}; diff --git a/alioth/src/virtio/queue/split.rs b/alioth/src/virtio/queue/split.rs index a7e6dd81..6f1e80b7 100644 --- a/alioth/src/virtio/queue/split.rs +++ b/alioth/src/virtio/queue/split.rs @@ -13,7 +13,7 @@ // limitations under the License. use std::mem::size_of; -use std::sync::atomic::{fence, Ordering}; +use std::sync::atomic::{Ordering, fence}; use bitflags::bitflags; use macros::Layout; @@ -21,7 +21,7 @@ use zerocopy::{FromBytes, Immutable, IntoBytes}; use crate::mem::mapped::Ram; use crate::virtio::queue::{Descriptor, Queue, VirtQueue}; -use crate::virtio::{error, Result, VirtioFeature}; +use crate::virtio::{Result, VirtioFeature, error}; #[repr(C, align(16))] #[derive(Debug, Clone, Default, FromBytes, Immutable, IntoBytes)] diff --git a/alioth/src/virtio/vhost/ioctls.rs b/alioth/src/virtio/vhost/ioctls.rs index 46c7e225..941b5596 100644 --- a/alioth/src/virtio/vhost/ioctls.rs +++ b/alioth/src/virtio/vhost/ioctls.rs @@ -15,7 +15,7 @@ use crate::{ioctl_none, ioctl_read, ioctl_write_buf, ioctl_write_ptr}; use crate::virtio::vhost::bindings::{ - MemoryMultipleRegion, VirtqAddr, VirtqFile, VirtqState, VHOST_VIRTIO, + MemoryMultipleRegion, VHOST_VIRTIO, VirtqAddr, VirtqFile, VirtqState, }; ioctl_read!(vhost_get_features, VHOST_VIRTIO, 0x00, u64); diff --git a/alioth/src/virtio/vhost/vhost.rs b/alioth/src/virtio/vhost/vhost.rs index 8f4c9766..852ffc09 100644 --- a/alioth/src/virtio/vhost/vhost.rs +++ b/alioth/src/virtio/vhost/vhost.rs @@ -22,7 +22,7 @@ use std::sync::Arc; use snafu::{ResultExt, Snafu}; -use crate::errors::{boxed_debug_trace, trace_error, DebugTrace}; +use crate::errors::{DebugTrace, boxed_debug_trace, trace_error}; use crate::mem::mapped::Ram; use crate::mem::{self, LayoutUpdated}; @@ -132,6 +132,7 @@ impl VhostDev { unsafe { vhost_vsock_set_guest_cid(&self.fd, &cid) }?; Ok(()) } + pub fn vsock_set_running(&self, val: bool) -> Result<()> { unsafe { vhost_vsock_set_running(&self.fd, &(val as _)) }?; Ok(()) diff --git a/alioth/src/virtio/virtio.rs b/alioth/src/virtio/virtio.rs index 159faca9..9a0d59cf 100644 --- a/alioth/src/virtio/virtio.rs +++ b/alioth/src/virtio/virtio.rs @@ -32,7 +32,7 @@ use std::path::PathBuf; use bitflags::bitflags; use snafu::Snafu; -use crate::errors::{trace_error, DebugTrace}; +use crate::errors::{DebugTrace, trace_error}; #[trace_error] #[derive(Snafu, DebugTrace)] diff --git a/alioth/src/virtio/vu.rs b/alioth/src/virtio/vu.rs index 40d92d5f..3641366e 100644 --- a/alioth/src/virtio/vu.rs +++ b/alioth/src/virtio/vu.rs @@ -27,9 +27,9 @@ use parking_lot::Mutex; use snafu::{ResultExt, Snafu}; use zerocopy::{FromBytes, FromZeros, Immutable, IntoBytes}; -use crate::errors::{boxed_debug_trace, trace_error, DebugTrace}; -use crate::mem::mapped::ArcMemPages; +use crate::errors::{DebugTrace, boxed_debug_trace, trace_error}; use crate::mem::LayoutChanged; +use crate::mem::mapped::ArcMemPages; use crate::{ffi, mem}; bitflags! { @@ -114,12 +114,14 @@ bitfield! { } impl MessageFlag { - pub const VERSION_1: u32 = 0x1; - pub const REPLY: u32 = 1 << 2; pub const NEED_REPLY: u32 = 1 << 3; + pub const REPLY: u32 = 1 << 2; + pub const VERSION_1: u32 = 0x1; + pub const fn sender() -> Self { MessageFlag(MessageFlag::VERSION_1 | MessageFlag::NEED_REPLY) } + pub const fn receiver() -> Self { MessageFlag(MessageFlag::VERSION_1 | MessageFlag::REPLY) } @@ -357,60 +359,79 @@ impl VuDev { pub fn get_features(&self) -> Result { self.send_msg(VHOST_USER_GET_FEATURES, &(), &[]) } + pub fn set_features(&self, payload: &u64) -> Result<()> { self.send_msg(VHOST_USER_SET_FEATURES, payload, &[]) } + pub fn get_protocol_features(&self) -> Result { self.send_msg(VHOST_USER_GET_PROTOCOL_FEATURES, &(), &[]) } + pub fn set_protocol_features(&self, payload: &u64) -> Result { self.send_msg(VHOST_USER_SET_PROTOCOL_FEATURES, payload, &[]) } + pub fn set_owner(&self) -> Result<()> { self.send_msg(VHOST_USER_SET_OWNER, &(), &[]) } + pub fn set_virtq_num(&self, payload: &VirtqState) -> Result<()> { self.send_msg(VHOST_USER_SET_VIRTQ_NUM, payload, &[]) } + pub fn set_virtq_addr(&self, payload: &VirtqAddr) -> Result<()> { self.send_msg(VHOST_USER_SET_VIRTQ_ADDR, payload, &[]) } + pub fn set_virtq_base(&self, payload: &VirtqState) -> Result<()> { self.send_msg(VHOST_USER_SET_VIRTQ_BASE, payload, &[]) } + pub fn get_config(&self, payload: &DeviceConfig) -> Result { self.send_msg(VHOST_USER_GET_CONFIG, payload, &[]) } + pub fn set_config(&self, payload: &DeviceConfig) -> Result<()> { self.send_msg(VHOST_USER_SET_CONFIG, payload, &[]) } + pub fn get_virtq_base(&self, payload: &VirtqState) -> Result { self.send_msg(VHOST_USER_GET_VIRTQ_BASE, payload, &[]) } + pub fn get_queue_num(&self) -> Result { self.send_msg(VHOST_USER_GET_QUEUE_NUM, &(), &[]) } + pub fn set_virtq_kick(&self, payload: &u64, fd: RawFd) -> Result<()> { self.send_msg(VHOST_USER_SET_VIRTQ_KICK, payload, &[fd]) } + pub fn set_virtq_call(&self, payload: &u64, fd: RawFd) -> Result<()> { self.send_msg(VHOST_USER_SET_VIRTQ_CALL, payload, &[fd]) } + pub fn set_virtq_err(&self, payload: &u64, fd: RawFd) -> Result<()> { self.send_msg(VHOST_USER_SET_VIRTQ_ERR, payload, &[fd]) } + pub fn set_virtq_enable(&self, payload: &VirtqState) -> Result<()> { self.send_msg(VHOST_USER_SET_VIRTQ_ENABLE, payload, &[]) } + pub fn set_status(&self, payload: &u64) -> Result<()> { self.send_msg(VHOST_USER_SET_STATUS, payload, &[]) } + pub fn get_status(&self) -> Result { self.send_msg(VHOST_USER_GET_STATUS, &(), &[]) } + pub fn add_mem_region(&self, payload: &MemorySingleRegion, fd: RawFd) -> Result<()> { self.send_msg(VHOST_USER_ADD_MEM_REG, payload, &[fd]) } + pub fn remove_mem_region(&self, payload: &MemorySingleRegion) -> Result<()> { self.send_msg(VHOST_USER_REM_MEM_REG, payload, &[]) } diff --git a/alioth/src/virtio/worker/io_uring.rs b/alioth/src/virtio/worker/io_uring.rs index 856d508b..ed5c279a 100644 --- a/alioth/src/virtio/worker/io_uring.rs +++ b/alioth/src/virtio/worker/io_uring.rs @@ -14,13 +14,13 @@ use std::collections::HashMap; use std::os::fd::AsRawFd; -use std::sync::mpsc::Receiver; use std::sync::Arc; +use std::sync::mpsc::Receiver; use std::thread::JoinHandle; use io_uring::cqueue::Entry as Cqe; use io_uring::squeue::Entry as Sqe; -use io_uring::{opcode, types, SubmissionQueue}; +use io_uring::{SubmissionQueue, opcode, types}; use crate::hv::IoeventFd; use crate::mem::mapped::{Ram, RamBus}; @@ -61,7 +61,7 @@ pub trait VirtioIoUring: Virtio { } const TOKEN_QUEUE: u64 = 1 << 62; -const TOKEN_DESCRIPTOR: u64 = 1 << 62 | 1 << 61; +const TOKEN_DESCRIPTOR: u64 = (1 << 62) | (1 << 61); pub struct IoUring { queue_ioeventfds: Arc<[(E, bool)]>, @@ -235,7 +235,7 @@ where let mut buffer = q.get_descriptor(queue_submit.index)?; match dev.handle_buffer(index, &mut buffer, self.irq_sender)? { BufferAction::Sqe(sqe) => { - let buffer_key = (queue_submit.index as u32) << 16 | index as u32; + let buffer_key = ((queue_submit.index as u32) << 16) | index as u32; let sqe = sqe.user_data(buffer_key as u64 | TOKEN_DESCRIPTOR); if unsafe { self.ring.submission().push(&sqe) }.is_err() { log::error!("{}: queue-{index}: unexpected full queue", dev.name()); diff --git a/alioth/src/virtio/worker/mio.rs b/alioth/src/virtio/worker/mio.rs index 0d49e05a..9c29c078 100644 --- a/alioth/src/virtio/worker/mio.rs +++ b/alioth/src/virtio/worker/mio.rs @@ -13,8 +13,8 @@ // limitations under the License. use std::os::fd::AsRawFd; -use std::sync::mpsc::Receiver; use std::sync::Arc; +use std::sync::mpsc::Receiver; use std::thread::JoinHandle; use mio::event::Event; @@ -29,7 +29,7 @@ use crate::virtio::dev::{ }; use crate::virtio::queue::{Queue, VirtQueue}; use crate::virtio::worker::Waker; -use crate::virtio::{error, IrqSender, Result}; +use crate::virtio::{IrqSender, Result, error}; pub trait VirtioMio: Virtio { fn activate<'a, 'm, Q: VirtQueue<'m>, S: IrqSender>( @@ -177,6 +177,7 @@ where S: IrqSender, { type Event = Event; + fn handle_event(&mut self, dev: &mut D, event: &Self::Event) -> Result<()> { let token = event.token().0 as u64; if token & TOKEN_QUEUE == TOKEN_QUEUE { diff --git a/alioth/src/virtio/worker/worker.rs b/alioth/src/virtio/worker/worker.rs index 976205d8..eff6c767 100644 --- a/alioth/src/virtio/worker/worker.rs +++ b/alioth/src/virtio/worker/worker.rs @@ -24,7 +24,7 @@ use std::io::{ErrorKind, Read, Write}; use std::os::fd::FromRawFd; #[cfg(target_os = "linux")] -use libc::{eventfd, EFD_CLOEXEC, EFD_NONBLOCK}; +use libc::{EFD_CLOEXEC, EFD_NONBLOCK, eventfd}; use serde::Deserialize; use serde_aco::Help; #[cfg(target_os = "linux")] @@ -32,9 +32,9 @@ use snafu::ResultExt; #[cfg(target_os = "linux")] use crate::ffi; +use crate::virtio::Result; #[cfg(target_os = "linux")] use crate::virtio::error; -use crate::virtio::Result; #[derive(Debug, Clone, Copy, Default, Deserialize, Help)] pub enum WorkerApi { diff --git a/alioth/src/vm.rs b/alioth/src/vm.rs index d2d6df79..ca0c6589 100644 --- a/alioth/src/vm.rs +++ b/alioth/src/vm.rs @@ -14,8 +14,8 @@ #[cfg(target_os = "linux")] use std::path::Path; -use std::sync::mpsc::{self, Receiver, Sender}; use std::sync::Arc; +use std::sync::mpsc::{self, Receiver, Sender}; use std::thread; use std::time::Duration; @@ -35,7 +35,7 @@ use crate::device::pl011::Pl011; use crate::device::pvpanic::PvPanic; #[cfg(target_arch = "x86_64")] use crate::device::serial::Serial; -use crate::errors::{trace_error, DebugTrace}; +use crate::errors::{DebugTrace, trace_error}; #[cfg(target_os = "linux")] use crate::hv::Kvm; use crate::hv::{Hypervisor, IoeventFdRegistry, Vm, VmConfig}; diff --git a/macros/src/errors.rs b/macros/src/errors.rs index 82764e6d..e61322bd 100644 --- a/macros/src/errors.rs +++ b/macros/src/errors.rs @@ -15,7 +15,7 @@ use proc_macro::TokenStream; use quote::quote; use syn::parse::{Parse, Parser}; -use syn::{parse_macro_input, parse_quote, DeriveInput, GenericArgument, PathArguments, Type}; +use syn::{DeriveInput, GenericArgument, PathArguments, Type, parse_macro_input, parse_quote}; fn extract_type_from_box(ty: &Type) -> Option<&Type> { let Type::Path(type_path) = ty else { @@ -41,7 +41,7 @@ fn extract_type_from_box(ty: &Type) -> Option<&Type> { pub fn trace_error(_attr: TokenStream, item: TokenStream) -> TokenStream { let mut input = parse_macro_input!(item as DeriveInput); - let syn::Data::Enum(ref mut enum_data) = &mut input.data else { + let syn::Data::Enum(enum_data) = &mut input.data else { panic!("not an enum") }; for variant in enum_data.variants.iter_mut() { @@ -77,7 +77,7 @@ pub fn trace_error(_attr: TokenStream, item: TokenStream) -> TokenStream { pub fn derive_debug_trace(input: TokenStream) -> TokenStream { let mut input = parse_macro_input!(input as DeriveInput); let name = &input.ident; - let syn::Data::Enum(ref mut enum_data) = &mut input.data else { + let syn::Data::Enum(enum_data) = &mut input.data else { panic!("not an enum") }; let mut debug_trace_arms = vec![]; diff --git a/macros/src/layout.rs b/macros/src/layout.rs index 59aa5bff..eda9e1db 100644 --- a/macros/src/layout.rs +++ b/macros/src/layout.rs @@ -14,7 +14,7 @@ use proc_macro::TokenStream; use quote::{format_ident, quote}; -use syn::{parse_macro_input, DeriveInput}; +use syn::{DeriveInput, parse_macro_input}; pub fn derive_layout(input: TokenStream) -> TokenStream { let input = parse_macro_input!(input as DeriveInput); diff --git a/rustfmt.toml b/rustfmt.toml index 24cac62d..9c21af99 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -1,2 +1,7 @@ +edition = "2024" +format_macro_matchers = true +format_macro_bodies = true imports_granularity = "Module" - +reorder_modules = true +reorder_impl_items = true +style_edition = "2024" diff --git a/serde-aco-derive/src/help.rs b/serde-aco-derive/src/help.rs index 92d15e1f..35def08f 100644 --- a/serde-aco-derive/src/help.rs +++ b/serde-aco-derive/src/help.rs @@ -21,8 +21,8 @@ use quote::quote; use syn::meta::ParseNestedMeta; use syn::punctuated::Punctuated; use syn::{ - parse_macro_input, Attribute, Data, DataEnum, DataStruct, DeriveInput, Expr, ExprLit, Field, - Fields, FieldsNamed, FieldsUnnamed, Ident, Lit, Meta, MetaNameValue, Token, + Attribute, Data, DataEnum, DataStruct, DeriveInput, Expr, ExprLit, Field, Fields, FieldsNamed, + FieldsUnnamed, Ident, Lit, Meta, MetaNameValue, Token, parse_macro_input, }; fn get_doc_from_attrs(attrs: &[Attribute]) -> String { diff --git a/serde-aco/src/de.rs b/serde-aco/src/de.rs index 7d62120f..08fd7acb 100644 --- a/serde-aco/src/de.rs +++ b/serde-aco/src/de.rs @@ -14,8 +14,8 @@ use std::collections::HashMap; -use serde::de::{self, DeserializeSeed, EnumAccess, MapAccess, SeqAccess, VariantAccess, Visitor}; use serde::Deserialize; +use serde::de::{self, DeserializeSeed, EnumAccess, MapAccess, SeqAccess, VariantAccess, Visitor}; use crate::error::{Error, Result}; @@ -433,6 +433,7 @@ impl<'a, 's, 'o> CommaSeparated<'a, 's, 'o> { impl<'s> SeqAccess<'s> for CommaSeparated<'_, 's, '_> { type Error = Error; + fn next_element_seed(&mut self, seed: T) -> Result> where T: DeserializeSeed<'s>, @@ -539,7 +540,7 @@ mod test { use serde::Deserialize; use serde_bytes::{ByteArray, ByteBuf}; - use crate::{from_arg, from_args, Error}; + use crate::{Error, from_arg, from_args}; #[test] fn test_option() { diff --git a/serde-aco/src/help.rs b/serde-aco/src/help.rs index 299f37ac..20d3dea8 100644 --- a/serde-aco/src/help.rs +++ b/serde-aco/src/help.rs @@ -79,7 +79,9 @@ macro_rules! impl_help_for_array_types { }; } -impl_help_for_num_types!(Int, i8, i16, i32, i64, i128, isize, u8, u16, u32, u64, u128, usize); +impl_help_for_num_types!( + Int, i8, i16, i32, i64, i128, isize, u8, u16, u32, u64, u128, usize +); impl_help_for_types!(Float, f32, f64); impl_help_for_types!(Bool, bool); impl_help_for_types!( diff --git a/serde-aco/src/lib.rs b/serde-aco/src/lib.rs index 8ea5acd0..bf1d7f3b 100644 --- a/serde-aco/src/lib.rs +++ b/serde-aco/src/lib.rs @@ -16,6 +16,6 @@ mod de; mod error; mod help; -pub use self::de::{from_arg, from_args, Deserializer}; +pub use self::de::{Deserializer, from_arg, from_args}; pub use self::error::{Error, Result}; -pub use self::help::{help_text, FieldHelp, Help, TypedHelp}; +pub use self::help::{FieldHelp, Help, TypedHelp, help_text};