All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/3] arm64: Large PIE fixes
@ 2020-09-04  9:07 Edgar E. Iglesias
  2020-09-04  9:07 ` [PATCH v2 1/3] arm64: Mention 4K aligned load addresses in the PIE Kconfig help Edgar E. Iglesias
                   ` (2 more replies)
  0 siblings, 3 replies; 15+ messages in thread
From: Edgar E. Iglesias @ 2020-09-04  9:07 UTC (permalink / raw)
  To: u-boot

From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>

This fixes some builds issues with large (> 1MB) PIE U-boot setups.
We also document the 4K aligned load address requirement and
add an early run-time check for it.

Thanks,
Edgar

ChangeLog:
v1 -> v2:
* Fix adr of _start in arch/arm/lib/crt0_64.S
* Add early check and bail out into a WFI loop when not 4K aligned
* Document the 4K alignement requirement in Kconfig

Edgar E. Iglesias (3):
  arm64: Mention 4K aligned load addresses in the PIE Kconfig help
  arm64: Bail out PIE builds early if load address is not 4K aligned
  arm64: Add support for larger PIE U-boot

 arch/arm/Kconfig           |  3 +++
 arch/arm/cpu/armv8/start.S | 23 +++++++++++++++++++++--
 arch/arm/lib/crt0_64.S     |  3 ++-
 3 files changed, 26 insertions(+), 3 deletions(-)

-- 
2.25.1

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 1/3] arm64: Mention 4K aligned load addresses in the PIE Kconfig help
  2020-09-04  9:07 [PATCH v2 0/3] arm64: Large PIE fixes Edgar E. Iglesias
@ 2020-09-04  9:07 ` Edgar E. Iglesias
  2020-09-04 18:42   ` Stephen Warren
  2020-09-04  9:07 ` [PATCH v2 2/3] arm64: Bail out PIE builds early if load address is not 4K aligned Edgar E. Iglesias
  2020-09-04  9:07 ` [PATCH v2 3/3] arm64: Add support for larger PIE U-boot Edgar E. Iglesias
  2 siblings, 1 reply; 15+ messages in thread
From: Edgar E. Iglesias @ 2020-09-04  9:07 UTC (permalink / raw)
  To: u-boot

From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>

Mention the requirement of 4K aligned load addresses in the
help section for the POSITION_INDEPENDENT option.

Suggested-by: Michal Simek <michal.simek@xilinx.com>
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
---
 arch/arm/Kconfig | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index f30c2639ec..c144c08612 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -21,6 +21,9 @@ config POSITION_INDEPENDENT
 	  information that is embedded in the binary to support U-Boot
 	  relocating itself to the top-of-RAM later during execution.
 
+	  When this option is enabled, U-Boot needs to be loaded at a
+	  4K aligned address.
+
 config INIT_SP_RELATIVE
 	bool "Specify the early stack pointer relative to the .bss section"
 	help
-- 
2.25.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 2/3] arm64: Bail out PIE builds early if load address is not 4K aligned
  2020-09-04  9:07 [PATCH v2 0/3] arm64: Large PIE fixes Edgar E. Iglesias
  2020-09-04  9:07 ` [PATCH v2 1/3] arm64: Mention 4K aligned load addresses in the PIE Kconfig help Edgar E. Iglesias
@ 2020-09-04  9:07 ` Edgar E. Iglesias
  2020-09-04 18:43   ` Stephen Warren
  2020-09-04  9:07 ` [PATCH v2 3/3] arm64: Add support for larger PIE U-boot Edgar E. Iglesias
  2 siblings, 1 reply; 15+ messages in thread
From: Edgar E. Iglesias @ 2020-09-04  9:07 UTC (permalink / raw)
  To: u-boot

From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>

PIE requires a 4K aligned load address. If this is not met, trap
the startup sequence in a WFI loop rather than running into obscure
failures.

Tested-by: Michal Simek <michal.simek@xilinx.com>
Suggested-by: Andr? Przywara <andre.przywara@arm.com>
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
---
 arch/arm/cpu/armv8/start.S | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/arch/arm/cpu/armv8/start.S b/arch/arm/cpu/armv8/start.S
