Commit 63b85621 authored by Michael Ellerman's avatar Michael Ellerman

powerpc/iommu: Avoid undefined right shift in iommu_range_alloc()

In iommu_range_alloc() we generate a mask by right shifting ~0,
however if the specified alignment is 0 then we right shift by 64,
which is undefined. UBSAN tells us so:

  UBSAN: Undefined behaviour in ../arch/powerpc/kernel/iommu.c:193:35
  shift exponent 64 is too large for 64-bit type 'long unsigned int'

We can avoid it by instead generating the mask with:

  align_mask = (1ull << align_order) - 1;

That will also generate an undefined shift if align_order is 64 or
greater, but that shouldn't be a problem for a while.
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 7efbae90
...@@ -190,7 +190,7 @@ static unsigned long iommu_range_alloc(struct device *dev, ...@@ -190,7 +190,7 @@ static unsigned long iommu_range_alloc(struct device *dev,
unsigned int pool_nr; unsigned int pool_nr;
struct iommu_pool *pool; struct iommu_pool *pool;
align_mask = 0xffffffffffffffffl >> (64 - align_order); align_mask = (1ull << align_order) - 1;
/* This allocator was derived from x86_64's bit string search */ /* This allocator was derived from x86_64's bit string search */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment