summaryrefslogtreecommitdiffstats
path: root/ArmPkg
diff options
context:
space:
mode:
authorArd Biesheuvel <ard.biesheuvel@linaro.org>2019-01-04 19:04:32 +0100
committerArd Biesheuvel <ard.biesheuvel@linaro.org>2019-01-13 17:33:28 +0100
commit28ce4cb3590bc3aaa91c3be75429d4e8722415e2 (patch)
tree4d8794b0a599c93d733ee220de2ea587ab0cea39 /ArmPkg
parente3ad54faa855fda3b3e145f54d37ee57e3a4def1 (diff)
downloadedk2-28ce4cb3590bc3aaa91c3be75429d4e8722415e2.tar.gz
edk2-28ce4cb3590bc3aaa91c3be75429d4e8722415e2.tar.bz2
edk2-28ce4cb3590bc3aaa91c3be75429d4e8722415e2.zip
ArmPkg/ArmMmuLib ARM: fix thinko in second level page table handling
PopulateLevel2PageTable () is invoked for [parts of] mappings that start or end on a non-1 MB aligned address (or both). The size of the mapping depends on both the start address modulo 1 MB and the length of the mapping, but the logic that calculates this size is flawed: subtracting 'start address modulo 1 MB' could result in a negative value for the remaining length, which is obviously wrong. So instead, take either RemainLength, or the rest of the 1 MB block, whichever is smaller. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org> Tested-by: Eugene Cohen <eugene@hp.com>
Diffstat (limited to 'ArmPkg')
-rw-r--r--ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c b/ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c
index b237321a8d..3b3b20aa9b 100644
--- a/ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c
+++ b/ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c
@@ -294,8 +294,8 @@ FillTranslationTable (
PhysicalBase += TT_DESCRIPTOR_SECTION_SIZE;
RemainLength -= TT_DESCRIPTOR_SECTION_SIZE;
} else {
- PageMapLength = MIN (RemainLength, TT_DESCRIPTOR_SECTION_SIZE) -
- (PhysicalBase % TT_DESCRIPTOR_SECTION_SIZE);
+ PageMapLength = MIN (RemainLength, TT_DESCRIPTOR_SECTION_SIZE -
+ (PhysicalBase % TT_DESCRIPTOR_SECTION_SIZE));
// Case: Physical address aligned on the Section Size (1MB) && the length
// does not fill a section