index 002698b501..732bc385d4 100644
--- a/arch/arm/cpu/armv8/start.S
+++ b/arch/arm/cpu/armv8/start.S
@@ -59,6 +59,23 @@ reset:
 save_boot_params_ret:
 
 #if CONFIG_POSITION_INDEPENDENT
+	/* Verify that we're 4K aligned.  */
+	adr     x1, _start
+	ands    x1, x1, #0xfff
+	b.eq    1f
+0:
+	/*
+	 * FATAL, can't continue.
+	 * U-boot needs to be loaded at a 4K aligned address.
+	 *
+	 * We use ADRP and ADD to load some symbol addresses during startup.
+	 * The ADD uses an absolute (non pc-relative) lo12 relocation
+	 * thus requiring 4K alignment.
+	 */
+	wfi
+	b 0b
+1:
+
 	/*
 	 * Fix .rela.dyn relocations. This allows U-Boot to be loaded to and
 	 * executed at a different address than it was linked at.
-- 
2.25.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 3/3] arm64: Add support for larger PIE U-boot
  2020-09-04  9:07 [PATCH v2 0/3] arm64: Large PIE fixes Edgar E. Iglesias
  2020-09-04  9:07 ` [PATCH v2 1/3] arm64: Mention 4K aligned load addresses in the PIE Kconfig help Edgar E. Iglesias
  2020-09-04  9:07 ` [PATCH v2 2/3] arm64: Bail out PIE builds early if load address is not 4K aligned Edgar E. Iglesias
@ 2020-09-04  9:07 ` Edgar E. Iglesias
  2020-09-04 13:04   ` Michal Simek
  2020-09-04 18:45   ` Stephen Warren
  2 siblings, 2 replies; 15+ messages in thread
From: Edgar E. Iglesias @ 2020-09-04  9:07 UTC (permalink / raw)
  To: u-boot

From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>

Linking a U-boot larger than 1MB fails with PIE enabled:
u-boot/arch/arm/cpu/armv8/start.S:71:(.text+0x3c): relocation
truncated to fit: R_AARCH64_ADR_PREL_LO21 against symbol `__rel_dyn_end'
defined in .bss_start section in u-boot.

This extends the supported range by using adrp & add to load symbols
early while starting up.

Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
---
 arch/arm/cpu/armv8/start.S | 6 ++++--
 arch/arm/lib/crt0_64.S     | 3 ++-
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/arch/arm/cpu/armv8/start.S b/arch/arm/cpu/armv8/start.S
index 732bc385d4..335783014c 100644
--- a/arch/arm/cpu/armv8/start.S
+++ b/arch/arm/cpu/armv8/start.S
@@ -84,8 +84,10 @@ pie_fixup:
 	adr	x0, _start		/* x0 <- Runtime value of _start */
 	ldr	x1, _TEXT_BASE		/* x1 <- Linked value of _start */
 	sub	x9, x0, x1		/* x9 <- Run-vs-link offset */
-	adr	x2, __rel_dyn_start	/* x2 <- Runtime &__rel_dyn_start */
-	adr	x3, __rel_dyn_end	/* x3 <- Runtime &__rel_dyn_end */
+	adrp    x2, __rel_dyn_start     /* x2 <- Runtime &__rel_dyn_start */
+	add     x2, x2, #:lo12:__rel_dyn_start
+	adrp    x3, __rel_dyn_end       /* x3 <- Runtime &__rel_dyn_end */
+	add     x3, x3, #:lo12:__rel_dyn_end
 pie_fix_loop:
 	ldp	x0, x1, [x2], #16	/* (x0, x1) <- (Link location, fixup) */
 	ldr	x4, [x2], #8		/* x4 <- addend */
diff --git a/arch/arm/lib/crt0_64.S b/arch/arm/lib/crt0_64.S
index 04afa518ac..f28071a238 100644
--- a/arch/arm/lib/crt0_64.S
+++ b/arch/arm/lib/crt0_64.S
@@ -102,7 +102,8 @@ ENTRY(_main)
 	adr	lr, relocation_return
 #if CONFIG_POSITION_INDEPENDENT
 	/* Add in link-vs-runtime offset */
