ARM: head.S: use PC relative insn sequence to calculate PHYS_OFFSET
authorArd Biesheuvel <ardb@kernel.org>
Mon, 14 Sep 2020 08:25:46 +0000 (11:25 +0300)
committerArd Biesheuvel <ardb@kernel.org>
Wed, 28 Oct 2020 16:05:40 +0000 (17:05 +0100)
Replace the open coded arithmetic with a simple adr_l/sub pair. This
removes some open coded arithmetic involving virtual addresses, avoids
literal pools on v7+, and slightly reduces the footprint of the code.

Reviewed-by: Nicolas Pitre <nico@fluxnic.net>
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
arch/arm/kernel/head.S

index 5e031a0..ae0b08b 100644 (file)
@@ -103,10 +103,8 @@ ENTRY(stext)
 #endif
 
 #ifndef CONFIG_XIP_KERNEL
-       adr     r3, 2f
-       ldmia   r3, {r4, r8}
-       sub     r4, r3, r4                      @ (PHYS_OFFSET - PAGE_OFFSET)
-       add     r8, r8, r4                      @ PHYS_OFFSET
+       adr_l   r8, _text                       @ __pa(_text)
+       sub     r8, r8, #TEXT_OFFSET            @ PHYS_OFFSET
 #else
        ldr     r8, =PLAT_PHYS_OFFSET           @ always constant in this case
 #endif
@@ -158,10 +156,6 @@ ENTRY(stext)
 1:     b       __enable_mmu
 ENDPROC(stext)
        .ltorg
-#ifndef CONFIG_XIP_KERNEL
-2:     .long   .
-       .long   PAGE_OFFSET
-#endif
 
 /*
  * Setup the initial page tables.  We only setup the barest