On Tue, Apr 19, 2016 at 04:55:31PM +0200, Ard Biesheuvel wrote:
> We manage to use both an AND operation with 'gCacheAlignment - 1' and a
> modulo operation with 'gCacheAlignment' in the same compound if statement.
> Since gCacheAlignment is a global of which the compiler cannot guarantee
> that it is a power of two,

Are you saying this is an "undefined behaviour" disaster waiting to
happen?

> simply use the AND version, and use it against
> the bitwise OR of the two values to be tested.
> 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Ard Biesheuvel <[email protected]>
> ---
>  ArmPkg/Library/ArmDmaLib/ArmDmaLib.c | 3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)
> 
> diff --git a/ArmPkg/Library/ArmDmaLib/ArmDmaLib.c 
> b/ArmPkg/Library/ArmDmaLib/ArmDmaLib.c
> index 1e6b288b10b9..834afdba10ef 100644
> --- a/ArmPkg/Library/ArmDmaLib/ArmDmaLib.c
> +++ b/ArmPkg/Library/ArmDmaLib/ArmDmaLib.c
> @@ -92,8 +92,7 @@ DmaMap (
>  
>    *Mapping = Map;
>  
> -  if ((((UINTN)HostAddress & (gCacheAlignment - 1)) != 0) ||
> -      ((*NumberOfBytes % gCacheAlignment) != 0)) {
> +  if ((((UINTN)HostAddress | *NumberOfBytes) & (gCacheAlignment - 1)) != 0) {

While the above is correct code, and less verbose, I am a bear of very
little brain, and OR:ing an address with a counter makes it hurt.

Could the above instead be (more verbose but hopefully not relevantly
less efficient with a halfway decent compiler):
  if ((((UINTN)HostAddress & (gCacheAlignment - 1)) != 0) ||
      (*NumberOfBytes & (gCacheAlignment - 1) != 0))

(It would have the benefit of making the diffstat immediately obvious.)

>  
>      // Get the cacheability of the region
>      Status = gDS->GetMemorySpaceDescriptor (*DeviceAddress, &GcdDescriptor);
> -- 
> 2.5.0
> 
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to