From: Pedro Yudi Honda <[email protected]> In firmware/booter.rs, replace the following `transmute` traits with their `zerocopy` equivalents:
- `transmute::FromBytes` -> `zerocopy::FromBytes` Update call sites accordingly. Signed-off-by: Pedro Yudi Honda <[email protected]> --- drivers/gpu/nova-core/firmware/booter.rs | 26 +++++++----------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/drivers/gpu/nova-core/firmware/booter.rs b/drivers/gpu/nova-core/firmware/booter.rs index d9313ac361af..0cda2c50fbbe 100644 --- a/drivers/gpu/nova-core/firmware/booter.rs +++ b/drivers/gpu/nova-core/firmware/booter.rs @@ -10,8 +10,7 @@ use kernel::{ device, dma::Coherent, - prelude::*, - transmute::FromBytes, // + prelude::*, // }; use crate::{ @@ -44,7 +43,7 @@ fn frombytes_at<S: FromBytes + Sized>(slice: &[u8], offset: usize) -> Result<S> let end = offset.checked_add(size_of::<S>()).ok_or(EINVAL)?; slice .get(offset..end) - .and_then(S::from_bytes_copy) + .and_then(|b| S::read_from_bytes(b).ok()) .ok_or(EINVAL) } @@ -53,7 +52,7 @@ fn frombytes_at<S: FromBytes + Sized>(slice: &[u8], offset: usize) -> Result<S> /// Such firmwares have an application-specific payload that needs to be patched with a given /// signature. #[repr(C)] -#[derive(Debug, Clone)] +#[derive(Debug, Clone, FromBytes)] struct HsHeaderV2 { /// Offset to the start of the signatures. sig_prod_offset: u32, @@ -76,9 +75,6 @@ struct HsHeaderV2 { header_size: u32, } -// SAFETY: all bit patterns are valid for this type, and it doesn't use interior mutability. -unsafe impl FromBytes for HsHeaderV2 {} - /// Heavy-Secured Firmware image container. /// /// This provides convenient access to the fields of [`HsHeaderV2`] that are actually indices to @@ -145,6 +141,7 @@ fn signatures_iter(&'a self) -> Result<impl Iterator<Item = BooterSignature<'a>> /// Signature parameters, as defined in the firmware. #[repr(C)] +#[derive(FromBytes)] struct HsSignatureParams { /// Fuse version to use. fuse_ver: u32, @@ -154,9 +151,6 @@ struct HsSignatureParams { ucode_id: u32, } -// SAFETY: all bit patterns are valid for this type, and it doesn't use interior mutability. -unsafe impl FromBytes for HsSignatureParams {} - impl HsSignatureParams { /// Returns the signature parameters contained in `hs_fw`. /// @@ -171,14 +165,14 @@ fn new(hs_fw: &HsFirmwareV2<'_>) -> Result<Self> { hs_fw .fw .get(start..end) - .and_then(Self::from_bytes_copy) + .and_then(|b| Self::read_from_bytes(b).ok()) .ok_or(EINVAL) } } /// Header for code and data load offsets. #[repr(C)] -#[derive(Debug, Clone)] +#[derive(Debug, Clone, FromBytes)] struct HsLoadHeaderV2 { // Offset at which the code starts. os_code_offset: u32, @@ -192,9 +186,6 @@ struct HsLoadHeaderV2 { num_apps: u32, } -// SAFETY: all bit patterns are valid for this type, and it doesn't use interior mutability. -unsafe impl FromBytes for HsLoadHeaderV2 {} - impl HsLoadHeaderV2 { /// Returns the load header contained in `hs_fw`. /// @@ -206,7 +197,7 @@ fn new(hs_fw: &HsFirmwareV2<'_>) -> Result<Self> { /// Header for app code loader. #[repr(C)] -#[derive(Debug, Clone)] +#[derive(Debug, Clone, FromBytes)] struct HsLoadHeaderV2App { /// Offset at which to load the app code. offset: u32, @@ -214,9 +205,6 @@ struct HsLoadHeaderV2App { len: u32, } -// SAFETY: all bit patterns are valid for this type, and it doesn't use interior mutability. -unsafe impl FromBytes for HsLoadHeaderV2App {} - impl HsLoadHeaderV2App { /// Returns the [`HsLoadHeaderV2App`] for app `idx` of `hs_fw`. /// -- 2.34.1
