diff --git a/Cargo.toml b/Cargo.toml index 40dab2f0..e9655344 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,7 @@ [workspace] -resolver = "2" +package.edition = "2024" +package.rust-version = "1.85" +resolver = "3" members = [ "kvm-bindings", "kvm-ioctls", diff --git a/kvm-bindings/CHANGELOG.md b/kvm-bindings/CHANGELOG.md index 8450c520..d8b79e85 100644 --- a/kvm-bindings/CHANGELOG.md +++ b/kvm-bindings/CHANGELOG.md @@ -2,6 +2,9 @@ ## Upcoming Release +### Changed +- Rust edition 2024 + ## v0.13.0 ### Added diff --git a/kvm-bindings/CONTRIBUTING.md b/kvm-bindings/CONTRIBUTING.md index 483c28cf..e13d45f6 100644 --- a/kvm-bindings/CONTRIBUTING.md +++ b/kvm-bindings/CONTRIBUTING.md @@ -4,14 +4,14 @@ ### Bindgen The bindings are currently generated using -[bindgen](https://crates.io/crates/bindgen) version 0.70.1: +[bindgen](https://crates.io/crates/bindgen) version 0.72.0: ```bash -cargo install bindgen-cli --vers 0.70.1 +cargo install bindgen-cli --vers 0.72.0 ``` ### Linux Kernel Generating bindings depends on the Linux kernel, so you need to have the -repository on your machine. Replace `v6.9` with the kernel release for +repository on your machine. Replace `v6.16` with the kernel release for which you wish to generate bindings: ```bash @@ -23,7 +23,7 @@ git clone https://github.com/torvalds/linux.git --branch v6.9 --depth 1 When adding a new architecture, the bindings must be generated for all existing versions for consistency reasons. -### Example for arm64 and kernel version 6.9 +### Example for arm64 and kernel version 6.16 For this example we assume that you have both linux and kvm-bindings repositories in your root. @@ -44,7 +44,7 @@ export ARCH=arm64 make headers_install ARCH=$ARCH INSTALL_HDR_PATH="$ARCH"_headers pushd "$ARCH"_headers bindgen include/linux/kvm.h -o bindings.rs \ - --impl-debug --with-derive-default \ + --impl-debug --with-derive-default --rust-edition 2024 \ --with-derive-partialeq --impl-partialeq \ -- -Iinclude popd diff --git a/kvm-bindings/Cargo.toml b/kvm-bindings/Cargo.toml index 21523b16..ece8ebfe 100644 --- a/kvm-bindings/Cargo.toml +++ b/kvm-bindings/Cargo.toml @@ -7,6 +7,8 @@ repository = "https://github.com/rust-vmm/kvm" readme = "README.md" keywords = ["kvm"] license = "Apache-2.0" +edition.workspace = true +rust-version.workspace = true [package.metadata.docs.rs] all-features = true diff --git a/kvm-bindings/src/arm64/bindings.rs b/kvm-bindings/src/arm64/bindings.rs index ce888550..e639e6af 100644 --- a/kvm-bindings/src/arm64/bindings.rs +++ b/kvm-bindings/src/arm64/bindings.rs @@ -22,11 +22,11 @@ impl __IncompleteArrayField { } #[inline] pub unsafe fn as_slice(&self, len: usize) -> &[T] { - ::std::slice::from_raw_parts(self.as_ptr(), len) + unsafe { ::std::slice::from_raw_parts(self.as_ptr(), len) } } #[inline] pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] { - ::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len) + unsafe { ::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len) } } } impl ::std::fmt::Debug for __IncompleteArrayField { @@ -2067,7 +2067,11 @@ impl Default for kvm_run__bindgen_ty_1__bindgen_ty_8 { } impl ::std::fmt::Debug for kvm_run__bindgen_ty_1__bindgen_ty_8 { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "kvm_run__bindgen_ty_1__bindgen_ty_8 {{ nr: {:?}, args: {:?}, ret: {:?}, __bindgen_anon_1: {:?} }}" , self . nr , self . args , self . ret , self . __bindgen_anon_1) + write!( + f, + "kvm_run__bindgen_ty_1__bindgen_ty_8 {{ nr: {:?}, args: {:?}, ret: {:?}, __bindgen_anon_1: {:?} }}", + self.nr, self.args, self.ret, self.__bindgen_anon_1 + ) } } #[repr(C)] @@ -2194,8 +2198,18 @@ const _: () = { ["Alignment of kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1"] [::std::mem::align_of::( ) - 1usize]; - ["Offset of field: kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1::insn_size"] [:: std :: mem :: offset_of ! (kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1 , insn_size) - 0usize] ; - ["Offset of field: kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1::insn_bytes"] [:: std :: mem :: offset_of ! (kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1 , insn_bytes) - 1usize] ; + [ + "Offset of field: kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1::insn_size", + ][::std::mem::offset_of!( + kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1, + insn_size + ) - 0usize]; + [ + "Offset of field: kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1::insn_bytes", + ][::std::mem::offset_of!( + kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1, + insn_bytes + ) - 1usize]; }; #[allow(clippy::unnecessary_operation, clippy::identity_op)] const _: () = { @@ -2245,7 +2259,11 @@ impl Default for kvm_run__bindgen_ty_1__bindgen_ty_14 { } impl ::std::fmt::Debug for kvm_run__bindgen_ty_1__bindgen_ty_14 { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "kvm_run__bindgen_ty_1__bindgen_ty_14 {{ suberror: {:?}, ndata: {:?}, flags: {:?}, __bindgen_anon_1: {:?} }}" , self . suberror , self . ndata , self . flags , self . __bindgen_anon_1) + write!( + f, + "kvm_run__bindgen_ty_1__bindgen_ty_14 {{ suberror: {:?}, ndata: {:?}, flags: {:?}, __bindgen_anon_1: {:?} }}", + self.suberror, self.ndata, self.flags, self.__bindgen_anon_1 + ) } } #[repr(C)] @@ -2390,7 +2408,11 @@ impl Default for kvm_run__bindgen_ty_1__bindgen_ty_19 { } impl ::std::fmt::Debug for kvm_run__bindgen_ty_1__bindgen_ty_19 { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "kvm_run__bindgen_ty_1__bindgen_ty_19 {{ type: {:?}, ndata: {:?}, __bindgen_anon_1: {:?} }}" , self . type_ , self . ndata , self . __bindgen_anon_1) + write!( + f, + "kvm_run__bindgen_ty_1__bindgen_ty_19 {{ type: {:?}, ndata: {:?}, __bindgen_anon_1: {:?} }}", + self.type_, self.ndata, self.__bindgen_anon_1 + ) } } #[repr(C)] @@ -2705,7 +2727,23 @@ impl Default for kvm_run { } impl ::std::fmt::Debug for kvm_run { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "kvm_run {{ request_interrupt_window: {:?}, immediate_exit: {:?}, padding1: {:?}, exit_reason: {:?}, ready_for_interrupt_injection: {:?}, if_flag: {:?}, flags: {:?}, cr8: {:?}, apic_base: {:?}, __bindgen_anon_1: {:?}, kvm_valid_regs: {:?}, kvm_dirty_regs: {:?}, s: {:?} }}" , self . request_interrupt_window , self . immediate_exit , self . padding1 , self . exit_reason , self . ready_for_interrupt_injection , self . if_flag , self . flags , self . cr8 , self . apic_base , self . __bindgen_anon_1 , self . kvm_valid_regs , self . kvm_dirty_regs , self . s) + write!( + f, + "kvm_run {{ request_interrupt_window: {:?}, immediate_exit: {:?}, padding1: {:?}, exit_reason: {:?}, ready_for_interrupt_injection: {:?}, if_flag: {:?}, flags: {:?}, cr8: {:?}, apic_base: {:?}, __bindgen_anon_1: {:?}, kvm_valid_regs: {:?}, kvm_dirty_regs: {:?}, s: {:?} }}", + self.request_interrupt_window, + self.immediate_exit, + self.padding1, + self.exit_reason, + self.ready_for_interrupt_injection, + self.if_flag, + self.flags, + self.cr8, + self.apic_base, + self.__bindgen_anon_1, + self.kvm_valid_regs, + self.kvm_dirty_regs, + self.s + ) } } #[repr(C)] @@ -2835,7 +2873,11 @@ impl Default for kvm_coalesced_mmio { } impl ::std::fmt::Debug for kvm_coalesced_mmio { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "kvm_coalesced_mmio {{ phys_addr: {:?}, len: {:?}, __bindgen_anon_1: {:?}, data: {:?} }}" , self . phys_addr , self . len , self . __bindgen_anon_1 , self . data) + write!( + f, + "kvm_coalesced_mmio {{ phys_addr: {:?}, len: {:?}, __bindgen_anon_1: {:?}, data: {:?} }}", + self.phys_addr, self.len, self.__bindgen_anon_1, self.data + ) } } #[repr(C)] @@ -3037,7 +3079,11 @@ impl Default for kvm_clear_dirty_log { } impl ::std::fmt::Debug for kvm_clear_dirty_log { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "kvm_clear_dirty_log {{ slot: {:?}, num_pages: {:?}, first_page: {:?}, __bindgen_anon_1: {:?} }}" , self . slot , self . num_pages , self . first_page , self . __bindgen_anon_1) + write!( + f, + "kvm_clear_dirty_log {{ slot: {:?}, num_pages: {:?}, first_page: {:?}, __bindgen_anon_1: {:?} }}", + self.slot, self.num_pages, self.first_page, self.__bindgen_anon_1 + ) } } #[repr(C)] @@ -3272,7 +3318,11 @@ impl Default for kvm_irq_routing_msi { } impl ::std::fmt::Debug for kvm_irq_routing_msi { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "kvm_irq_routing_msi {{ address_lo: {:?}, address_hi: {:?}, data: {:?}, __bindgen_anon_1: {:?} }}" , self . address_lo , self . address_hi , self . data , self . __bindgen_anon_1) + write!( + f, + "kvm_irq_routing_msi {{ address_lo: {:?}, address_hi: {:?}, data: {:?}, __bindgen_anon_1: {:?} }}", + self.address_lo, self.address_hi, self.data, self.__bindgen_anon_1 + ) } } #[repr(C)] diff --git a/kvm-bindings/src/arm64/fam_wrappers.rs b/kvm-bindings/src/arm64/fam_wrappers.rs index bbe64411..c2702a24 100644 --- a/kvm-bindings/src/arm64/fam_wrappers.rs +++ b/kvm-bindings/src/arm64/fam_wrappers.rs @@ -3,7 +3,7 @@ use vmm_sys_util::fam::{FamStruct, FamStructWrapper}; -use arm64::bindings::*; +use super::bindings::*; // There is no constant in the kernel as far as the maximum number // of registers on arm, but KVM_GET_REG_LIST usually returns around 450. diff --git a/kvm-bindings/src/arm64/serialize.rs b/kvm-bindings/src/arm64/serialize.rs index a167607d..ce66a3b2 100644 --- a/kvm-bindings/src/arm64/serialize.rs +++ b/kvm-bindings/src/arm64/serialize.rs @@ -1,10 +1,10 @@ -use bindings::{ +use super::bindings::{ kvm_irq_routing, kvm_irq_routing_entry, kvm_irq_routing_entry__bindgen_ty_1, kvm_irq_routing_msi__bindgen_ty_1, kvm_mp_state, kvm_one_reg, kvm_regs, kvm_vcpu_init, user_fpsimd_state, user_pt_regs, }; use serde::{Deserialize, Deserializer, Serialize, Serializer}; -use zerocopy::{transmute, IntoBytes}; +use zerocopy::{IntoBytes, transmute}; serde_impls! { user_pt_regs, @@ -43,7 +43,7 @@ unsafe impl IntoBytes for kvm_irq_routing_entry__bindgen_ty_1 { #[cfg(test)] mod tests { - use bindings::*; + use super::*; use serde::{Deserialize, Serialize}; fn is_serde Deserialize<'de> + Default>() { diff --git a/kvm-bindings/src/lib.rs b/kvm-bindings/src/lib.rs index dbe11cd8..ec56e597 100644 --- a/kvm-bindings/src/lib.rs +++ b/kvm-bindings/src/lib.rs @@ -6,6 +6,7 @@ #![allow(non_upper_case_globals)] #![allow(non_camel_case_types)] #![allow(non_snake_case)] +#![deny(clippy::undocumented_unsafe_blocks)] #![cfg_attr(docsrs, feature(doc_auto_cfg))] #[cfg(feature = "fam-wrappers")] diff --git a/kvm-bindings/src/riscv64/bindings.rs b/kvm-bindings/src/riscv64/bindings.rs index 36a73728..d3085659 100644 --- a/kvm-bindings/src/riscv64/bindings.rs +++ b/kvm-bindings/src/riscv64/bindings.rs @@ -22,11 +22,11 @@ impl __IncompleteArrayField { } #[inline] pub unsafe fn as_slice(&self, len: usize) -> &[T] { - ::std::slice::from_raw_parts(self.as_ptr(), len) + unsafe { ::std::slice::from_raw_parts(self.as_ptr(), len) } } #[inline] pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] { - ::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len) + unsafe { ::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len) } } } impl ::std::fmt::Debug for __IncompleteArrayField { @@ -1925,7 +1925,11 @@ impl Default for kvm_run__bindgen_ty_1__bindgen_ty_8 { } impl ::std::fmt::Debug for kvm_run__bindgen_ty_1__bindgen_ty_8 { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "kvm_run__bindgen_ty_1__bindgen_ty_8 {{ nr: {:?}, args: {:?}, ret: {:?}, __bindgen_anon_1: {:?} }}" , self . nr , self . args , self . ret , self . __bindgen_anon_1) + write!( + f, + "kvm_run__bindgen_ty_1__bindgen_ty_8 {{ nr: {:?}, args: {:?}, ret: {:?}, __bindgen_anon_1: {:?} }}", + self.nr, self.args, self.ret, self.__bindgen_anon_1 + ) } } #[repr(C)] @@ -2052,8 +2056,18 @@ const _: () = { ["Alignment of kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1"] [::std::mem::align_of::( ) - 1usize]; - ["Offset of field: kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1::insn_size"] [:: std :: mem :: offset_of ! (kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1 , insn_size) - 0usize] ; - ["Offset of field: kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1::insn_bytes"] [:: std :: mem :: offset_of ! (kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1 , insn_bytes) - 1usize] ; + [ + "Offset of field: kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1::insn_size", + ][::std::mem::offset_of!( + kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1, + insn_size + ) - 0usize]; + [ + "Offset of field: kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1::insn_bytes", + ][::std::mem::offset_of!( + kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1, + insn_bytes + ) - 1usize]; }; #[allow(clippy::unnecessary_operation, clippy::identity_op)] const _: () = { @@ -2103,7 +2117,11 @@ impl Default for kvm_run__bindgen_ty_1__bindgen_ty_14 { } impl ::std::fmt::Debug for kvm_run__bindgen_ty_1__bindgen_ty_14 { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "kvm_run__bindgen_ty_1__bindgen_ty_14 {{ suberror: {:?}, ndata: {:?}, flags: {:?}, __bindgen_anon_1: {:?} }}" , self . suberror , self . ndata , self . flags , self . __bindgen_anon_1) + write!( + f, + "kvm_run__bindgen_ty_1__bindgen_ty_14 {{ suberror: {:?}, ndata: {:?}, flags: {:?}, __bindgen_anon_1: {:?} }}", + self.suberror, self.ndata, self.flags, self.__bindgen_anon_1 + ) } } #[repr(C)] @@ -2248,7 +2266,11 @@ impl Default for kvm_run__bindgen_ty_1__bindgen_ty_19 { } impl ::std::fmt::Debug for kvm_run__bindgen_ty_1__bindgen_ty_19 { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "kvm_run__bindgen_ty_1__bindgen_ty_19 {{ type: {:?}, ndata: {:?}, __bindgen_anon_1: {:?} }}" , self . type_ , self . ndata , self . __bindgen_anon_1) + write!( + f, + "kvm_run__bindgen_ty_1__bindgen_ty_19 {{ type: {:?}, ndata: {:?}, __bindgen_anon_1: {:?} }}", + self.type_, self.ndata, self.__bindgen_anon_1 + ) } } #[repr(C)] @@ -2563,7 +2585,23 @@ impl Default for kvm_run { } impl ::std::fmt::Debug for kvm_run { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "kvm_run {{ request_interrupt_window: {:?}, immediate_exit: {:?}, padding1: {:?}, exit_reason: {:?}, ready_for_interrupt_injection: {:?}, if_flag: {:?}, flags: {:?}, cr8: {:?}, apic_base: {:?}, __bindgen_anon_1: {:?}, kvm_valid_regs: {:?}, kvm_dirty_regs: {:?}, s: {:?} }}" , self . request_interrupt_window , self . immediate_exit , self . padding1 , self . exit_reason , self . ready_for_interrupt_injection , self . if_flag , self . flags , self . cr8 , self . apic_base , self . __bindgen_anon_1 , self . kvm_valid_regs , self . kvm_dirty_regs , self . s) + write!( + f, + "kvm_run {{ request_interrupt_window: {:?}, immediate_exit: {:?}, padding1: {:?}, exit_reason: {:?}, ready_for_interrupt_injection: {:?}, if_flag: {:?}, flags: {:?}, cr8: {:?}, apic_base: {:?}, __bindgen_anon_1: {:?}, kvm_valid_regs: {:?}, kvm_dirty_regs: {:?}, s: {:?} }}", + self.request_interrupt_window, + self.immediate_exit, + self.padding1, + self.exit_reason, + self.ready_for_interrupt_injection, + self.if_flag, + self.flags, + self.cr8, + self.apic_base, + self.__bindgen_anon_1, + self.kvm_valid_regs, + self.kvm_dirty_regs, + self.s + ) } } #[repr(C)] @@ -2693,7 +2731,11 @@ impl Default for kvm_coalesced_mmio { } impl ::std::fmt::Debug for kvm_coalesced_mmio { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "kvm_coalesced_mmio {{ phys_addr: {:?}, len: {:?}, __bindgen_anon_1: {:?}, data: {:?} }}" , self . phys_addr , self . len , self . __bindgen_anon_1 , self . data) + write!( + f, + "kvm_coalesced_mmio {{ phys_addr: {:?}, len: {:?}, __bindgen_anon_1: {:?}, data: {:?} }}", + self.phys_addr, self.len, self.__bindgen_anon_1, self.data + ) } } #[repr(C)] @@ -2895,7 +2937,11 @@ impl Default for kvm_clear_dirty_log { } impl ::std::fmt::Debug for kvm_clear_dirty_log { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "kvm_clear_dirty_log {{ slot: {:?}, num_pages: {:?}, first_page: {:?}, __bindgen_anon_1: {:?} }}" , self . slot , self . num_pages , self . first_page , self . __bindgen_anon_1) + write!( + f, + "kvm_clear_dirty_log {{ slot: {:?}, num_pages: {:?}, first_page: {:?}, __bindgen_anon_1: {:?} }}", + self.slot, self.num_pages, self.first_page, self.__bindgen_anon_1 + ) } } #[repr(C)] @@ -3130,7 +3176,11 @@ impl Default for kvm_irq_routing_msi { } impl ::std::fmt::Debug for kvm_irq_routing_msi { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "kvm_irq_routing_msi {{ address_lo: {:?}, address_hi: {:?}, data: {:?}, __bindgen_anon_1: {:?} }}" , self . address_lo , self . address_hi , self . data , self . __bindgen_anon_1) + write!( + f, + "kvm_irq_routing_msi {{ address_lo: {:?}, address_hi: {:?}, data: {:?}, __bindgen_anon_1: {:?} }}", + self.address_lo, self.address_hi, self.data, self.__bindgen_anon_1 + ) } } #[repr(C)] diff --git a/kvm-bindings/src/riscv64/fam_wrappers.rs b/kvm-bindings/src/riscv64/fam_wrappers.rs index 25b1babf..397cdc9e 100644 --- a/kvm-bindings/src/riscv64/fam_wrappers.rs +++ b/kvm-bindings/src/riscv64/fam_wrappers.rs @@ -4,7 +4,7 @@ use vmm_sys_util::fam::{FamStruct, FamStructWrapper}; -use riscv64::bindings::*; +use super::bindings::*; // There is no constant in the kernel as far as the maximum number // of registers on RISC-V, but KVM_GET_REG_LIST usually returns around 160. diff --git a/kvm-bindings/src/riscv64/serialize.rs b/kvm-bindings/src/riscv64/serialize.rs index 5c250cf0..e17d1065 100644 --- a/kvm-bindings/src/riscv64/serialize.rs +++ b/kvm-bindings/src/riscv64/serialize.rs @@ -2,14 +2,14 @@ // Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -use bindings::{ +use super::bindings::{ kvm_irq_routing, kvm_irq_routing_entry, kvm_irq_routing_entry__bindgen_ty_1, kvm_irq_routing_msi__bindgen_ty_1, kvm_mp_state, kvm_one_reg, kvm_riscv_aia_csr, kvm_riscv_config, kvm_riscv_core, kvm_riscv_csr, kvm_riscv_sbi_sta, kvm_riscv_smstateen_csr, kvm_riscv_timer, user_regs_struct, }; use serde::{Deserialize, Deserializer, Serialize, Serializer}; -use zerocopy::{transmute, IntoBytes}; +use zerocopy::{IntoBytes, transmute}; serde_impls! { kvm_mp_state, @@ -52,7 +52,7 @@ unsafe impl IntoBytes for kvm_irq_routing_entry__bindgen_ty_1 { #[cfg(test)] mod tests { - use bindings::*; + use super::*; use serde::{Deserialize, Serialize}; fn is_serde Deserialize<'de> + Default>() { diff --git a/kvm-bindings/src/x86_64/bindings.rs b/kvm-bindings/src/x86_64/bindings.rs index 3f22d83f..de4a13c6 100644 --- a/kvm-bindings/src/x86_64/bindings.rs +++ b/kvm-bindings/src/x86_64/bindings.rs @@ -106,11 +106,11 @@ impl __IncompleteArrayField { } #[inline] pub unsafe fn as_slice(&self, len: usize) -> &[T] { - ::std::slice::from_raw_parts(self.as_ptr(), len) + unsafe { ::std::slice::from_raw_parts(self.as_ptr(), len) } } #[inline] pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] { - ::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len) + unsafe { ::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len) } } } impl ::std::fmt::Debug for __IncompleteArrayField { @@ -127,11 +127,11 @@ impl __BindgenUnionField { } #[inline] pub unsafe fn as_ref(&self) -> &T { - ::std::mem::transmute(self) + unsafe { ::std::mem::transmute(self) } } #[inline] pub unsafe fn as_mut(&mut self) -> &mut T { - ::std::mem::transmute(self) + unsafe { ::std::mem::transmute(self) } } } impl ::std::default::Default for __BindgenUnionField { @@ -1100,7 +1100,11 @@ impl Default for kvm_ioapic_state { } impl ::std::fmt::Debug for kvm_ioapic_state { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "kvm_ioapic_state {{ base_address: {:?}, ioregsel: {:?}, id: {:?}, irr: {:?}, pad: {:?}, redirtbl: {:?} }}" , self . base_address , self . ioregsel , self . id , self . irr , self . pad , self . redirtbl) + write!( + f, + "kvm_ioapic_state {{ base_address: {:?}, ioregsel: {:?}, id: {:?}, irr: {:?}, pad: {:?}, redirtbl: {:?} }}", + self.base_address, self.ioregsel, self.id, self.irr, self.pad, self.redirtbl + ) } } #[repr(C)] @@ -2460,9 +2464,24 @@ const _: () = { [::std::mem::align_of::< kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_1, >() - 4usize]; - ["Offset of field: kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_1::port"] [:: std :: mem :: offset_of ! (kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_1 , port) - 0usize] ; - ["Offset of field: kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_1::vcpu"] [:: std :: mem :: offset_of ! (kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_1 , vcpu) - 4usize] ; - ["Offset of field: kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_1::priority"] [:: std :: mem :: offset_of ! (kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_1 , priority) - 8usize] ; + [ + "Offset of field: kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_1::port", + ][::std::mem::offset_of!( + kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_1, + port + ) - 0usize]; + [ + "Offset of field: kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_1::vcpu", + ][::std::mem::offset_of!( + kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_1, + vcpu + ) - 4usize]; + [ + "Offset of field: kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_1::priority", + ][::std::mem::offset_of!( + kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_1, + priority + ) - 8usize]; }; #[repr(C)] #[derive(Debug, Default, Copy, Clone, PartialEq)] @@ -2480,8 +2499,18 @@ const _: () = { [::std::mem::align_of::< kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_2, >() - 4usize]; - ["Offset of field: kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_2::port"] [:: std :: mem :: offset_of ! (kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_2 , port) - 0usize] ; - ["Offset of field: kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_2::fd"] [:: std :: mem :: offset_of ! (kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_2 , fd) - 4usize] ; + [ + "Offset of field: kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_2::port", + ][::std::mem::offset_of!( + kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_2, + port + ) - 0usize]; + [ + "Offset of field: kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_2::fd", + ][::std::mem::offset_of!( + kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2__bindgen_ty_1__bindgen_ty_2, + fd + ) - 4usize]; }; #[allow(clippy::unnecessary_operation, clippy::identity_op)] const _: () = { @@ -2550,7 +2579,11 @@ impl Default for kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2 { } impl ::std::fmt::Debug for kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2 { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2 {{ send_port: {:?}, type: {:?}, flags: {:?}, deliver: {:?} }}" , self . send_port , self . type_ , self . flags , self . deliver) + write!( + f, + "kvm_xen_hvm_attr__bindgen_ty_1__bindgen_ty_2 {{ send_port: {:?}, type: {:?}, flags: {:?}, deliver: {:?} }}", + self.send_port, self.type_, self.flags, self.deliver + ) } } #[allow(clippy::unnecessary_operation, clippy::identity_op)] @@ -3984,7 +4017,11 @@ impl Default for kvm_run__bindgen_ty_1__bindgen_ty_8 { } impl ::std::fmt::Debug for kvm_run__bindgen_ty_1__bindgen_ty_8 { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "kvm_run__bindgen_ty_1__bindgen_ty_8 {{ nr: {:?}, args: {:?}, ret: {:?}, __bindgen_anon_1: {:?} }}" , self . nr , self . args , self . ret , self . __bindgen_anon_1) + write!( + f, + "kvm_run__bindgen_ty_1__bindgen_ty_8 {{ nr: {:?}, args: {:?}, ret: {:?}, __bindgen_anon_1: {:?} }}", + self.nr, self.args, self.ret, self.__bindgen_anon_1 + ) } } #[repr(C)] @@ -4111,8 +4148,18 @@ const _: () = { ["Alignment of kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1"] [::std::mem::align_of::( ) - 1usize]; - ["Offset of field: kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1::insn_size"] [:: std :: mem :: offset_of ! (kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1 , insn_size) - 0usize] ; - ["Offset of field: kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1::insn_bytes"] [:: std :: mem :: offset_of ! (kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1 , insn_bytes) - 1usize] ; + [ + "Offset of field: kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1::insn_size", + ][::std::mem::offset_of!( + kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1, + insn_size + ) - 0usize]; + [ + "Offset of field: kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1::insn_bytes", + ][::std::mem::offset_of!( + kvm_run__bindgen_ty_1__bindgen_ty_14__bindgen_ty_1__bindgen_ty_1, + insn_bytes + ) - 1usize]; }; #[allow(clippy::unnecessary_operation, clippy::identity_op)] const _: () = { @@ -4162,7 +4209,11 @@ impl Default for kvm_run__bindgen_ty_1__bindgen_ty_14 { } impl ::std::fmt::Debug for kvm_run__bindgen_ty_1__bindgen_ty_14 { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "kvm_run__bindgen_ty_1__bindgen_ty_14 {{ suberror: {:?}, ndata: {:?}, flags: {:?}, __bindgen_anon_1: {:?} }}" , self . suberror , self . ndata , self . flags , self . __bindgen_anon_1) + write!( + f, + "kvm_run__bindgen_ty_1__bindgen_ty_14 {{ suberror: {:?}, ndata: {:?}, flags: {:?}, __bindgen_anon_1: {:?} }}", + self.suberror, self.ndata, self.flags, self.__bindgen_anon_1 + ) } } #[repr(C)] @@ -4307,7 +4358,11 @@ impl Default for kvm_run__bindgen_ty_1__bindgen_ty_19 { } impl ::std::fmt::Debug for kvm_run__bindgen_ty_1__bindgen_ty_19 { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "kvm_run__bindgen_ty_1__bindgen_ty_19 {{ type: {:?}, ndata: {:?}, __bindgen_anon_1: {:?} }}" , self . type_ , self . ndata , self . __bindgen_anon_1) + write!( + f, + "kvm_run__bindgen_ty_1__bindgen_ty_19 {{ type: {:?}, ndata: {:?}, __bindgen_anon_1: {:?} }}", + self.type_, self.ndata, self.__bindgen_anon_1 + ) } } #[repr(C)] @@ -4622,7 +4677,23 @@ impl Default for kvm_run { } impl ::std::fmt::Debug for kvm_run { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "kvm_run {{ request_interrupt_window: {:?}, immediate_exit: {:?}, padding1: {:?}, exit_reason: {:?}, ready_for_interrupt_injection: {:?}, if_flag: {:?}, flags: {:?}, cr8: {:?}, apic_base: {:?}, __bindgen_anon_1: {:?}, kvm_valid_regs: {:?}, kvm_dirty_regs: {:?}, s: {:?} }}" , self . request_interrupt_window , self . immediate_exit , self . padding1 , self . exit_reason , self . ready_for_interrupt_injection , self . if_flag , self . flags , self . cr8 , self . apic_base , self . __bindgen_anon_1 , self . kvm_valid_regs , self . kvm_dirty_regs , self . s) + write!( + f, + "kvm_run {{ request_interrupt_window: {:?}, immediate_exit: {:?}, padding1: {:?}, exit_reason: {:?}, ready_for_interrupt_injection: {:?}, if_flag: {:?}, flags: {:?}, cr8: {:?}, apic_base: {:?}, __bindgen_anon_1: {:?}, kvm_valid_regs: {:?}, kvm_dirty_regs: {:?}, s: {:?} }}", + self.request_interrupt_window, + self.immediate_exit, + self.padding1, + self.exit_reason, + self.ready_for_interrupt_injection, + self.if_flag, + self.flags, + self.cr8, + self.apic_base, + self.__bindgen_anon_1, + self.kvm_valid_regs, + self.kvm_dirty_regs, + self.s + ) } } #[repr(C)] @@ -4752,7 +4823,11 @@ impl Default for kvm_coalesced_mmio { } impl ::std::fmt::Debug for kvm_coalesced_mmio { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "kvm_coalesced_mmio {{ phys_addr: {:?}, len: {:?}, __bindgen_anon_1: {:?}, data: {:?} }}" , self . phys_addr , self . len , self . __bindgen_anon_1 , self . data) + write!( + f, + "kvm_coalesced_mmio {{ phys_addr: {:?}, len: {:?}, __bindgen_anon_1: {:?}, data: {:?} }}", + self.phys_addr, self.len, self.__bindgen_anon_1, self.data + ) } } #[repr(C)] @@ -4954,7 +5029,11 @@ impl Default for kvm_clear_dirty_log { } impl ::std::fmt::Debug for kvm_clear_dirty_log { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "kvm_clear_dirty_log {{ slot: {:?}, num_pages: {:?}, first_page: {:?}, __bindgen_anon_1: {:?} }}" , self . slot , self . num_pages , self . first_page , self . __bindgen_anon_1) + write!( + f, + "kvm_clear_dirty_log {{ slot: {:?}, num_pages: {:?}, first_page: {:?}, __bindgen_anon_1: {:?} }}", + self.slot, self.num_pages, self.first_page, self.__bindgen_anon_1 + ) } } #[repr(C)] @@ -5189,7 +5268,11 @@ impl Default for kvm_irq_routing_msi { } impl ::std::fmt::Debug for kvm_irq_routing_msi { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "kvm_irq_routing_msi {{ address_lo: {:?}, address_hi: {:?}, data: {:?}, __bindgen_anon_1: {:?} }}" , self . address_lo , self . address_hi , self . data , self . __bindgen_anon_1) + write!( + f, + "kvm_irq_routing_msi {{ address_lo: {:?}, address_hi: {:?}, data: {:?}, __bindgen_anon_1: {:?} }}", + self.address_lo, self.address_hi, self.data, self.__bindgen_anon_1 + ) } } #[repr(C)] diff --git a/kvm-bindings/src/x86_64/fam_wrappers.rs b/kvm-bindings/src/x86_64/fam_wrappers.rs index 1ac7aafa..f4cc6545 100644 --- a/kvm-bindings/src/x86_64/fam_wrappers.rs +++ b/kvm-bindings/src/x86_64/fam_wrappers.rs @@ -3,7 +3,7 @@ use vmm_sys_util::fam::{FamStruct, FamStructWrapper}; -use x86_64::bindings::*; +use super::bindings::*; /// Maximum number of CPUID entries that can be returned by a call to KVM ioctls. /// @@ -199,11 +199,8 @@ pub type Xsave = FamStructWrapper; #[cfg(test)] mod tests { + use super::*; use crate::KvmIrqRouting; - - use super::{CpuId, MsrList, Msrs, Xsave}; - use x86_64::bindings::kvm_cpuid_entry2; - use vmm_sys_util::fam::FamStruct; #[test] diff --git a/kvm-bindings/src/x86_64/nested.rs b/kvm-bindings/src/x86_64/nested.rs index f53be53d..5b1e8f08 100644 --- a/kvm-bindings/src/x86_64/nested.rs +++ b/kvm-bindings/src/x86_64/nested.rs @@ -4,9 +4,9 @@ //! is used and the state needs to be serialized, e.g., for live-migration or //! state save/resume. See [`KvmNestedStateBuffer`]. +use crate::KVM_STATE_NESTED_SVM_VMCB_SIZE; +use crate::{KVM_STATE_NESTED_VMX_VMCS_SIZE, kvm_nested_state__bindgen_ty_1}; use core::mem; -use KVM_STATE_NESTED_SVM_VMCB_SIZE; -use {kvm_nested_state__bindgen_ty_1, KVM_STATE_NESTED_VMX_VMCS_SIZE}; /// Non-zero variant of the bindgen data union. /// diff --git a/kvm-bindings/src/x86_64/serialize.rs b/kvm-bindings/src/x86_64/serialize.rs index 9aeaf7eb..8780f8df 100644 --- a/kvm-bindings/src/x86_64/serialize.rs +++ b/kvm-bindings/src/x86_64/serialize.rs @@ -1,19 +1,18 @@ // Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -use bindings::{ - kvm_clock_data, kvm_cpuid2, kvm_cpuid_entry2, kvm_debugregs, kvm_dtable, +use super::bindings::{ + kvm_clock_data, kvm_cpuid_entry2, kvm_cpuid2, kvm_debugregs, kvm_dtable, kvm_ioapic_state__bindgen_ty_1, kvm_irq_routing, kvm_irq_routing_entry, kvm_irq_routing_entry__bindgen_ty_1, kvm_irq_routing_msi__bindgen_ty_1, kvm_irqchip, kvm_irqchip__bindgen_ty_1, kvm_lapic_state, kvm_mp_state, kvm_msr_entry, kvm_msrs, - kvm_pit_channel_state, kvm_pit_state2, kvm_regs, kvm_segment, kvm_sregs, kvm_vcpu_events, - kvm_xcr, kvm_xcrs, kvm_xsave, + kvm_nested_state__bindgen_ty_1, kvm_pit_channel_state, kvm_pit_state2, kvm_regs, kvm_segment, + kvm_sregs, kvm_vcpu_events, kvm_xcr, kvm_xcrs, kvm_xsave, }; -use fam_wrappers::kvm_xsave2; -use kvm_nested_state__bindgen_ty_1; -use nested::{kvm_nested_state__data, KvmNestedStateBuffer}; +use super::fam_wrappers::kvm_xsave2; +use super::nested::{KvmNestedStateBuffer, kvm_nested_state__data}; use serde::{Deserialize, Deserializer, Serialize, Serializer}; -use zerocopy::{transmute, FromBytes, FromZeros, Immutable, IntoBytes}; +use zerocopy::{FromBytes, FromZeros, Immutable, IntoBytes, transmute}; serde_impls!( kvm_regs, @@ -152,7 +151,6 @@ unsafe impl IntoBytes for kvm_nested_state__data { #[cfg(test)] mod tests { use super::*; - use bindings::*; fn is_serde Deserialize<'de> + Default>() { let config = bincode::config::standard(); diff --git a/kvm-ioctls/CHANGELOG.md b/kvm-ioctls/CHANGELOG.md index 0849ac88..e9e6c143 100644 --- a/kvm-ioctls/CHANGELOG.md +++ b/kvm-ioctls/CHANGELOG.md @@ -8,6 +8,10 @@ - [[#334]](https://github.com/rust-vmm/kvm/pull/334) Added support for `KVM_HAS_DEVICE_ATTR` and `KVM_SET_DEVICE_ATTR` vm ioctl on aarch64. +## Changed + +- Rust edition 2024 + ## v0.23.0 ### Added diff --git a/kvm-ioctls/Cargo.toml b/kvm-ioctls/Cargo.toml index 724c3427..5a12666d 100644 --- a/kvm-ioctls/Cargo.toml +++ b/kvm-ioctls/Cargo.toml @@ -7,7 +7,8 @@ repository = "https://github.com/rust-vmm/kvm" readme = "README.md" keywords = ["kvm"] license = "Apache-2.0 OR MIT" -edition = "2021" +edition.workspace = true +rust-version.workspace = true [dependencies] libc = "0.2.39" diff --git a/kvm-ioctls/src/ioctls/device.rs b/kvm-ioctls/src/ioctls/device.rs index a788de3e..4e3d0d8f 100644 --- a/kvm-ioctls/src/ioctls/device.rs +++ b/kvm-ioctls/src/ioctls/device.rs @@ -133,8 +133,8 @@ impl DeviceFd { /// # #[cfg(target_arch = "aarch64")] /// # { /// use kvm_bindings::{ - /// kvm_device_type_KVM_DEV_TYPE_ARM_VGIC_V2, kvm_device_type_KVM_DEV_TYPE_ARM_VGIC_V3, - /// KVM_DEV_ARM_VGIC_GRP_NR_IRQS, + /// KVM_DEV_ARM_VGIC_GRP_NR_IRQS, kvm_device_type_KVM_DEV_TYPE_ARM_VGIC_V2, + /// kvm_device_type_KVM_DEV_TYPE_ARM_VGIC_V3, /// }; /// /// // Create a GIC device. @@ -164,7 +164,7 @@ impl DeviceFd { pub unsafe fn get_device_attr(&self, device_attr: &mut kvm_device_attr) -> Result<()> { // SAFETY: Caller has ensured device_attr.addr is safe to write to. // We are calling this function with a Device fd, we trust the kernel. - let ret = ioctl_with_mut_ref(self, KVM_GET_DEVICE_ATTR(), device_attr); + let ret = unsafe { ioctl_with_mut_ref(self, KVM_GET_DEVICE_ATTR(), device_attr) }; if ret != 0 { return Err(errno::Error::last()); } @@ -192,7 +192,8 @@ impl FromRawFd for DeviceFd { /// that relies on it being true. unsafe fn from_raw_fd(fd: RawFd) -> Self { DeviceFd { - fd: File::from_raw_fd(fd), + // SAFETY: we trust the kernel and verified parameters + fd: unsafe { File::from_raw_fd(fd) }, } } } @@ -202,13 +203,13 @@ mod tests { #![allow(clippy::undocumented_unsafe_blocks)] use super::*; use crate::ioctls::system::Kvm; + #[cfg(target_arch = "aarch64")] + use kvm_bindings::{KVM_DEV_VFIO_GROUP, KVM_DEV_VFIO_GROUP_ADD}; #[cfg(target_arch = "x86_64")] use kvm_bindings::{ - kvm_device_type_KVM_DEV_TYPE_ARM_VGIC_V3, kvm_device_type_KVM_DEV_TYPE_VFIO, - KVM_DEV_VFIO_GROUP, KVM_DEV_VFIO_GROUP_ADD, + KVM_DEV_VFIO_GROUP, KVM_DEV_VFIO_GROUP_ADD, kvm_device_type_KVM_DEV_TYPE_ARM_VGIC_V3, + kvm_device_type_KVM_DEV_TYPE_VFIO, }; - #[cfg(target_arch = "aarch64")] - use kvm_bindings::{KVM_DEV_VFIO_GROUP, KVM_DEV_VFIO_GROUP_ADD}; use kvm_bindings::KVM_CREATE_DEVICE_TEST; @@ -260,7 +261,7 @@ mod tests { fn test_create_device() { use crate::ioctls::vm::{create_gic_device, request_gic_init, set_supported_nr_irqs}; use kvm_bindings::{ - kvm_device_type_KVM_DEV_TYPE_FSL_MPIC_20, KVM_DEV_ARM_VGIC_GRP_NR_IRQS, + KVM_DEV_ARM_VGIC_GRP_NR_IRQS, kvm_device_type_KVM_DEV_TYPE_FSL_MPIC_20, }; use vmm_sys_util::errno::Error; @@ -330,9 +331,9 @@ mod tests { fn test_create_device() { use crate::ioctls::vm::{create_aia_device, request_aia_init, set_supported_nr_irqs}; use kvm_bindings::{ - kvm_device_attr, kvm_device_type_KVM_DEV_TYPE_FSL_MPIC_20, KVM_DEV_RISCV_AIA_ADDR_APLIC, KVM_DEV_RISCV_AIA_CONFIG_SRCS, - KVM_DEV_RISCV_AIA_GRP_ADDR, KVM_DEV_RISCV_AIA_GRP_CONFIG, + KVM_DEV_RISCV_AIA_GRP_ADDR, KVM_DEV_RISCV_AIA_GRP_CONFIG, kvm_device_attr, + kvm_device_type_KVM_DEV_TYPE_FSL_MPIC_20, }; use vmm_sys_util::errno::Error; diff --git a/kvm-ioctls/src/ioctls/mod.rs b/kvm-ioctls/src/ioctls/mod.rs index a5f96c19..22cd6067 100644 --- a/kvm-ioctls/src/ioctls/mod.rs +++ b/kvm-ioctls/src/ioctls/mod.rs @@ -7,10 +7,10 @@ use std::mem::size_of; use std::os::unix::io::AsRawFd; -use std::ptr::{null_mut, NonNull}; +use std::ptr::{NonNull, null_mut}; use kvm_bindings::{ - kvm_coalesced_mmio, kvm_coalesced_mmio_ring, kvm_run, KVM_COALESCED_MMIO_PAGE_OFFSET, + KVM_COALESCED_MMIO_PAGE_OFFSET, kvm_coalesced_mmio, kvm_coalesced_mmio_ring, kvm_run, }; use vmm_sys_util::errno; diff --git a/kvm-ioctls/src/ioctls/system.rs b/kvm-ioctls/src/ioctls/system.rs index dfa20161..f4550b02 100644 --- a/kvm-ioctls/src/ioctls/system.rs +++ b/kvm-ioctls/src/ioctls/system.rs @@ -4,20 +4,20 @@ // Portions Copyright 2017 The Chromium OS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the THIRD-PARTY file. -use libc::{open, O_CLOEXEC, O_RDWR}; +use libc::{O_CLOEXEC, O_RDWR, open}; use std::ffi::CStr; use std::fs::File; use std::os::raw::{c_char, c_ulong}; use std::os::unix::io::{AsRawFd, FromRawFd, RawFd}; use crate::cap::Cap; -use crate::ioctls::vm::{new_vmfd, VmFd}; use crate::ioctls::Result; +use crate::ioctls::vm::{VmFd, new_vmfd}; use crate::kvm_ioctls::*; #[cfg(target_arch = "aarch64")] use kvm_bindings::KVM_VM_TYPE_ARM_IPA_SIZE_MASK; #[cfg(target_arch = "x86_64")] -use kvm_bindings::{CpuId, MsrList, Msrs, KVM_MAX_CPUID_ENTRIES, KVM_MAX_MSR_ENTRIES}; +use kvm_bindings::{CpuId, KVM_MAX_CPUID_ENTRIES, KVM_MAX_MSR_ENTRIES, MsrList, Msrs}; use vmm_sys_util::errno; #[cfg(target_arch = "x86_64")] use vmm_sys_util::ioctl::ioctl_with_mut_ptr; @@ -282,11 +282,7 @@ impl Kvm { /// ``` pub fn get_nr_vcpus(&self) -> usize { let x = self.check_extension_int(Cap::NrVcpus); - if x > 0 { - x as usize - } else { - 4 - } + if x > 0 { x as usize } else { 4 } } /// Returns the maximum allowed memory slots per VM. @@ -305,11 +301,7 @@ impl Kvm { /// ``` pub fn get_nr_memslots(&self) -> usize { let x = self.check_extension_int(Cap::NrMemslots); - if x > 0 { - x as usize - } else { - 32 - } + if x > 0 { x as usize } else { 32 } } /// Gets the recommended maximum number of VCPUs per VM. @@ -471,7 +463,7 @@ impl Kvm { /// # Example /// /// ``` - /// use kvm_bindings::{kvm_msr_entry, Msrs}; + /// use kvm_bindings::{Msrs, kvm_msr_entry}; /// use kvm_ioctls::Kvm; /// /// let kvm = Kvm::new().unwrap(); @@ -513,7 +505,7 @@ impl Kvm { /// # Example /// /// ``` - /// use kvm_bindings::{kvm_msr_entry, Msrs}; + /// use kvm_bindings::{Msrs, kvm_msr_entry}; /// use kvm_ioctls::Kvm; /// /// let kvm = Kvm::new().unwrap(); @@ -680,7 +672,8 @@ impl Kvm { /// ``` pub unsafe fn create_vmfd_from_rawfd(&self, fd: RawFd) -> Result { let run_mmap_size = self.get_vcpu_mmap_size()?; - Ok(new_vmfd(File::from_raw_fd(fd), run_mmap_size)) + // SAFETY: we trust the kernel and verified parameters + Ok(new_vmfd(unsafe { File::from_raw_fd(fd) }, run_mmap_size)) } } @@ -720,7 +713,8 @@ impl FromRawFd for Kvm { /// ``` unsafe fn from_raw_fd(fd: RawFd) -> Self { Kvm { - kvm: File::from_raw_fd(fd), + // SAFETY: we trust the kernel and verified parameters + kvm: unsafe { File::from_raw_fd(fd) }, } } } @@ -729,7 +723,7 @@ impl FromRawFd for Kvm { mod tests { #![allow(clippy::undocumented_unsafe_blocks)] use super::*; - use libc::{fcntl, FD_CLOEXEC, F_GETFD}; + use libc::{F_GETFD, FD_CLOEXEC, fcntl}; use std::os::fd::IntoRawFd; #[cfg(target_arch = "x86_64")] use vmm_sys_util::fam::FamStruct; diff --git a/kvm-ioctls/src/ioctls/vcpu.rs b/kvm-ioctls/src/ioctls/vcpu.rs index 1b1996c9..69515c43 100644 --- a/kvm-ioctls/src/ioctls/vcpu.rs +++ b/kvm-ioctls/src/ioctls/vcpu.rs @@ -1024,7 +1024,8 @@ impl VcpuFd { /// ``` #[cfg(target_arch = "x86_64")] pub unsafe fn set_xsave2(&self, xsave: &Xsave) -> Result<()> { - self.set_xsave(&xsave.as_fam_struct_ref().xsave) + // SAFETY: we trust the kernel and verified parameters + unsafe { self.set_xsave(&xsave.as_fam_struct_ref().xsave) } } /// X86 specific call that returns the vcpu's current "xcrs". @@ -1283,7 +1284,7 @@ impl VcpuFd { /// # use kvm_ioctls::Kvm; /// use std::arch::is_aarch64_feature_detected; /// - /// use kvm_bindings::{kvm_vcpu_init, KVM_ARM_VCPU_SVE}; + /// use kvm_bindings::{KVM_ARM_VCPU_SVE, kvm_vcpu_init}; /// let kvm = Kvm::new().unwrap(); /// let vm = kvm.create_vm().unwrap(); /// let vcpu = vm.create_vcpu(0).unwrap(); @@ -1558,7 +1559,7 @@ impl VcpuFd { /// } /// # } /// ``` - pub fn run(&mut self) -> Result { + pub fn run(&mut self) -> Result> { // SAFETY: Safe because we know that our file is a vCPU fd and we verify the return result. let ret = unsafe { ioctl(self, KVM_RUN()) }; if ret == 0 { diff --git a/kvm-ioctls/src/ioctls/vm.rs b/kvm-ioctls/src/ioctls/vm.rs index d4498793..56872f38 100644 --- a/kvm-ioctls/src/ioctls/vm.rs +++ b/kvm-ioctls/src/ioctls/vm.rs @@ -14,10 +14,10 @@ use std::os::raw::{c_int, c_ulong}; use std::os::unix::io::{AsRawFd, FromRawFd, RawFd}; use crate::cap::Cap; -use crate::ioctls::device::new_device; use crate::ioctls::device::DeviceFd; -use crate::ioctls::vcpu::new_vcpu; +use crate::ioctls::device::new_device; use crate::ioctls::vcpu::VcpuFd; +use crate::ioctls::vcpu::new_vcpu; use crate::ioctls::{KvmRunWrapper, Result}; use crate::kvm_ioctls::*; use vmm_sys_util::errno; @@ -107,7 +107,9 @@ impl VmFd { &self, user_memory_region: kvm_userspace_memory_region, ) -> Result<()> { - let ret = ioctl_with_ref(self, KVM_SET_USER_MEMORY_REGION(), &user_memory_region); + // SAFETY: we trust the kernel and verified parameters + let ret = + unsafe { ioctl_with_ref(self, KVM_SET_USER_MEMORY_REGION(), &user_memory_region) }; if ret == 0 { Ok(()) } else { @@ -145,8 +147,8 @@ impl VmFd { /// extern crate kvm_bindings; /// /// use kvm_bindings::{ - /// kvm_create_guest_memfd, kvm_userspace_memory_region2, KVM_CAP_GUEST_MEMFD, - /// KVM_CAP_USER_MEMORY2, KVM_MEM_GUEST_MEMFD, + /// KVM_CAP_GUEST_MEMFD, KVM_CAP_USER_MEMORY2, KVM_MEM_GUEST_MEMFD, kvm_create_guest_memfd, + /// kvm_userspace_memory_region2, /// }; /// use kvm_ioctls::{Cap, Kvm}; /// use std::os::fd::RawFd; @@ -193,7 +195,9 @@ impl VmFd { &self, user_memory_region2: kvm_userspace_memory_region2, ) -> Result<()> { - let ret = ioctl_with_ref(self, KVM_SET_USER_MEMORY_REGION2(), &user_memory_region2); + // SAFETY: we trust the kernel and verified parameters + let ret = + unsafe { ioctl_with_ref(self, KVM_SET_USER_MEMORY_REGION2(), &user_memory_region2) }; if ret == 0 { Ok(()) } else { @@ -275,7 +279,7 @@ impl VmFd { /// #[cfg(target_arch = "aarch64")] /// { /// use kvm_bindings::{ - /// kvm_create_device, kvm_device_type_KVM_DEV_TYPE_ARM_VGIC_V2, KVM_CREATE_DEVICE_TEST, + /// KVM_CREATE_DEVICE_TEST, kvm_create_device, kvm_device_type_KVM_DEV_TYPE_ARM_VGIC_V2, /// }; /// let mut gic_device = kvm_create_device { /// type_: kvm_device_type_KVM_DEV_TYPE_ARM_VGIC_V2, @@ -662,7 +666,7 @@ impl VmFd { /// extern crate libc; /// extern crate vmm_sys_util; /// # use kvm_ioctls::{IoEventAddress, Kvm, NoDatamatch}; - /// use libc::{eventfd, EFD_NONBLOCK}; + /// use libc::{EFD_NONBLOCK, eventfd}; /// use vmm_sys_util::eventfd::EventFd; /// let kvm = Kvm::new().unwrap(); /// let vm_fd = kvm.create_vm().unwrap(); @@ -692,8 +696,8 @@ impl VmFd { datamatch: datamatch.into(), len: std::mem::size_of::() as u32, addr: match addr { - IoEventAddress::Pio(ref p) => *p, - IoEventAddress::Mmio(ref m) => *m, + IoEventAddress::Pio(p) => *p, + IoEventAddress::Mmio(m) => *m, }, fd: fd.as_raw_fd(), flags, @@ -768,8 +772,8 @@ impl VmFd { datamatch: datamatch.into(), len: std::mem::size_of::() as u32, addr: match addr { - IoEventAddress::Pio(ref p) => *p, - IoEventAddress::Mmio(ref m) => *m, + IoEventAddress::Pio(p) => *p, + IoEventAddress::Mmio(m) => *m, }, fd: fd.as_raw_fd(), flags, @@ -1243,7 +1247,8 @@ impl VmFd { /// let vcpu = unsafe { vm.create_vcpu_from_rawfd(rawfd).unwrap() }; /// ``` pub unsafe fn create_vcpu_from_rawfd(&self, fd: RawFd) -> Result { - let vcpu = File::from_raw_fd(fd); + // SAFETY: we trust the kernel and verified parameters + let vcpu = unsafe { File::from_raw_fd(fd) }; let kvm_run_ptr = KvmRunWrapper::mmap_from_fd(&vcpu, self.run_size)?; Ok(new_vcpu(vcpu, kvm_run_ptr)) } @@ -1264,9 +1269,9 @@ impl VmFd { /// # extern crate kvm_bindings; /// # use kvm_ioctls::Kvm; /// use kvm_bindings::{ - /// kvm_device_type_KVM_DEV_TYPE_ARM_VGIC_V2, kvm_device_type_KVM_DEV_TYPE_ARM_VGIC_V3, - /// kvm_device_type_KVM_DEV_TYPE_RISCV_AIA, kvm_device_type_KVM_DEV_TYPE_VFIO, - /// KVM_CREATE_DEVICE_TEST, + /// KVM_CREATE_DEVICE_TEST, kvm_device_type_KVM_DEV_TYPE_ARM_VGIC_V2, + /// kvm_device_type_KVM_DEV_TYPE_ARM_VGIC_V3, kvm_device_type_KVM_DEV_TYPE_RISCV_AIA, + /// kvm_device_type_KVM_DEV_TYPE_VFIO, /// }; /// let kvm = Kvm::new().unwrap(); /// let vm = kvm.create_vm().unwrap(); @@ -1363,7 +1368,7 @@ impl VmFd { /// extern crate kvm_bindings; /// /// # use kvm_ioctls::Kvm; - /// use kvm_bindings::{kvm_enable_cap, KVM_CAP_SPLIT_IRQCHIP}; + /// use kvm_bindings::{KVM_CAP_SPLIT_IRQCHIP, kvm_enable_cap}; /// /// let kvm = Kvm::new().unwrap(); /// let vm = kvm.create_vm().unwrap(); @@ -1492,7 +1497,7 @@ impl VmFd { /// extern crate kvm_bindings; /// /// # use kvm_ioctls::{Cap, Kvm}; - /// use kvm_bindings::{kvm_create_guest_memfd, KVM_CAP_GUEST_MEMFD}; + /// use kvm_bindings::{KVM_CAP_GUEST_MEMFD, kvm_create_guest_memfd}; /// use std::os::fd::RawFd; /// /// let kvm = Kvm::new().unwrap(); @@ -1545,9 +1550,9 @@ impl VmFd { /// /// # use kvm_ioctls::{Cap, Kvm}; /// use kvm_bindings::{ - /// kvm_create_guest_memfd, kvm_memory_attributes, kvm_userspace_memory_region2, - /// KVM_CAP_GUEST_MEMFD, KVM_CAP_MEMORY_ATTRIBUTES, KVM_CAP_USER_MEMORY2, - /// KVM_MEMORY_ATTRIBUTE_PRIVATE, KVM_MEM_GUEST_MEMFD, + /// KVM_CAP_GUEST_MEMFD, KVM_CAP_MEMORY_ATTRIBUTES, KVM_CAP_USER_MEMORY2, KVM_MEM_GUEST_MEMFD, + /// KVM_MEMORY_ATTRIBUTE_PRIVATE, kvm_create_guest_memfd, kvm_memory_attributes, + /// kvm_userspace_memory_region2, /// }; /// use std::os::fd::RawFd; /// @@ -1648,7 +1653,8 @@ impl VmFd { /// ``` #[cfg(target_arch = "x86_64")] pub unsafe fn encrypt_op(&self, op: *mut T) -> Result<()> { - let ret = ioctl_with_mut_ptr(self, KVM_MEMORY_ENCRYPT_OP(), op); + // SAFETY: we trust the kernel and verified parameters + let ret = unsafe { ioctl_with_mut_ptr(self, KVM_MEMORY_ENCRYPT_OP(), op) }; if ret == 0 { Ok(()) } else { diff --git a/kvm-ioctls/src/kvm_ioctls.rs b/kvm-ioctls/src/kvm_ioctls.rs index ba12cb7c..43898ba3 100644 --- a/kvm-ioctls/src/kvm_ioctls.rs +++ b/kvm-ioctls/src/kvm_ioctls.rs @@ -285,7 +285,7 @@ mod tests { use std::fs::File; use std::os::unix::io::FromRawFd; - use libc::{c_char, open, O_RDWR}; + use libc::{O_RDWR, c_char, open}; use vmm_sys_util::ioctl::{ioctl, ioctl_with_val}; use super::*; diff --git a/kvm-ioctls/src/lib.rs b/kvm-ioctls/src/lib.rs index 8ea71878..63373bc4 100644 --- a/kvm-ioctls/src/lib.rs +++ b/kvm-ioctls/src/lib.rs @@ -9,6 +9,7 @@ #![deny(missing_docs)] #![deny(missing_copy_implementations)] #![deny(missing_debug_implementations)] +#![deny(clippy::undocumented_unsafe_blocks)] #![warn(clippy::assertions_on_result_states)] //! A safe wrapper around the kernel's KVM interface. @@ -65,8 +66,8 @@ //! use std::ptr::null_mut; //! use std::slice; //! -//! use kvm_bindings::kvm_userspace_memory_region; //! use kvm_bindings::KVM_MEM_LOG_DIRTY_PAGES; +//! use kvm_bindings::kvm_userspace_memory_region; //! //! let mem_size = 0x4000; //! let guest_addr = 0x1000;