-	adr	x0, _start		/* x0 <- Runtime value of _start */
+	adrp	x0, _start		/* x0 <- Runtime value of _start */
+	add	x0, x0, #:lo12:_start
 	ldr	x9, _TEXT_BASE		/* x9 <- Linked value of _start */
 	sub	x9, x9, x0		/* x9 <- Run-vs-link offset */
 	add	lr, lr, x9
-- 
2.25.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 3/3] arm64: Add support for larger PIE U-boot
  2020-09-04  9:07 ` [PATCH v2 3/3] arm64: Add support for larger PIE U-boot Edgar E. Iglesias
@ 2020-09-04 13:04   ` Michal Simek
  2020-09-04 13:11     ` Edgar E. Iglesias
  2020-09-04 18:45   ` Stephen Warren
  1 sibling, 1 reply; 15+ messages in thread
From: Michal Simek @ 2020-09-04 13:04 UTC (permalink / raw)
  To: u-boot



On 04. 09. 20 11:07, Edgar E. Iglesias wrote:
> From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
> 
> Linking a U-boot larger than 1MB fails with PIE enabled:
> u-boot/arch/arm/cpu/armv8/start.S:71:(.text+0x3c): relocation
> truncated to fit: R_AARCH64_ADR_PREL_LO21 against symbol `__rel_dyn_end'
> defined in .bss_start section in u-boot.
> 
> This extends the supported range by using adrp & add to load symbols
> early while starting up.
> 
> Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
> ---
>  arch/arm/cpu/armv8/start.S | 6 ++++--
>  arch/arm/lib/crt0_64.S     | 3 ++-
>  2 files changed, 6 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/arm/cpu/armv8/start.S b/arch/arm/cpu/armv8/start.S
> index 732bc385d4..335783014c 100644
> --- a/arch/arm/cpu/armv8/start.S
> +++ b/arch/arm/cpu/armv8/start.S
> @@ -84,8 +84,10 @@ pie_fixup:
>  	adr	x0, _start		/* x0 <- Runtime value of _start */
>  	ldr	x1, _TEXT_BASE		/* x1 <- Linked value of _start */
>  	sub	x9, x0, x1		/* x9 <- Run-vs-link offset */
> -	adr	x2, __rel_dyn_start	/* x2 <- Runtime &__rel_dyn_start */
> -	adr	x3, __rel_dyn_end	/* x3 <- Runtime &__rel_dyn_end */
> +	adrp    x2, __rel_dyn_start     /* x2 <- Runtime &__rel_dyn_start */
> +	add     x2, x2, #:lo12:__rel_dyn_start
> +	adrp    x3, __rel_dyn_end       /* x3 <- Runtime &__rel_dyn_end */
> +	add     x3, x3, #:lo12:__rel_dyn_end
>  pie_fix_loop:
>  	ldp	x0, x1, [x2], #16	/* (x0, x1) <- (Link location, fixup) */
>  	ldr	x4, [x2], #8		/* x4 <- addend */
> diff --git a/arch/arm/lib/crt0_64.S b/arch/arm/lib/crt0_64.S
> index 04afa518ac..f28071a238 100644
> --- a/arch/arm/lib/crt0_64.S
> +++ b/arch/arm/lib/crt0_64.S
> @@ -102,7 +102,8 @@ ENTRY(_main)
>  	adr	lr, relocation_return
>  #if CONFIG_POSITION_INDEPENDENT
>  	/* Add in link-vs-runtime offset */
> -	adr	x0, _start		/* x0 <- Runtime value of _start */
> +	adrp	x0, _start		/* x0 <- Runtime value of _start */
> +	add	x0, x0, #:lo12:_start
>  	ldr	x9, _TEXT_BASE		/* x9 <- Linked value of _start */
>  	sub	x9, x9, x0		/* x9 <- Run-vs-link offset */
>  	add	lr, lr, x9
> 

I have tested 21MB and 51MB u-boot and there is need to also patch
__bss_start.


--- a/arch/arm/lib/crt0_64.S
+++ b/arch/arm/lib/crt0_64.S
@@ -73,7 +73,12 @@ ENTRY(_main)
 #elif defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK)
        ldr     x0, =(CONFIG_SPL_STACK)
 #elif defined(CONFIG_INIT_SP_RELATIVE)
+#if CONFIG_POSITION_INDEPENDENT
+       adrp    x0, __bss_start     /* x0 <- Runtime &__bss_start */
+       add     x0, x0, #:lo12:__bss_start
+#else
        adr     x0, __bss_start
+#endif
        add     x0, x0, #CONFIG_SYS_INIT_SP_BSS_OFFSET
 #else
        ldr     x0, =(CONFIG_SYS_INIT_SP_ADDR)

Thanks,
Michal

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 3/3] arm64: Add support for larger PIE U-boot
  2020-09-04 13:04   ` Michal Simek
