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 | 10 +++------- drivers/gpu/nova-core/firmware/fwsec/bootloader.rs | 4 +++- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/nova-core/firmware.rs b/drivers/gpu/nova-core/firmware.rs index a94820a3b335..80ce0df244a8 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::{ @@ -347,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, @@ -363,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, @@ -381,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 d9fafd2eea5b..66b9f4d1b41c 100644 --- a/drivers/gpu/nova-core/firmware/fwsec/bootloader.rs +++ b/drivers/gpu/nova-core/firmware/fwsec/bootloader.rs @@ -25,6 +25,8 @@ }, }; +use zerocopy::FromBytes as _; + use crate::{ driver::Bar0, falcon::{ @@ -150,7 +152,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 = { -- 2.34.1
