From: Pedro Yudi Honda <[email protected]> In firmware.rs, replace the following `transmute` traits with their `zerocopy` equivalents:
- `transmute::FromBytes` -> `zerocopy::FromBytes` Update call sites accordingly. Note that the module `elf` is untouched, as the bindings generated by bindgen do not implement `FromBytes` for the structs. Signed-off-by: Pedro Yudi Honda <[email protected]> --- drivers/gpu/nova-core/firmware.rs | 16 ++++------------ .../gpu/nova-core/firmware/fwsec/bootloader.rs | 4 +++- drivers/gpu/nova-core/vbios.rs | 4 ++-- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/nova-core/firmware.rs b/drivers/gpu/nova-core/firmware.rs index 1e89390209f5..1eae03344a61 100644 --- a/drivers/gpu/nova-core/firmware.rs +++ b/drivers/gpu/nova-core/firmware.rs @@ -11,8 +11,7 @@ device, firmware, prelude::*, - str::CString, - transmute::FromBytes, // + str::CString, // }; use crate::{ @@ -88,7 +87,7 @@ pub(crate) struct FalconUCodeDescV2 { /// Structure used to describe some firmwares, notably FWSEC-FRTS. #[repr(C)] -#[derive(Debug, Clone)] +#[derive(Debug, Clone, FromBytes)] pub(crate) struct FalconUCodeDescV3 { /// Header defined by `NV_BIT_FALCON_UCODE_DESC_HEADER_VDESC*` in OpenRM. hdr: u32, @@ -119,10 +118,6 @@ pub(crate) struct FalconUCodeDescV3 { _reserved: u16, } -// SAFETY: all bit patterns are valid for this type, and it doesn't use -// interior mutability. -unsafe impl FromBytes for FalconUCodeDescV3 {} - /// Enum wrapping the different versions of Falcon microcode descriptors. /// /// This allows handling both V2 and V3 descriptor formats through a @@ -351,7 +346,7 @@ fn no_patch_signature(self) -> FirmwareObject<F, Signed> { /// Header common to most firmware files. #[repr(C)] -#[derive(Debug, Clone)] +#[derive(Debug, Clone, FromBytes)] struct BinHdr { /// Magic number, must be `0x10de`. bin_magic: u32, @@ -367,9 +362,6 @@ struct BinHdr { data_size: u32, } -// SAFETY: all bit patterns are valid for this type, and it doesn't use interior mutability. -unsafe impl FromBytes for BinHdr {} - // A firmware blob starting with a `BinHdr`. struct BinFirmware<'a> { hdr: BinHdr, @@ -385,7 +377,7 @@ fn new(fw: &'a firmware::Firmware) -> Result<Self> { fw.get(0..size_of::<BinHdr>()) // Extract header. - .and_then(BinHdr::from_bytes_copy) + .and_then(|b| BinHdr::read_from_bytes(b).ok()) // Validate header. .filter(|hdr| hdr.bin_magic == BIN_MAGIC) .map(|hdr| Self { hdr, fw }) diff --git a/drivers/gpu/nova-core/firmware/fwsec/bootloader.rs b/drivers/gpu/nova-core/firmware/fwsec/bootloader.rs index 039920dc340b..13af1c381df1 100644 --- a/drivers/gpu/nova-core/firmware/fwsec/bootloader.rs +++ b/drivers/gpu/nova-core/firmware/fwsec/bootloader.rs @@ -29,6 +29,8 @@ }, }; +use zerocopy::FromBytes as _; + use crate::{ driver::Bar0, falcon::{ @@ -154,7 +156,7 @@ pub(crate) fn new( let hdr = fw .data() .get(0..size_of::<BinHdr>()) - .and_then(BinHdr::from_bytes_copy) + .and_then(|b| BinHdr::read_from_bytes(b).ok()) .ok_or(EINVAL)?; let desc = { diff --git a/drivers/gpu/nova-core/vbios.rs b/drivers/gpu/nova-core/vbios.rs index c6e6bfcd6a1f..e6d144587c4e 100644 --- a/drivers/gpu/nova-core/vbios.rs +++ b/drivers/gpu/nova-core/vbios.rs @@ -935,8 +935,8 @@ pub(crate) fn header(&self) -> Result<FalconUCodeDesc> { Ok(FalconUCodeDesc::V2(v2)) } 3 => { - let v3 = FalconUCodeDescV3::from_bytes_copy_prefix(data) - .ok_or(EINVAL)? + let v3 = FalconUCodeDescV3::read_from_prefix(data) + .map_err(|_| EINVAL)? .0; Ok(FalconUCodeDesc::V3(v3)) } -- 2.34.1