@ 2020-09-04 13:11     ` Edgar E. Iglesias
  0 siblings, 0 replies; 15+ messages in thread
From: Edgar E. Iglesias @ 2020-09-04 13:11 UTC (permalink / raw)
  To: u-boot

On Fri, Sep 04, 2020 at 03:04:02PM +0200, Michal Simek wrote:
> 
> 
> On 04. 09. 20 11:07, Edgar E. Iglesias wrote:
> > From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
> > 
> > Linking a U-boot larger than 1MB fails with PIE enabled:
> > u-boot/arch/arm/cpu/armv8/start.S:71:(.text+0x3c): relocation
> > truncated to fit: R_AARCH64_ADR_PREL_LO21 against symbol `__rel_dyn_end'
> > defined in .bss_start section in u-boot.
> > 
> > This extends the supported range by using adrp & add to load symbols
> > early while starting up.
> > 
> > Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
> > ---
> >  arch/arm/cpu/armv8/start.S | 6 ++++--
> >  arch/arm/lib/crt0_64.S     | 3 ++-
> >  2 files changed, 6 insertions(+), 3 deletions(-)
> > 
> > diff --git a/arch/arm/cpu/armv8/start.S b/arch/arm/cpu/armv8/start.S
> > index 732bc385d4..335783014c 100644
> > --- a/arch/arm/cpu/armv8/start.S
> > +++ b/arch/arm/cpu/armv8/start.S
> > @@ -84,8 +84,10 @@ pie_fixup:
> >  	adr	x0, _start		/* x0 <- Runtime value of _start */
> >  	ldr	x1, _TEXT_BASE		/* x1 <- Linked value of _start */
> >  	sub	x9, x0, x1		/* x9 <- Run-vs-link offset */
> > -	adr	x2, __rel_dyn_start	/* x2 <- Runtime &__rel_dyn_start */
> > -	adr	x3, __rel_dyn_end	/* x3 <- Runtime &__rel_dyn_end */
> > +	adrp    x2, __rel_dyn_start     /* x2 <- Runtime &__rel_dyn_start */
> > +	add     x2, x2, #:lo12:__rel_dyn_start
> > +	adrp    x3, __rel_dyn_end       /* x3 <- Runtime &__rel_dyn_end */
> > +	add     x3, x3, #:lo12:__rel_dyn_end
> >  pie_fix_loop:
> >  	ldp	x0, x1, [x2], #16	/* (x0, x1) <- (Link location, fixup) */
> >  	ldr	x4, [x2], #8		/* x4 <- addend */
> > diff --git a/arch/arm/lib/crt0_64.S b/arch/arm/lib/crt0_64.S
> > index 04afa518ac..f28071a238 100644
> > --- a/arch/arm/lib/crt0_64.S
> > +++ b/arch/arm/lib/crt0_64.S
> > @@ -102,7 +102,8 @@ ENTRY(_main)
> >  	adr	lr, relocation_return
> >  #if CONFIG_POSITION_INDEPENDENT
> >  	/* Add in link-vs-runtime offset */
> > -	adr	x0, _start		/* x0 <- Runtime value of _start */
> > +	adrp	x0, _start		/* x0 <- Runtime value of _start */
> > +	add	x0, x0, #:lo12:_start
> >  	ldr	x9, _TEXT_BASE		/* x9 <- Linked value of _start */
> >  	sub	x9, x9, x0		/* x9 <- Run-vs-link offset */
> >  	add	lr, lr, x9
> > 
> 
> I have tested 21MB and 51MB u-boot and there is need to also patch
> __bss_start.
> 
> 
> --- a/arch/arm/lib/crt0_64.S
> +++ b/arch/arm/lib/crt0_64.S
> @@ -73,7 +73,12 @@ ENTRY(_main)
>  #elif defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK)
>         ldr     x0, =(CONFIG_SPL_STACK)
>  #elif defined(CONFIG_INIT_SP_RELATIVE)
> +#if CONFIG_POSITION_INDEPENDENT
> +       adrp    x0, __bss_start     /* x0 <- Runtime &__bss_start */
> +       add     x0, x0, #:lo12:__bss_start
> +#else
>         adr     x0, __bss_start
> +#endif
>         add     x0, x0, #CONFIG_SYS_INIT_SP_BSS_OFFSET
>  #else
>         ldr     x0, =(CONFIG_SYS_INIT_SP_ADDR)
> 

