diff mbox series

[edk2] ArmPkg/ArmMmuLib ARM: trim high memory regions instead of rejecting them

Message ID 20190128162332.10894-1-ard.biesheuvel@linaro.org
State Accepted
Commit 66509f90fc6636f22e4ea9d6d11655b2f9268b91
Headers show
Series [edk2] ArmPkg/ArmMmuLib ARM: trim high memory regions instead of rejecting them | expand

Commit Message

Ard Biesheuvel Jan. 28, 2019, 4:23 p.m. UTC
ArmSetMemoryAttributes() still chokes in some cases, i.e., when the
length of the region exceeds 4 GB, the subtraction overflows, which
results in the region being misidentified as being 32-bit addressable.

Let's update the logic to trim the length to what we can address with
32 bits. This fixes the issue, and also deals with the issue where an
entire region is disregarded if part of it exceeds beyond what we can
map with 32 bits.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

---
 ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

-- 
2.20.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Comments

Leif Lindholm Jan. 28, 2019, 6:11 p.m. UTC | #1
On Mon, Jan 28, 2019 at 05:23:32PM +0100, Ard Biesheuvel wrote:
> ArmSetMemoryAttributes() still chokes in some cases, i.e., when the

> length of the region exceeds 4 GB, the subtraction overflows, which

> results in the region being misidentified as being 32-bit addressable.

> 

> Let's update the logic to trim the length to what we can address with

> 32 bits. This fixes the issue, and also deals with the issue where an

> entire region is disregarded if part of it exceeds beyond what we can

> map with 32 bits.

> 

> Contributed-under: TianoCore Contribution Agreement 1.1

> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>


Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>


> ---

>  ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c | 3 ++-

>  1 file changed, 2 insertions(+), 1 deletion(-)

> 

> diff --git a/ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c b/ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c

> index bffab83d4fd0..baa085c3849a 100644

> --- a/ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c

> +++ b/ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c

> @@ -744,10 +744,11 @@ ArmSetMemoryAttributes (

>    UINT64        ChunkLength;

>    BOOLEAN       FlushTlbs;

>  

> -  if (BaseAddress > (UINT64)MAX_ADDRESS - Length + 1) {

> +  if (BaseAddress > (UINT64)MAX_ADDRESS) {

>      return EFI_UNSUPPORTED;

>    }

>  

> +  Length = MIN (Length, (UINT64)MAX_ADDRESS - BaseAddress + 1);

>    if (Length == 0) {

>      return EFI_SUCCESS;

>    }

> -- 

> 2.20.1

> 

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Ard Biesheuvel Jan. 28, 2019, 7:03 p.m. UTC | #2
On Mon, 28 Jan 2019 at 19:11, Leif Lindholm <leif.lindholm@linaro.org> wrote:
>

> On Mon, Jan 28, 2019 at 05:23:32PM +0100, Ard Biesheuvel wrote:

> > ArmSetMemoryAttributes() still chokes in some cases, i.e., when the

> > length of the region exceeds 4 GB, the subtraction overflows, which

> > results in the region being misidentified as being 32-bit addressable.

> >

> > Let's update the logic to trim the length to what we can address with

> > 32 bits. This fixes the issue, and also deals with the issue where an

> > entire region is disregarded if part of it exceeds beyond what we can

> > map with 32 bits.

> >

> > Contributed-under: TianoCore Contribution Agreement 1.1

> > Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

>

> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

>


Thanks

Pushed as 9a00a7164a39..66509f90fc66

> > ---

> >  ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c | 3 ++-

> >  1 file changed, 2 insertions(+), 1 deletion(-)

> >

> > diff --git a/ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c b/ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c

> > index bffab83d4fd0..baa085c3849a 100644

> > --- a/ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c

> > +++ b/ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c

> > @@ -744,10 +744,11 @@ ArmSetMemoryAttributes (

> >    UINT64        ChunkLength;

> >    BOOLEAN       FlushTlbs;

> >

> > -  if (BaseAddress > (UINT64)MAX_ADDRESS - Length + 1) {

> > +  if (BaseAddress > (UINT64)MAX_ADDRESS) {

> >      return EFI_UNSUPPORTED;

> >    }

> >

> > +  Length = MIN (Length, (UINT64)MAX_ADDRESS - BaseAddress + 1);

> >    if (Length == 0) {

> >      return EFI_SUCCESS;

> >    }

> > --

> > 2.20.1

> >

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
diff mbox series

Patch

diff --git a/ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c b/ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c
index bffab83d4fd0..baa085c3849a 100644
--- a/ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c
+++ b/ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c
@@ -744,10 +744,11 @@  ArmSetMemoryAttributes (
   UINT64        ChunkLength;
   BOOLEAN       FlushTlbs;
 
-  if (BaseAddress > (UINT64)MAX_ADDRESS - Length + 1) {
+  if (BaseAddress > (UINT64)MAX_ADDRESS) {
     return EFI_UNSUPPORTED;
   }
 
+  Length = MIN (Length, (UINT64)MAX_ADDRESS - BaseAddress + 1);
   if (Length == 0) {
     return EFI_SUCCESS;
   }