ArmPkg/ArmMmuLib ARM: fix thinko in second level page table handling
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Fri, 4 Jan 2019 18:04:32 +0000 (19:04 +0100)
committerArd Biesheuvel <ard.biesheuvel@linaro.org>
Sun, 13 Jan 2019 16:33:28 +0000 (17:33 +0100)
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>
ArmPkg/Library/ArmMmuLib/Arm/ArmMmuLibCore.c

index b237321..3b3b20a 100644 (file)
@@ -294,8 +294,8 @@ FillTranslationTable (
       PhysicalBase += TT_DESCRIPTOR_SECTION_SIZE;\r
       RemainLength -= TT_DESCRIPTOR_SECTION_SIZE;\r
     } else {\r
-      PageMapLength = MIN (RemainLength, TT_DESCRIPTOR_SECTION_SIZE) -\r
-                      (PhysicalBase % TT_DESCRIPTOR_SECTION_SIZE);\r
+      PageMapLength = MIN (RemainLength, TT_DESCRIPTOR_SECTION_SIZE -\r
+                                         (PhysicalBase % TT_DESCRIPTOR_SECTION_SIZE));\r
 \r
       // Case: Physical address aligned on the Section Size (1MB) && the length\r
       //       does not fill a section\r