Thanks Michal, I can bundle this into v3.

Cheers,
Edgar

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 1/3] arm64: Mention 4K aligned load addresses in the PIE Kconfig help
  2020-09-04  9:07 ` [PATCH v2 1/3] arm64: Mention 4K aligned load addresses in the PIE Kconfig help Edgar E. Iglesias
@ 2020-09-04 18:42   ` Stephen Warren
  2020-09-06 22:16     ` André Przywara
  0 siblings, 1 reply; 15+ messages in thread
From: Stephen Warren @ 2020-09-04 18:42 UTC (permalink / raw)
  To: u-boot

On 9/4/20 3:07 AM, Edgar E. Iglesias wrote:
> From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
> 
> Mention the requirement of 4K aligned load addresses in the
> help section for the POSITION_INDEPENDENT option.
> 
> Suggested-by: Michal Simek <michal.simek@xilinx.com>
> Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
> ---
>  arch/arm/Kconfig | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index f30c2639ec..c144c08612 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -21,6 +21,9 @@ config POSITION_INDEPENDENT
>  	  information that is embedded in the binary to support U-Boot
>  	  relocating itself to the top-of-RAM later during execution.
>  
> +	  When this option is enabled, U-Boot needs to be loaded at a
> +	  4K aligned address.

I don't believe this restriction should be documented as part of
POSITION_INDEPENDENT; the restriction always exists at least for 64-bit
ARM, since arch/arm/lib/relocate_64.S relocate_code uses the same
assembly sequence that imposes this restriction, and IIUC that code is
unconditionally used.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 2/3] arm64: Bail out PIE builds early if load address is not 4K aligned
  2020-09-04  9:07 ` [PATCH v2 2/3] arm64: Bail out PIE builds early if load address is not 4K aligned Edgar E. Iglesias
@ 2020-09-04 18:43   ` Stephen Warren
  2020-09-07  9:52     ` Edgar E. Iglesias
  0 siblings, 1 reply; 15+ messages in thread
From: Stephen Warren @ 2020-09-04 18:43 UTC (permalink / raw)
  To: u-boot

On 9/4/20 3:07 AM, Edgar E. Iglesias wrote:
> From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
> 
> PIE requires a 4K aligned load address. If this is not met, trap
> the startup sequence in a WFI loop rather than running into obscure
> failures.

> diff --git a/arch/arm/cpu/armv8/start.S b/arch/arm/cpu/armv8/start.S
>  #if CONFIG_POSITION_INDEPENDENT
> +	/* Verify that we're 4K aligned.  */

Similar to the comment on the previous patch: I believe the code that
implements this check should be outside the #if check, since it's always
needed.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 3/3] arm64: Add support for larger PIE U-boot
  2020-09-04  9:07 ` [PATCH v2 3/3] arm64: Add support for larger PIE U-boot Edgar E. Iglesias
  2020-09-04 13:04   ` Michal Simek
@ 2020-09-04 18:45   ` Stephen Warren
  1 sibling, 0 replies; 15+ messages in thread
From: Stephen Warren @ 2020-09-04 18:45 UTC (permalink / raw)
  To: u-boot

On 9/4/20 3:07 AM, Edgar E. Iglesias wrote:
> From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
> 
> Linking a U-boot larger than 1MB fails with PIE enabled:
> u-boot/arch/arm/cpu/armv8/start.S:71:(.text+0x3c): relocation
> truncated to fit: R_AARCH64_ADR_PREL_LO21 against symbol `__rel_dyn_end'
> defined in .bss_start section in u-boot.
> 
> This extends the supported range by using adrp & add to load symbols
> early while starting up.

