Skip to content

Commit

Permalink
ArmPkg/ArmLib: add support for reading the max physical address space…
Browse files Browse the repository at this point in the history
… size

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>
  • Loading branch information
Ard Biesheuvel committed Nov 29, 2018
1 parent 82379bf commit 95d04eb
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 0 deletions.
6 changes: 6 additions & 0 deletions ArmPkg/Include/Library/ArmLib.h
Original file line number Diff line number Diff line change
Expand Up @@ -733,4 +733,10 @@ ArmWriteCntvOff (
UINT64 Val
);

UINTN
EFIAPI
ArmGetPhysicalAddressBits (
VOID
);

#endif // __ARM_LIB__
17 changes: 17 additions & 0 deletions ArmPkg/Library/ArmLib/AArch64/ArmLibSupport.S
Original file line number Diff line number Diff line change
Expand Up @@ -196,4 +196,21 @@ ASM_FUNC(ArmWriteSctlr)
3:msr sctlr_el3, x0
4:ret

ASM_FUNC(ArmGetPhysicalAddressBits)
mrs x0, id_aa64mmfr0_el1
adr x1, .LPARanges
and x0, x0, #0xf
ldrb w0, [x1, x0]
ret

//
// Bits 0..3 of the AA64MFR0_EL1 system register encode the size of the
// physical address space support on this CPU:
// 0 == 32 bits, 1 == 36 bits, etc etc
// 7 and up are reserved
//
.LPARanges:
.byte 32, 36, 40, 42, 44, 48, 52, 0
.byte 0, 0, 0, 0, 0, 0, 0, 0

ASM_FUNCTION_REMOVE_IF_UNREFERENCED
8 changes: 8 additions & 0 deletions ArmPkg/Library/ArmLib/Arm/ArmLibSupport.S
Original file line number Diff line number Diff line change
Expand Up @@ -165,4 +165,12 @@ ASM_FUNC(ArmWriteCpuActlr)
isb
bx lr

ASM_FUNC (ArmGetPhysicalAddressBits)
mrc p15, 0, r0, c0, c1, 4 // MMFR0
and r0, r0, #0xf // VMSA [3:0]
cmp r0, #5 // >= 5 implies LPAE support
movlt r0, #32 // 32 bits if no LPAE
movge r0, #40 // 40 bits if LPAE
bx lr

ASM_FUNCTION_REMOVE_IF_UNREFERENCED
8 changes: 8 additions & 0 deletions ArmPkg/Library/ArmLib/Arm/ArmLibSupport.asm
Original file line number Diff line number Diff line change
Expand Up @@ -169,4 +169,12 @@
isb
bx lr

RVCT_ASM_EXPORT ArmGetPhysicalAddressBits
mrc p15, 0, r0, c0, c1, 4 ; MMFR0
and r0, r0, #0xf ; VMSA [3:0]
cmp r0, #5 ; >= 5 implies LPAE support
movlt r0, #32 ; 32 bits if no LPAE
movge r0, #40 ; 40 bits if LPAE
bx lr

END

0 comments on commit 95d04eb

Please sign in to comment.