arm64: Set MMU granule sizes to a consistent value in bootloader.

Change-Id: Ia36885df6dec5ac0ac9ce41271115aa7a8c3e6df
Reviewed-on: https://review.haiku-os.org/c/haiku/+/8418
Reviewed-by: waddlesplash <[email protected]>
Tested-by: Commit checker robot <[email protected]>
This commit is contained in:
Owen Anderson
2024-09-30 15:48:51 +00:00
committed by waddlesplash
parent d2397007a1
commit df59dfec3b
3 changed files with 13 additions and 2 deletions
@@ -607,10 +607,17 @@
#define TCR_IPS_44BIT (4 << TCR_IPS_SHIFT) #define TCR_IPS_44BIT (4 << TCR_IPS_SHIFT)
#define TCR_IPS_48BIT (5 << TCR_IPS_SHIFT) #define TCR_IPS_48BIT (5 << TCR_IPS_SHIFT)
#define TCR_TG0_SHIFT 14
#define TCR_TG0_4K (0 << TCR_TG0_SHIFT)
#define TCR_TG0_64K (1 << TCR_TG0_SHIFT)
#define TCR_TG0_16K (2 << TCR_TG0_SHIFT)
#define TCR_TG0_MASK (3 << TCR_TG0_SHIFT)
#define TCR_TG1_SHIFT 30 #define TCR_TG1_SHIFT 30
#define TCR_TG1_16K (1 << TCR_TG1_SHIFT) #define TCR_TG1_16K (1 << TCR_TG1_SHIFT)
#define TCR_TG1_4K (2 << TCR_TG1_SHIFT) #define TCR_TG1_4K (2 << TCR_TG1_SHIFT)
#define TCR_TG1_64K (3 << TCR_TG1_SHIFT) #define TCR_TG1_64K (3 << TCR_TG1_SHIFT)
#define TCR_TG1_MASK (3 << TCR_TG1_SHIFT)
#define TCR_SH1_SHIFT 28 #define TCR_SH1_SHIFT 28
#define TCR_SH1_IS (0x3UL << TCR_SH1_SHIFT) #define TCR_SH1_IS (0x3UL << TCR_SH1_SHIFT)
@@ -204,8 +204,6 @@ static inline uint32 arch_mmu_user_address_bits()
static inline uint32 arch_mmu_user_granule() static inline uint32 arch_mmu_user_granule()
{ {
static constexpr uint64 TCR_TG0_SHIFT = 14u;
uint64 reg = _arch_mmu_get_tcr(); uint64 reg = _arch_mmu_get_tcr();
return ((reg >> TCR_TG0_SHIFT) & TG_MASK); return ((reg >> TCR_TG0_SHIFT) & TG_MASK);
} }
@@ -122,6 +122,12 @@ void arch_mmu_setup_EL1(uint64 tcr) {
// TODO: Compiler dependency? // TODO: Compiler dependency?
tcr |= TCR_T1SZ(__builtin_popcountl(KERNEL_BASE)); tcr |= TCR_T1SZ(__builtin_popcountl(KERNEL_BASE));
// Set granule sizes to 4KB
tcr &= ~TCR_TG0_MASK;
tcr |= TCR_TG0_4K;
tcr &= ~TCR_TG1_MASK;
tcr |= TCR_TG1_4K;
// Set the maximum PA size to the maximum supported by the hardware. // Set the maximum PA size to the maximum supported by the hardware.
uint64_t pa_size = READ_SPECIALREG(ID_AA64MMFR0_EL1) & ID_AA64MMFR0_PA_RANGE_MASK; uint64_t pa_size = READ_SPECIALREG(ID_AA64MMFR0_EL1) & ID_AA64MMFR0_PA_RANGE_MASK;