This patch looks conceptually fine to me, but I won't ack this version
due to the issue pointed out by Michal.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 1/3] arm64: Mention 4K aligned load addresses in the PIE Kconfig help
  2020-09-04 18:42   ` Stephen Warren
@ 2020-09-06 22:16     ` André Przywara
  2020-09-07  9:58       ` Edgar E. Iglesias
  0 siblings, 1 reply; 15+ messages in thread
From: André Przywara @ 2020-09-06 22:16 UTC (permalink / raw)
  To: u-boot

On 04/09/2020 19:42, Stephen Warren wrote:
> On 9/4/20 3:07 AM, Edgar E. Iglesias wrote:
>> From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
>>
>> Mention the requirement of 4K aligned load addresses in the
>> help section for the POSITION_INDEPENDENT option.
>>
>> Suggested-by: Michal Simek <michal.simek@xilinx.com>
>> Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
>> ---
>>  arch/arm/Kconfig | 3 +++
>>  1 file changed, 3 insertions(+)
>>
>> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
>> index f30c2639ec..c144c08612 100644
>> --- a/arch/arm/Kconfig
>> +++ b/arch/arm/Kconfig
>> @@ -21,6 +21,9 @@ config POSITION_INDEPENDENT
>>  	  information that is embedded in the binary to support U-Boot
>>  	  relocating itself to the top-of-RAM later during execution.
>>  
>> +	  When this option is enabled, U-Boot needs to be loaded at a
>> +	  4K aligned address.
> 
> I don't believe this restriction should be documented as part of
> POSITION_INDEPENDENT; the restriction always exists at least for 64-bit
> ARM, since arch/arm/lib/relocate_64.S relocate_code uses the same
> assembly sequence that imposes this restriction, and IIUC that code is
> unconditionally used.

While this is true, the difference is that without POSITION_INDEPENDENT
the alignment is easily determined by the hardcoded load address. So we
should actually have a build time check on this.

With POSITION_INDEPENDENT, however, the load address is only known at
runtime (somewhat under the user's control, if you like). So a warning
or hint here might be useful. But maybe it should be noted as a general
restriction in the paragraph above:
" ... from almost any address" => "from almost any 4K aligned address"

Cheers,
Andre.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 2/3] arm64: Bail out PIE builds early if load address is not 4K aligned
  2020-09-04 18:43   ` Stephen Warren
@ 2020-09-07  9:52     ` Edgar E. Iglesias
  2020-09-07 12:57       ` Tom Rini
  2020-09-08 19:02       ` Stephen Warren
  0 siblings, 2 replies; 15+ messages in thread
From: Edgar E. Iglesias @ 2020-09-07  9:52 UTC (permalink / raw)
  To: u-boot

On Fri, Sep 04, 2020 at 12:43:57PM -0600, Stephen Warren wrote:
> On 9/4/20 3:07 AM, Edgar E. Iglesias wrote:
> > From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
> > 
> > PIE requires a 4K aligned load address. If this is not met, trap
> > the startup sequence in a WFI loop rather than running into obscure
> > failures.
> 
> > diff --git a/arch/arm/cpu/armv8/start.S b/arch/arm/cpu/armv8/start.S
> >  #if CONFIG_POSITION_INDEPENDENT
> > +	/* Verify that we're 4K aligned.  */
> 
> Similar to the comment on the previous patch: I believe the code that
> implements this check should be outside the #if check, since it's always
> needed.

But a check for non-PIE would have to be stricter, wouldn't it?
I.e the load address needs to exactly match the link-time address.

Perhaps we should add the non-PIE check in a separate patch (if at all)?

Cheers,
Edgar

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 1/3] arm64: Mention 4K aligned load addresses in the PIE Kconfig help
  2020-09-06 22:16     ` André Przywara
