ArmPkg/ArmLib: add support for reading the max physical address space size
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Fri, 23 Nov 2018 12:14:27 +0000 (13:14 +0100)
committerArd Biesheuvel <ard.biesheuvel@linaro.org>
Thu, 29 Nov 2018 17:54:09 +0000 (18:54 +0100)
Add a helper function that returns the maximum physical address space
size as supported by the current CPU.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Acked-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
ArmPkg/Include/Library/ArmLib.h
ArmPkg/Library/ArmLib/AArch64/ArmLibSupport.S
ArmPkg/Library/ArmLib/Arm/ArmLibSupport.S
ArmPkg/Library/ArmLib/Arm/ArmLibSupport.asm

index ffda50e..9a804c1 100644 (file)
@@ -733,4 +733,10 @@ ArmWriteCntvOff (
   UINT64   Val\r
   );\r
 \r
+UINTN\r
+EFIAPI\r
+ArmGetPhysicalAddressBits (\r
+  VOID\r
+  );\r
+\r
 #endif // __ARM_LIB__\r
index 1ef2f61..b7173e0 100644 (file)
@@ -196,4 +196,21 @@ ASM_FUNC(ArmWriteSctlr)
 3:msr   sctlr_el3, x0\r
 4:ret\r
 \r
+ASM_FUNC(ArmGetPhysicalAddressBits)\r
+  mrs   x0, id_aa64mmfr0_el1\r
+  adr   x1, .LPARanges\r
+  and   x0, x0, #0xf\r
+  ldrb  w0, [x1, x0]\r
+  ret\r
+\r
+//\r
+// Bits 0..3 of the AA64MFR0_EL1 system register encode the size of the\r
+// physical address space support on this CPU:\r
+// 0 == 32 bits, 1 == 36 bits, etc etc\r
+// 7 and up are reserved\r
+//\r
+.LPARanges:\r
+  .byte 32, 36, 40, 42, 44, 48, 52,  0\r
+  .byte  0,  0,  0,  0,  0,  0,  0,  0\r
+\r
 ASM_FUNCTION_REMOVE_IF_UNREFERENCED\r
index f2a5176..0e9f9d0 100644 (file)
@@ -165,4 +165,12 @@ ASM_FUNC(ArmWriteCpuActlr)
   isb\r
   bx      lr\r
 \r
+ASM_FUNC (ArmGetPhysicalAddressBits)\r
+  mrc     p15, 0, r0, c0, c1, 4   // MMFR0\r
+  and     r0, r0, #0xf            // VMSA [3:0]\r
+  cmp     r0, #5                  // >= 5 implies LPAE support\r
+  movlt   r0, #32                 // 32 bits if no LPAE\r
+  movge   r0, #40                 // 40 bits if LPAE\r
+  bx      lr\r
+\r
 ASM_FUNCTION_REMOVE_IF_UNREFERENCED\r
index 219140c..3eb5287 100644 (file)
   isb\r
   bx      lr\r
 \r
+ RVCT_ASM_EXPORT ArmGetPhysicalAddressBits\r
+  mrc     p15, 0, r0, c0, c1, 4   ; MMFR0\r
+  and     r0, r0, #0xf            ; VMSA [3:0]\r
+  cmp     r0, #5                  ; >= 5 implies LPAE support\r
+  movlt   r0, #32                 ; 32 bits if no LPAE\r
+  movge   r0, #40                 ; 40 bits if LPAE\r
+  bx      lr\r
+\r
   END\r