Skip to content

Commit e17b1af

Browse files
Ard BiesheuvelRussell King
authored andcommitted
ARM: 8857/1: efi: enable CP15 DMB instructions before cleaning the cache
The EFI stub is entered with the caches and MMU enabled by the firmware, and once the stub is ready to hand over to the decompressor, we clean and disable the caches. The cache clean routines use CP15 barrier instructions, which can be disabled via SCTLR. Normally, when using the provided cache handling routines to enable the caches and MMU, this bit is enabled as well. However, but since we entered the stub with the caches already enabled, this routine is not executed before we call the cache clean routines, resulting in undefined instruction exceptions if the firmware never enabled this bit. So set the bit explicitly in the EFI entry code, but do so in a way that guarantees that the resulting code can still run on v6 cores as well (which are guaranteed to have CP15 barriers enabled) Cc: <stable@vger.kernel.org> # v4.9+ Acked-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
1 parent c314396 commit e17b1af

File tree

1 file changed

+15
-1
lines changed
  • arch/arm/boot/compressed

1 file changed

+15
-1
lines changed

arch/arm/boot/compressed/head.S

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1438,7 +1438,21 @@ ENTRY(efi_stub_entry)
14381438

14391439
@ Preserve return value of efi_entry() in r4
14401440
mov r4, r0
1441-
bl cache_clean_flush
1441+
1442+
@ our cache maintenance code relies on CP15 barrier instructions
1443+
@ but since we arrived here with the MMU and caches configured
1444+
@ by UEFI, we must check that the CP15BEN bit is set in SCTLR.
1445+
@ Note that this bit is RAO/WI on v6 and earlier, so the ISB in
1446+
@ the enable path will be executed on v7+ only.
1447+
mrc p15, 0, r1, c1, c0, 0 @ read SCTLR
1448+
tst r1, #(1 << 5) @ CP15BEN bit set?
1449+
bne 0f
1450+
orr r1, r1, #(1 << 5) @ CP15 barrier instructions
1451+
mcr p15, 0, r1, c1, c0, 0 @ write SCTLR
1452+
ARM( .inst 0xf57ff06f @ v7+ isb )
1453+
THUMB( isb )
1454+
1455+
0: bl cache_clean_flush
14421456
bl cache_off
14431457

14441458
@ Set parameters for booting zImage according to boot protocol

0 commit comments

Comments
 (0)