@ 2020-09-07  9:58       ` Edgar E. Iglesias
  0 siblings, 0 replies; 15+ messages in thread
From: Edgar E. Iglesias @ 2020-09-07  9:58 UTC (permalink / raw)
  To: u-boot

On Sun, Sep 06, 2020 at 11:16:17PM +0100, Andr? Przywara wrote:
> On 04/09/2020 19:42, Stephen Warren wrote:
> > On 9/4/20 3:07 AM, Edgar E. Iglesias wrote:
> >> From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
> >>
> >> Mention the requirement of 4K aligned load addresses in the
> >> help section for the POSITION_INDEPENDENT option.
> >>
> >> Suggested-by: Michal Simek <michal.simek@xilinx.com>
> >> Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
> >> ---
> >>  arch/arm/Kconfig | 3 +++
> >>  1 file changed, 3 insertions(+)
> >>
> >> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> >> index f30c2639ec..c144c08612 100644
> >> --- a/arch/arm/Kconfig
> >> +++ b/arch/arm/Kconfig
> >> @@ -21,6 +21,9 @@ config POSITION_INDEPENDENT
> >>  	  information that is embedded in the binary to support U-Boot
> >>  	  relocating itself to the top-of-RAM later during execution.
> >>  
> >> +	  When this option is enabled, U-Boot needs to be loaded at a
> >> +	  4K aligned address.
> > 
> > I don't believe this restriction should be documented as part of
> > POSITION_INDEPENDENT; the restriction always exists at least for 64-bit
> > ARM, since arch/arm/lib/relocate_64.S relocate_code uses the same
> > assembly sequence that imposes this restriction, and IIUC that code is
> > unconditionally used.
> 
> While this is true, the difference is that without POSITION_INDEPENDENT
> the alignment is easily determined by the hardcoded load address. So we
> should actually have a build time check on this.
> 
> With POSITION_INDEPENDENT, however, the load address is only known at
> runtime (somewhat under the user's control, if you like). So a warning
> or hint here might be useful. But maybe it should be noted as a general
> restriction in the paragraph above:
> " ... from almost any address" => "from almost any 4K aligned address"
>

That sounds good to me.

Thanks,
Edgar

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 2/3] arm64: Bail out PIE builds early if load address is not 4K aligned
  2020-09-07  9:52     ` Edgar E. Iglesias
@ 2020-09-07 12:57       ` Tom Rini
  2020-09-07 13:40         ` Edgar E. Iglesias
  2020-09-08 19:02       ` Stephen Warren
  1 sibling, 1 reply; 15+ messages in thread
From: Tom Rini @ 2020-09-07 12:57 UTC (permalink / raw)
  To: u-boot

On Mon, Sep 07, 2020 at 11:52:35AM +0200, Edgar E. Iglesias wrote:
> On Fri, Sep 04, 2020 at 12:43:57PM -0600, Stephen Warren wrote:
> > On 9/4/20 3:07 AM, Edgar E. Iglesias wrote:
> > > From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
> > > 
> > > PIE requires a 4K aligned load address. If this is not met, trap
> > > the startup sequence in a WFI loop rather than running into obscure
> > > failures.
> > 
> > > diff --git a/arch/arm/cpu/armv8/start.S b/arch/arm/cpu/armv8/start.S
> > >  #if CONFIG_POSITION_INDEPENDENT
> > > +	/* Verify that we're 4K aligned.  */
> > 
> > Similar to the comment on the previous patch: I believe the code that
> > implements this check should be outside the #if check, since it's always
> > needed.
> 
> But a check for non-PIE would have to be stricter, wouldn't it?
> I.e the load address needs to exactly match the link-time address.
> 
> Perhaps we should add the non-PIE check in a separate patch (if at all)?

If we can catch a bad configuration at link time in the non-PIE case (as
said in another part of this thread I believe) then we should, yes,
thanks!

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 659 bytes
Desc: not available
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20200907/4d09778c/attachment.sig>

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 2/3] arm64: Bail out PIE builds early if load address is not 4K aligned
  2020-09-07 12:57       ` Tom Rini
