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

