Leif,

Why does the current definition strictly require alignment?

I know we have used this for a long time with many compilers passing in 
unaligned pointers to UINT16, UINT32, UINT64 values without any compiler
warnings/errors.

Also, the patch contains locals that are initialized in the declaration
of the local.  We prefer locals to be initialized in the body of the 
function.

Thanks,

Mike

> -----Original Message-----
> From: Leif Lindholm [mailto:[email protected]]
> Sent: Thursday, May 12, 2016 3:22 PM
> To: [email protected]
> Cc: Kinney, Michael D <[email protected]>; Gao, Liming
> <[email protected]>; Ard Biesheuvel <[email protected]>
> Subject: [RFC] MdePkg: BaseLib: don't use aligned pointers for unaligned 
> accessors
> 
> The ReadUnaligned##/WriteUnaligned## functions provide a portable way of
> accessing potentially unaligned locations, but the prototypes in
> BaseLib.h all specify strictly aligned pointers.
> 
> Change the prototypes as well as the implementations across Ia32/X64,
> ARM/AArch64 and IPF to use VOID * pointers instead.
> 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Leif Lindholm <[email protected]>
> ---
> 
> Built and tested for ArmVirtPkg for AArch64/ARM DEBUG/RELEASE.
> Build tested only for OvmfPkg for Ia32/X64 DEBUG/RELEASE.
> Not tested at all for IPF.
> 
> I am not entirely convinced by the BitFieldWrite32 logic in
> WriteUnaligned24, but this patch is not the place to fix this.
> 
> I am also not convinced there is much point in keeping separate
> implementations for IPF and ARM* - the optimization issues mentioned
> in the git log could even have been affected by the incorrect
> pointer types.
> 
> This is the first patch triggered by my CLANG -Weverything exercises
> earlier this year. More to come.
> 
>  MdePkg/Include/Library/BaseLib.h       | 16 ++++++------
>  MdePkg/Library/BaseLib/Arm/Unaligned.c | 16 ++++++------
>  MdePkg/Library/BaseLib/Ipf/Unaligned.c | 16 ++++++------
>  MdePkg/Library/BaseLib/Unaligned.c     | 48 
> ++++++++++++++++++++++------------
>  4 files changed, 56 insertions(+), 40 deletions(-)
> 
> diff --git a/MdePkg/Include/Library/BaseLib.h 
> b/MdePkg/Include/Library/BaseLib.h
> index c41fa78..133656a 100644
> --- a/MdePkg/Include/Library/BaseLib.h
> +++ b/MdePkg/Include/Library/BaseLib.h
> @@ -2549,7 +2549,7 @@ DivS64x64Remainder (
>  UINT16
>  EFIAPI
>  ReadUnaligned16 (
> -  IN CONST UINT16              *Buffer
> +  IN CONST VOID                *Buffer
>    );
> 
> 
> @@ -2571,7 +2571,7 @@ ReadUnaligned16 (
>  UINT16
>  EFIAPI
>  WriteUnaligned16 (
> -  OUT UINT16                    *Buffer,
> +  OUT VOID                      *Buffer,
>    IN  UINT16                    Value
>    );
> 
> @@ -2592,7 +2592,7 @@ WriteUnaligned16 (
>  UINT32
>  EFIAPI
>  ReadUnaligned24 (
> -  IN CONST UINT32              *Buffer
> +  IN CONST VOID                *Buffer
>    );
> 
> 
> @@ -2614,7 +2614,7 @@ ReadUnaligned24 (
>  UINT32
>  EFIAPI
>  WriteUnaligned24 (
> -  OUT UINT32                    *Buffer,
> +  OUT VOID                      *Buffer,
>    IN  UINT32                    Value
>    );
> 
> @@ -2635,7 +2635,7 @@ WriteUnaligned24 (
>  UINT32
>  EFIAPI
>  ReadUnaligned32 (
> -  IN CONST UINT32              *Buffer
> +  IN CONST VOID                *Buffer
>    );
> 
> 
> @@ -2657,7 +2657,7 @@ ReadUnaligned32 (
>  UINT32
>  EFIAPI
>  WriteUnaligned32 (
> -  OUT UINT32                    *Buffer,
> +  OUT VOID                      *Buffer,
>    IN  UINT32                    Value
>    );
> 
> @@ -2678,7 +2678,7 @@ WriteUnaligned32 (
>  UINT64
>  EFIAPI
>  ReadUnaligned64 (
> -  IN CONST UINT64              *Buffer
> +  IN CONST VOID                *Buffer
>    );
> 
> 
> @@ -2700,7 +2700,7 @@ ReadUnaligned64 (
>  UINT64
>  EFIAPI
>  WriteUnaligned64 (
> -  OUT UINT64                    *Buffer,
> +  OUT VOID                      *Buffer,
>    IN  UINT64                    Value
>    );
> 
> diff --git a/MdePkg/Library/BaseLib/Arm/Unaligned.c
> b/MdePkg/Library/BaseLib/Arm/Unaligned.c
> index 34f1732..ef9efbc 100644
> --- a/MdePkg/Library/BaseLib/Arm/Unaligned.c
> +++ b/MdePkg/Library/BaseLib/Arm/Unaligned.c
> @@ -33,7 +33,7 @@
>  UINT16
>  EFIAPI
>  ReadUnaligned16 (
> -  IN CONST UINT16              *Buffer
> +  IN CONST VOID                *Buffer
>    )
>  {
>    volatile UINT8 LowerByte;
> @@ -65,7 +65,7 @@ ReadUnaligned16 (
>  UINT16
>  EFIAPI
>  WriteUnaligned16 (
> -  OUT UINT16                    *Buffer,
> +  OUT VOID                      *Buffer,
>    IN  UINT16                    Value
>    )
>  {
> @@ -93,7 +93,7 @@ WriteUnaligned16 (
>  UINT32
>  EFIAPI
>  ReadUnaligned24 (
> -  IN CONST UINT32              *Buffer
> +  IN CONST VOID                *Buffer
>    )
>  {
>    ASSERT (Buffer != NULL);
> @@ -122,7 +122,7 @@ ReadUnaligned24 (
>  UINT32
>  EFIAPI
>  WriteUnaligned24 (
> -  OUT UINT32                    *Buffer,
> +  OUT VOID                      *Buffer,
>    IN  UINT32                    Value
>    )
>  {
> @@ -149,7 +149,7 @@ WriteUnaligned24 (
>  UINT32
>  EFIAPI
>  ReadUnaligned32 (
> -  IN CONST UINT32              *Buffer
> +  IN CONST VOID                *Buffer
>    )
>  {
>    UINT16  LowerBytes;
> @@ -181,7 +181,7 @@ ReadUnaligned32 (
>  UINT32
>  EFIAPI
>  WriteUnaligned32 (
> -  OUT UINT32                    *Buffer,
> +  OUT VOID                      *Buffer,
>    IN  UINT32                    Value
>    )
>  {
> @@ -208,7 +208,7 @@ WriteUnaligned32 (
>  UINT64
>  EFIAPI
>  ReadUnaligned64 (
> -  IN CONST UINT64              *Buffer
> +  IN CONST VOID                *Buffer
>    )
>  {
>    UINT32  LowerBytes;
> @@ -240,7 +240,7 @@ ReadUnaligned64 (
>  UINT64
>  EFIAPI
>  WriteUnaligned64 (
> -  OUT UINT64                    *Buffer,
> +  OUT VOID                      *Buffer,
>    IN  UINT64                    Value
>    )
>  {
> diff --git a/MdePkg/Library/BaseLib/Ipf/Unaligned.c
> b/MdePkg/Library/BaseLib/Ipf/Unaligned.c
> index 7d0d8dd..5ba8029 100644
> --- a/MdePkg/Library/BaseLib/Ipf/Unaligned.c
> +++ b/MdePkg/Library/BaseLib/Ipf/Unaligned.c
> @@ -30,7 +30,7 @@
>  UINT16
>  EFIAPI
>  ReadUnaligned16 (
> -  IN CONST UINT16              *Buffer
> +  IN CONST VOID                *Buffer
>    )
>  {
>    ASSERT (Buffer != NULL);
> @@ -56,7 +56,7 @@ ReadUnaligned16 (
>  UINT16
>  EFIAPI
>  WriteUnaligned16 (
> -  OUT UINT16                    *Buffer,
> +  OUT VOID                      *Buffer,
>    IN  UINT16                    Value
>    )
>  {
> @@ -84,7 +84,7 @@ WriteUnaligned16 (
>  UINT32
>  EFIAPI
>  ReadUnaligned24 (
> -  IN CONST UINT32              *Buffer
> +  IN CONST VOID                *Buffer
>    )
>  {
>    ASSERT (Buffer != NULL);
> @@ -113,7 +113,7 @@ ReadUnaligned24 (
>  UINT32
>  EFIAPI
>  WriteUnaligned24 (
> -  OUT UINT32                    *Buffer,
> +  OUT VOID                      *Buffer,
>    IN  UINT32                    Value
>    )
>  {
> @@ -140,7 +140,7 @@ WriteUnaligned24 (
>  UINT32
>  EFIAPI
>  ReadUnaligned32 (
> -  IN CONST UINT32              *Buffer
> +  IN CONST VOID                *Buffer
>    )
>  {
>    UINT16  LowerBytes;
> @@ -172,7 +172,7 @@ ReadUnaligned32 (
>  UINT32
>  EFIAPI
>  WriteUnaligned32 (
> -  OUT UINT32                    *Buffer,
> +  OUT VOID                      *Buffer,
>    IN  UINT32                    Value
>    )
>  {
> @@ -199,7 +199,7 @@ WriteUnaligned32 (
>  UINT64
>  EFIAPI
>  ReadUnaligned64 (
> -  IN CONST UINT64              *Buffer
> +  IN CONST VOID                *Buffer
>    )
>  {
>    UINT32  LowerBytes;
> @@ -231,7 +231,7 @@ ReadUnaligned64 (
>  UINT64
>  EFIAPI
>  WriteUnaligned64 (
> -  OUT UINT64                    *Buffer,
> +  OUT VOID                      *Buffer,
>    IN  UINT64                    Value
>    )
>  {
> diff --git a/MdePkg/Library/BaseLib/Unaligned.c 
> b/MdePkg/Library/BaseLib/Unaligned.c
> index 68dafa6..ed58861 100644
> --- a/MdePkg/Library/BaseLib/Unaligned.c
> +++ b/MdePkg/Library/BaseLib/Unaligned.c
> @@ -32,12 +32,14 @@
>  UINT16
>  EFIAPI
>  ReadUnaligned16 (
> -  IN CONST UINT16              *Buffer
> +  IN CONST VOID                *Buffer
>    )
>  {
> +  CONST UINT16 *Input = Buffer;
> +
>    ASSERT (Buffer != NULL);
> 
> -  return *Buffer;
> +  return *Input;
>  }
> 
>  /**
> @@ -58,13 +60,15 @@ ReadUnaligned16 (
>  UINT16
>  EFIAPI
>  WriteUnaligned16 (
> -  OUT UINT16                    *Buffer,
> +  OUT VOID                      *Buffer,
>    IN  UINT16                    Value
>    )
>  {
> +  UINT16 *Output = Buffer;
> +
>    ASSERT (Buffer != NULL);
> 
> -  return *Buffer = Value;
> +  return *Output = Value;
>  }
> 
>  /**
> @@ -83,12 +87,14 @@ WriteUnaligned16 (
>  UINT32
>  EFIAPI
>  ReadUnaligned24 (
> -  IN CONST UINT32              *Buffer
> +  IN CONST VOID                *Buffer
>    )
>  {
> +  CONST UINT32 *Input = Buffer;
> +
>    ASSERT (Buffer != NULL);
> 
> -  return *Buffer & 0xffffff;
> +  return *Input & 0xffffff;
>  }
> 
>  /**
> @@ -109,13 +115,15 @@ ReadUnaligned24 (
>  UINT32
>  EFIAPI
>  WriteUnaligned24 (
> -  OUT UINT32                    *Buffer,
> +  OUT VOID                      *Buffer,
>    IN  UINT32                    Value
>    )
>  {
> +  UINT32 *Output = Buffer;
> +
>    ASSERT (Buffer != NULL);
> 
> -  *Buffer = BitFieldWrite32 (*Buffer, 0, 23, Value);
> +  *Output = BitFieldWrite32 (*Output, 0, 23, Value);
>    return Value;
>  }
> 
> @@ -135,12 +143,14 @@ WriteUnaligned24 (
>  UINT32
>  EFIAPI
>  ReadUnaligned32 (
> -  IN CONST UINT32              *Buffer
> +  IN CONST VOID                *Buffer
>    )
>  {
> +  CONST UINT32 *Input = Buffer;
> +
>    ASSERT (Buffer != NULL);
> 
> -  return *Buffer;
> +  return *Input;
>  }
> 
>  /**
> @@ -161,13 +171,15 @@ ReadUnaligned32 (
>  UINT32
>  EFIAPI
>  WriteUnaligned32 (
> -  OUT UINT32                    *Buffer,
> +  OUT VOID                      *Buffer,
>    IN  UINT32                    Value
>    )
>  {
> +  UINT32 *Output = Buffer;
> +
>    ASSERT (Buffer != NULL);
> 
> -  return *Buffer = Value;
> +  return *Output = Value;
>  }
> 
>  /**
> @@ -186,12 +198,14 @@ WriteUnaligned32 (
>  UINT64
>  EFIAPI
>  ReadUnaligned64 (
> -  IN CONST UINT64              *Buffer
> +  IN CONST VOID                *Buffer
>    )
>  {
> +  CONST UINT64 *Input = Buffer;
> +
>    ASSERT (Buffer != NULL);
> 
> -  return *Buffer;
> +  return *Input;
>  }
> 
>  /**
> @@ -212,11 +226,13 @@ ReadUnaligned64 (
>  UINT64
>  EFIAPI
>  WriteUnaligned64 (
> -  OUT UINT64                    *Buffer,
> +  OUT VOID                      *Buffer,
>    IN  UINT64                    Value
>    )
>  {
> +  UINT64 *Output = Buffer;
> +
>    ASSERT (Buffer != NULL);
> 
> -  return *Buffer = Value;
> +  return *Output = Value;
>  }
> --
> 2.1.4

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to