@ 2020-09-07 13:40         ` Edgar E. Iglesias
  0 siblings, 0 replies; 15+ messages in thread
From: Edgar E. Iglesias @ 2020-09-07 13:40 UTC (permalink / raw)
  To: u-boot

On Mon, Sep 07, 2020 at 08:57:39AM -0400, Tom Rini wrote:
> On Mon, Sep 07, 2020 at 11:52:35AM +0200, Edgar E. Iglesias wrote:
> > On Fri, Sep 04, 2020 at 12:43:57PM -0600, Stephen Warren wrote:
> > > On 9/4/20 3:07 AM, Edgar E. Iglesias wrote:
> > > > From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
> > > > 
> > > > PIE requires a 4K aligned load address. If this is not met, trap
> > > > the startup sequence in a WFI loop rather than running into obscure
> > > > failures.
> > > 
> > > > diff --git a/arch/arm/cpu/armv8/start.S b/arch/arm/cpu/armv8/start.S
> > > >  #if CONFIG_POSITION_INDEPENDENT
> > > > +	/* Verify that we're 4K aligned.  */
> > > 
> > > Similar to the comment on the previous patch: I believe the code that
> > > implements this check should be outside the #if check, since it's always
> > > needed.
> > 
> > But a check for non-PIE would have to be stricter, wouldn't it?
> > I.e the load address needs to exactly match the link-time address.
> > 
> > Perhaps we should add the non-PIE check in a separate patch (if at all)?
> 
> If we can catch a bad configuration at link time in the non-PIE case (as
> said in another part of this thread I believe) then we should, yes,
> thanks!

The non-PIE configuration is expected to be loaded at a specific address.
The actual load address cannot be checked at link-time (since it's up to
the user at run-time) but given the assumption of a specific load-address,
4K alignment can be enforced at link-time.

It really comes down to adding reasonable run-time checks for errors that
users may reasonably struggle with.

For PIE, checking for 4K aligment is reasonable because it's an easy
enough misstake to make (since you've got a binary that's was supposed to
handle relocation).

For non-PIE, checking for the exact address at run-time is a little bit more
border-line IMO but I guess also somewhat reasonable.

There are still plenty of cases we can't catch though (loaded at odd addreses,
non-RAM address-ranges etc etc).

Cheers,
Edgar

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 2/3] arm64: Bail out PIE builds early if load address is not 4K aligned
  2020-09-07  9:52     ` Edgar E. Iglesias
  2020-09-07 12:57       ` Tom Rini
@ 2020-09-08 19:02       ` Stephen Warren
  1 sibling, 0 replies; 15+ messages in thread
From: Stephen Warren @ 2020-09-08 19:02 UTC (permalink / raw)
  To: u-boot

On 9/7/20 3:52 AM, Edgar E. Iglesias wrote:
> On Fri, Sep 04, 2020 at 12:43:57PM -0600, Stephen Warren wrote:
>> On 9/4/20 3:07 AM, Edgar E. Iglesias wrote:
>>> From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
>>>
>>> PIE requires a 4K aligned load address. If this is not met, trap
>>> the startup sequence in a WFI loop rather than running into obscure
>>> failures.
>>
>>> diff --git a/arch/arm/cpu/armv8/start.S b/arch/arm/cpu/armv8/start.S
>>>  #if CONFIG_POSITION_INDEPENDENT
>>> +	/* Verify that we're 4K aligned.  */
>>
>> Similar to the comment on the previous patch: I believe the code that
>> implements this check should be outside the #if check, since it's always
>> needed.
> 
> But a check for non-PIE would have to be stricter, wouldn't it?
> I.e the load address needs to exactly match the link-time address.

Oh yes, I guess that is true.

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2020-09-08 19:02 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-04  9:07 [PATCH v2 0/3] arm64: Large PIE fixes Edgar E. Iglesias
2020-09-04  9:07 ` [PATCH v2 1/3] arm64: Mention 4K aligned load addresses in the PIE Kconfig help Edgar E. Iglesias
2020-09-04 18:42   ` Stephen Warren
2020-09-06 22:16     ` André Przywara
2020-09-07  9:58       ` Edgar E. Iglesias
2020-09-04  9:07 ` [PATCH v2 2/3] arm64: Bail out PIE builds early if load address is not 4K aligned Edgar E. Iglesias
2020-09-04 18:43   ` Stephen Warren
2020-09-07  9:52     ` Edgar E. Iglesias
2020-09-07 12:57       ` Tom Rini
2020-09-07 13:40         ` Edgar E. Iglesias
2020-09-08 19:02       ` Stephen Warren
2020-09-04  9:07 ` [PATCH v2 3/3] arm64: Add support for larger PIE U-boot Edgar E. Iglesias
2020-09-04 13:04   ` Michal Simek
2020-09-04 13:11     ` Edgar E. Iglesias
2020-09-04 18:45   ` Stephen Warren

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.