]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
armv8: Fix TCR 64-bit writes
authorAndre Przywara <andre.przywara@arm.com>
Mon, 9 May 2022 16:08:49 +0000 (17:08 +0100)
committerTom Rini <trini@konsulko.com>
Fri, 3 Jun 2022 15:15:24 +0000 (11:15 -0400)
The AArch64 TCR_ELx register is a 64-bit register, and many newer
architecture features use bits in the upper half. So far U-Boot was
igorant of those bits, trying to leave them alone.
However, in an effort to set bit 31 to 1, it failed doing so, because
the compiler sign-extended "1 << 31", so that all bits[63:31] got set.

Older ARMv8.0 cores don't define anything dangerous up there, but newer
architecture revisions do, and setting all those bits will end badly:
=================
$ qemu-system-aarch64 -cpu max ....
U-Boot 2022.07-rc1 (May 09 2022 - 15:21:00 +0100)

DRAM:  1.5 GiB
=================  (hangs here)

Defining TCR_ELx_RSVD to "1U << 31" avoids the sign-extension, so all
upper bits stay at a safe 0 value. This means no more surprises when
U-Boot runs on a more capable CPU core.

Reported-by: Balaji Anandapadmanaban <Balaji.Anandapadmanaban@arm.com>
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Reviewed-by: Peng Fan <peng.fan@nxp.com>
Tested-by: Peter Collingbourne <pcc@google.com>
Reviewed-by: Peter Collingbourne <pcc@google.com>
arch/arm/include/asm/armv8/mmu.h

index fc97c55114682bb6e061a8db48538d7a58b28e67..c36b2cf5a5896f357733c1f2eecd1cc1cb58dfa5 100644 (file)
@@ -99,9 +99,9 @@
 #define TCR_TG0_16K            (2 << 14)
 #define TCR_EPD1_DISABLE       (1 << 23)
 
-#define TCR_EL1_RSVD           (1 << 31)
-#define TCR_EL2_RSVD           (1 << 31 | 1 << 23)
-#define TCR_EL3_RSVD           (1 << 31 | 1 << 23)
+#define TCR_EL1_RSVD           (1U << 31)
+#define TCR_EL2_RSVD           (1U << 31 | 1 << 23)
+#define TCR_EL3_RSVD           (1U << 31 | 1 << 23)
 
 #ifndef __ASSEMBLY__
 static inline void set_ttbr_tcr_mair(int el, u64 table, u64 tcr, u64 attr)