[PATCH v2 056/113] ARM64: cpu: setupc: rewrite to be fully PIC

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]


The code resulting from building the barebox ARM64 assembly contains
relocations, which could've been position-independent just as well.

Let's make them truly position independent by turning:

	ldr   x0, =label

	adr_l x0,  label

adr_l is position independent by virtue of being implemented using adrp,
so it's usuable as-is before relocation and requires no manual addition
of get_runtime_offset().

With these changes, only relocation necessary for the ARM64 generic DT
2nd stage is the one needed for get_runtime_offset() to find out
whether barebox has been relocated.

This is one step towards supporting mapping barebox PBL text section
W^X, which precludes relocation entries emitted for code.

With this change applied, there is still a data relocation entry
in assembly code for get_runtime_offset(), but that doesn't bother us
because it's in the data section.

Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx>
 arch/arm/cpu/setupc_64.S | 22 +++++++++-------------
 1 file changed, 9 insertions(+), 13 deletions(-)

diff --git a/arch/arm/cpu/setupc_64.S b/arch/arm/cpu/setupc_64.S
index f38f893be90b..2138c2a600fa 100644
--- a/arch/arm/cpu/setupc_64.S
+++ b/arch/arm/cpu/setupc_64.S
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: GPL-2.0-only */
 #include <linux/linkage.h>
+#include <asm/assembler.h>
 #include <asm/sections.h>
 .section .text.setupc
@@ -10,9 +11,9 @@
 	mov	x15, x30
-	ldr	x0, =__bss_start
+	adr_l	x0, __bss_start
 	mov	x1, #0
-	ldr	x2, =__bss_stop
+	adr_l	x2, __bss_stop
 	sub	x2, x2, x0
 	bl	__memset		/* clear bss */
 	mov	x30, x15
@@ -29,12 +30,12 @@ ENDPROC(setup_c)
 					/* x0: target address */
 #ifdef __PBL__
-	ldr	x2, =__image_end
+	adr_l	x2, __image_end
 	b	1f
-	ldr	x2, =__bss_start
+	adr_l	x2, __bss_start
 	b	1f
@@ -45,18 +46,13 @@ ENTRY(relocate_to_adr)
 	mov	x21, x0
-	bl	get_runtime_offset
-	mov	x5, x0
-	ldr	x0, =_text
-	mov	x20, x0
-	add	x1, x0, x5		/* x1: from address */
+	adr_l	x1, _text
+	mov	x20, x1
 	cmp	x1, x21			/* already at correct address? */
 	beq	1f			/* yes, skip copy to new address */
-	sub	x2, x2, x0		/* x2: size */
+	sub	x2, x2, x1		/* x2: size */
 	mov	x0, x21			/* x0: target */
 	/* adjust return address */
@@ -70,7 +66,7 @@ ENTRY(relocate_to_adr)
 	mov	x0,#0
 	ic	ivau, x0	/* flush icache */
-	ldr	x0,=1f
+	adr_l	x0, 1f
 	sub	x0, x0, x20
 	add	x0, x0, x21
 	br	x0			/* jump to relocated address */

[Index of Archives]     [Linux Embedded]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux