* [PATCH v2 0/2] armv7: Add Position Independent Execution support
@ 2021-08-03 2:50 Chia-Wei Wang
2021-08-03 2:50 ` [PATCH v2 1/2] arm: Fix option dependency with Kconfig language Chia-Wei Wang
2021-08-03 2:50 ` [PATCH v2 2/2] armv7: Add Position Independent Execution support Chia-Wei Wang
0 siblings, 2 replies; 5+ messages in thread
From: Chia-Wei Wang @ 2021-08-03 2:50 UTC (permalink / raw)
To: trini, u-boot
Add PIE support for ARMv7 platform.
v2:
- Fix Kconfig option dependices using Kconfig language
Chia-Wei Wang (2):
arm: Fix option dependency with Kconfig language
armv7: Add Position Independent Execution support
arch/arm/Kconfig | 9 ++++----
arch/arm/cpu/armv7/start.S | 43 ++++++++++++++++++++++++++++++++++++++
arch/arm/lib/crt0.S | 11 ++++++++++
arch/arm/lib/relocate.S | 35 ++++++++++++++++++++++---------
4 files changed, 84 insertions(+), 14 deletions(-)
--
2.17.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 1/2] arm: Fix option dependency with Kconfig language
2021-08-03 2:50 [PATCH v2 0/2] armv7: Add Position Independent Execution support Chia-Wei Wang
@ 2021-08-03 2:50 ` Chia-Wei Wang
2021-09-02 22:41 ` Tom Rini
2021-08-03 2:50 ` [PATCH v2 2/2] armv7: Add Position Independent Execution support Chia-Wei Wang
1 sibling, 1 reply; 5+ messages in thread
From: Chia-Wei Wang @ 2021-08-03 2:50 UTC (permalink / raw)
To: trini, u-boot
Use Kconfig 'depends on' instead of #if macro to
express the option depdencies.
Signed-off-by: Chia-Wei Wang <chiawei_wang@aspeedtech.com>
---
arch/arm/Kconfig | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 2b7b625705..c142eaa5c1 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -9,9 +9,9 @@ config ARM64
select PHYS_64BIT
select SYS_CACHE_SHIFT_6
-if ARM64
config POSITION_INDEPENDENT
bool "Generate position-independent pre-relocation code"
+ depends on ARM64
help
U-Boot expects to be linked to a specific hard-coded address, and to
be loaded to and run from that address. This option lifts that
@@ -22,6 +22,7 @@ config POSITION_INDEPENDENT
config INIT_SP_RELATIVE
bool "Specify the early stack pointer relative to the .bss section"
+ depends on ARM64
default n if ARCH_QEMU
default y if POSITION_INDEPENDENT
help
@@ -37,6 +38,7 @@ config INIT_SP_RELATIVE
config SYS_INIT_SP_BSS_OFFSET
int "Early stack offset from the .bss base address"
+ depends on ARM64
depends on INIT_SP_RELATIVE
default 524288
help
@@ -46,6 +48,7 @@ config SYS_INIT_SP_BSS_OFFSET
do not overlap any appended DTB.
config LINUX_KERNEL_IMAGE_HEADER
+ depends on ARM64
bool
help
Place a Linux kernel image header at the start of the U-Boot binary.
@@ -54,14 +57,12 @@ config LINUX_KERNEL_IMAGE_HEADER
image header reports the amount of memory (BSS and similar) that
U-Boot needs to use, but which isn't part of the binary.
-if LINUX_KERNEL_IMAGE_HEADER
config LNX_KRNL_IMG_TEXT_OFFSET_BASE
+ depends on LINUX_KERNEL_IMAGE_HEADER
hex
help
The value subtracted from CONFIG_SYS_TEXT_BASE to calculate the
TEXT_OFFSET value written to the Linux kernel image header.
-endif
-endif
config GIC_V3_ITS
bool "ARM GICV3 ITS"
--
2.17.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v2 2/2] armv7: Add Position Independent Execution support
2021-08-03 2:50 [PATCH v2 0/2] armv7: Add Position Independent Execution support Chia-Wei Wang
2021-08-03 2:50 ` [PATCH v2 1/2] arm: Fix option dependency with Kconfig language Chia-Wei Wang
@ 2021-08-03 2:50 ` Chia-Wei Wang
2021-09-02 22:41 ` Tom Rini
1 sibling, 1 reply; 5+ messages in thread
From: Chia-Wei Wang @ 2021-08-03 2:50 UTC (permalink / raw)
To: trini, u-boot
A U-Boot image could be loaded and executed at a different
location than it was linked at.
For example, Aspeed takes a stable release version of U-Boot image
as the golden one for recovery purposes. When the primary storage
such as flash is corrupted, the golden image would be loaded to any
SRAM/DRAM address on demands through ethernet/UART/etc and run for
rescue.
To deal with this condition, the PIE is needed as there is only one
signed, golden image, which could be however executed at different
places.
This patch adds the PIE support for ARMv7 platform.
Signed-off-by: Chia-Wei Wang <chiawei_wang@aspeedtech.com>
---
arch/arm/Kconfig | 2 +-
arch/arm/cpu/armv7/start.S | 43 ++++++++++++++++++++++++++++++++++++++
arch/arm/lib/crt0.S | 11 ++++++++++
arch/arm/lib/relocate.S | 35 ++++++++++++++++++++++---------
4 files changed, 80 insertions(+), 11 deletions(-)
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index c142eaa5c1..d653f64c47 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -11,7 +11,7 @@ config ARM64
config POSITION_INDEPENDENT
bool "Generate position-independent pre-relocation code"
- depends on ARM64
+ depends on ARM64 || CPU_V7A
help
U-Boot expects to be linked to a specific hard-coded address, and to
be loaded to and run from that address. This option lifts that
diff --git a/arch/arm/cpu/armv7/start.S b/arch/arm/cpu/armv7/start.S
index dcb4195d7b..3c0b2d6a71 100644
--- a/arch/arm/cpu/armv7/start.S
+++ b/arch/arm/cpu/armv7/start.S
@@ -39,6 +39,42 @@ reset:
/* Allow the board to save important registers */
b save_boot_params
save_boot_params_ret:
+#ifdef CONFIG_POSITION_INDEPENDENT
+ /*
+ * Fix .rela.dyn relocations. This allows U-Boot to loaded to and
+ * executed at a different address than it was linked at.
+ */
+pie_fixup:
+ adr r0, reset /* r0 <- Runtime value of reset label */
+ ldr r1, =reset /* r1 <- Linked value of reset label */
+ subs r4, r0, r1 /* r4 <- Runtime-vs-link offset */
+ beq pie_fixup_done
+
+ adr r0, pie_fixup
+ ldr r1, _rel_dyn_start_ofs
+ add r2, r0, r1 /* r2 <- Runtime &__rel_dyn_start */
+ ldr r1, _rel_dyn_end_ofs
+ add r3, r0, r1 /* r3 <- Runtime &__rel_dyn_end */
+
+pie_fix_loop:
+ ldr r0, [r2] /* r0 <- Link location */
+ ldr r1, [r2, #4] /* r1 <- fixup */
+ cmp r1, #23 /* relative fixup? */
+ bne pie_skip_reloc
+
+ /* relative fix: increase location by offset */
+ add r0, r4
+ ldr r1, [r0]
+ add r1, r4
+ str r1, [r0]
+ str r0, [r2]
+ add r2, #8
+pie_skip_reloc:
+ cmp r2, r3
+ blo pie_fix_loop
+pie_fixup_done:
+#endif
+
#ifdef CONFIG_ARMV7_LPAE
/*
* check for Hypervisor support
@@ -340,3 +376,10 @@ ENTRY(cpu_init_crit)
b lowlevel_init @ go setup pll,mux,memory
ENDPROC(cpu_init_crit)
#endif
+
+#if CONFIG_POSITION_INDEPENDENT
+_rel_dyn_start_ofs:
+ .word __rel_dyn_start - pie_fixup
+_rel_dyn_end_ofs:
+ .word __rel_dyn_end - pie_fixup
+#endif
diff --git a/arch/arm/lib/crt0.S b/arch/arm/lib/crt0.S
index 46b6be21a8..956d258c9d 100644
--- a/arch/arm/lib/crt0.S
+++ b/arch/arm/lib/crt0.S
@@ -130,6 +130,14 @@ ENTRY(_main)
ldr r9, [r9, #GD_NEW_GD] /* r9 <- gd->new_gd */
adr lr, here
+#if defined(CONFIG_POSITION_INDEPENDENT)
+ adr r0, _main
+ ldr r1, _start_ofs
+ add r0, r1
+ ldr r1, =CONFIG_SYS_TEXT_BASE
+ sub r1, r0
+ add lr, r1
+#endif
ldr r0, [r9, #GD_RELOC_OFF] /* r0 = gd->reloc_off */
add lr, lr, r0
#if defined(CONFIG_CPU_V7M)
@@ -180,3 +188,6 @@ here:
#endif
ENDPROC(_main)
+
+_start_ofs:
+ .word _start - _main
diff --git a/arch/arm/lib/relocate.S b/arch/arm/lib/relocate.S
index e5f7267be1..14b7f61c1a 100644
--- a/arch/arm/lib/relocate.S
+++ b/arch/arm/lib/relocate.S
@@ -78,22 +78,28 @@ ENDPROC(relocate_vectors)
*/
ENTRY(relocate_code)
- ldr r1, =__image_copy_start /* r1 <- SRC &__image_copy_start */
- subs r4, r0, r1 /* r4 <- relocation offset */
- beq relocate_done /* skip relocation */
- ldr r2, =__image_copy_end /* r2 <- SRC &__image_copy_end */
-
+ adr r3, relocate_code
+ ldr r1, _image_copy_start_ofs
+ add r1, r3 /* r1 <- Run &__image_copy_start */
+ subs r4, r0, r1 /* r4 <- Run to copy offset */
+ beq relocate_done /* skip relocation */
+ ldr r1, _image_copy_start_ofs
+ add r1, r3 /* r1 <- Run &__image_copy_start */
+ ldr r2, _image_copy_end_ofs
+ add r2, r3 /* r2 <- Run &__image_copy_end */
copy_loop:
- ldmia r1!, {r10-r11} /* copy from source address [r1] */
- stmia r0!, {r10-r11} /* copy to target address [r0] */
- cmp r1, r2 /* until source end address [r2] */
+ ldmia r1!, {r10-r11} /* copy from source address [r1] */
+ stmia r0!, {r10-r11} /* copy to target address [r0] */
+ cmp r1, r2 /* until source end address [r2] */
blo copy_loop
/*
* fix .rel.dyn relocations
*/
- ldr r2, =__rel_dyn_start /* r2 <- SRC &__rel_dyn_start */
- ldr r3, =__rel_dyn_end /* r3 <- SRC &__rel_dyn_end */
+ ldr r1, _rel_dyn_start_ofs
+ add r2, r1, r3 /* r2 <- Run &__rel_dyn_start */
+ ldr r1, _rel_dyn_end_ofs
+ add r3, r1, r3 /* r3 <- Run &__rel_dyn_end */
fixloop:
ldmia r2!, {r0-r1} /* (r0,r1) <- (SRC location,fixup) */
and r1, r1, #0xff
@@ -129,3 +135,12 @@ relocate_done:
#endif
ENDPROC(relocate_code)
+
+_image_copy_start_ofs:
+ .word __image_copy_start - relocate_code
+_image_copy_end_ofs:
+ .word __image_copy_end - relocate_code
+_rel_dyn_start_ofs:
+ .word __rel_dyn_start - relocate_code
+_rel_dyn_end_ofs:
+ .word __rel_dyn_end - relocate_code
--
2.17.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2 1/2] arm: Fix option dependency with Kconfig language
2021-08-03 2:50 ` [PATCH v2 1/2] arm: Fix option dependency with Kconfig language Chia-Wei Wang
@ 2021-09-02 22:41 ` Tom Rini
0 siblings, 0 replies; 5+ messages in thread
From: Tom Rini @ 2021-09-02 22:41 UTC (permalink / raw)
To: Chia-Wei Wang; +Cc: u-boot
[-- Attachment #1: Type: text/plain, Size: 265 bytes --]
On Tue, Aug 03, 2021 at 10:50:09AM +0800, Chia-Wei Wang wrote:
> Use Kconfig 'depends on' instead of #if macro to
> express the option depdencies.
>
> Signed-off-by: Chia-Wei Wang <chiawei_wang@aspeedtech.com>
Applied to u-boot/next, thanks!
--
Tom
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2 2/2] armv7: Add Position Independent Execution support
2021-08-03 2:50 ` [PATCH v2 2/2] armv7: Add Position Independent Execution support Chia-Wei Wang
@ 2021-09-02 22:41 ` Tom Rini
0 siblings, 0 replies; 5+ messages in thread
From: Tom Rini @ 2021-09-02 22:41 UTC (permalink / raw)
To: Chia-Wei Wang; +Cc: u-boot
[-- Attachment #1: Type: text/plain, Size: 786 bytes --]
On Tue, Aug 03, 2021 at 10:50:10AM +0800, Chia-Wei Wang wrote:
> A U-Boot image could be loaded and executed at a different
> location than it was linked at.
>
> For example, Aspeed takes a stable release version of U-Boot image
> as the golden one for recovery purposes. When the primary storage
> such as flash is corrupted, the golden image would be loaded to any
> SRAM/DRAM address on demands through ethernet/UART/etc and run for
> rescue.
>
> To deal with this condition, the PIE is needed as there is only one
> signed, golden image, which could be however executed at different
> places.
>
> This patch adds the PIE support for ARMv7 platform.
>
> Signed-off-by: Chia-Wei Wang <chiawei_wang@aspeedtech.com>
Applied to u-boot/next, thanks!
--
Tom
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2021-09-02 22:41 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-03 2:50 [PATCH v2 0/2] armv7: Add Position Independent Execution support Chia-Wei Wang
2021-08-03 2:50 ` [PATCH v2 1/2] arm: Fix option dependency with Kconfig language Chia-Wei Wang
2021-09-02 22:41 ` Tom Rini
2021-08-03 2:50 ` [PATCH v2 2/2] armv7: Add Position Independent Execution support Chia-Wei Wang
2021-09-02 22:41 ` Tom Rini
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.