diff mbox series

[RFC,2/4] arm: Prepare linker scripts for memory permissions

Message ID 20250130072100.27297-3-ilias.apalodimas@linaro.org
State New
Headers show
Series Fix page permission on arm64 architectures | expand

Commit Message

Ilias Apalodimas Jan. 30, 2025, 7:20 a.m. UTC
Upcoming patches are switching the memory mappings to RW, RO, RW^X page
permissions after the U-Boot binary and its data are relocated. Add
annotations in the linker scripts to and mark text, data, rodata etc
sections and align them to a page boundary

Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
---
 Makefile                       | 15 +++++++++------
 arch/arm/cpu/armv8/u-boot.lds  | 32 +++++++++++++++++++-------------
 include/asm-generic/sections.h |  2 ++
 lib/efi_loader/efi_runtime.c   |  2 ++
 4 files changed, 32 insertions(+), 19 deletions(-)

Comments

Jerome Forissier Jan. 30, 2025, 9:09 a.m. UTC | #1
Hi Ilias,

On 1/30/25 08:20, Ilias Apalodimas wrote:
> Upcoming patches are switching the memory mappings to RW, RO, RW^X page
> permissions after the U-Boot binary and its data are relocated. Add
> annotations in the linker scripts to and mark text, data, rodata etc
> sections and align them to a page boundary
> 
> Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
> ---
>  Makefile                       | 15 +++++++++------
>  arch/arm/cpu/armv8/u-boot.lds  | 32 +++++++++++++++++++-------------
>  include/asm-generic/sections.h |  2 ++
>  lib/efi_loader/efi_runtime.c   |  2 ++
>  4 files changed, 32 insertions(+), 19 deletions(-)
> 
> diff --git a/Makefile b/Makefile
> index 33bb86343c5b..8d7c062ec830 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -2176,13 +2176,16 @@ System.map:	u-boot
>  # ARM relocations should all be R_ARM_RELATIVE (32-bit) or
>  # R_AARCH64_RELATIVE (64-bit).
>  checkarmreloc: u-boot
> -	@RELOC="`$(CROSS_COMPILE)readelf -r -W $< | cut -d ' ' -f 4 | \
> +	@RELOCS="`$(CROSS_COMPILE)readelf -r -W $< | cut -d ' ' -f 4 | \
>  		grep R_A | sort -u`"; \
> -	if test "$$RELOC" != "R_ARM_RELATIVE" -a \
> -		 "$$RELOC" != "R_AARCH64_RELATIVE"; then \
> -		echo "$< contains unexpected relocations: $$RELOC"; \
> -		false; \
> -	fi
> +	for reloc in $$RELOCS; do \
> +		if [ "$$reloc" != "R_ARM_RELATIVE" -a \
> +		     "$$reloc" != "R_AARCH64_RELATIVE" -a \
> +		"$$reloc" != "R_AARCH64_NONE" ]; then \
> +			echo "$< contains unexpected relocations: $$reloc"; \
> +			false; \

s/false/exit 1/ otherwise the loop won't break and make won't get a
failure status unless the error is on the last reloc.

> +		fi; \
> +	done

This Makefile change seems unrelated to the current patch. Should it
go into a separate fixup patch?
 
>  tools/version.h: include/version.h
>  	$(Q)mkdir -p $(dir $@)
> diff --git a/arch/arm/cpu/armv8/u-boot.lds b/arch/arm/cpu/armv8/u-boot.lds
> index 857f44412e07..18e168e27135 100644
> --- a/arch/arm/cpu/armv8/u-boot.lds
> +++ b/arch/arm/cpu/armv8/u-boot.lds
> @@ -22,7 +22,7 @@ SECTIONS
>  
>  	. = ALIGN(8);
>  	__image_copy_start = ADDR(.text);
> -	.text :
> +	.text ALIGN(4096):
>  	{
>  		CPUDIR/start.o (.text*)
>  	}
> @@ -36,9 +36,12 @@ SECTIONS
>                  __efi_runtime_stop = .;
>  	}
>  
> -	.text_rest :
> +	.text_rest ALIGN(4096) :
>  	{
> +		__text_start = .;
>  		*(.text*)
> +		. = ALIGN(4096);
> +		__text_end = .;
>  	}
>  
>  #ifdef CONFIG_ARMV8_PSCI
> @@ -98,27 +101,30 @@ SECTIONS
>  	}
>  #endif
>  
> -	. = ALIGN(8);
> -	.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
> +	.rodata ALIGN(4096): {
> +	    __start_rodata = .;
> +	    *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
> +	    . = ALIGN(4096);
> +	    __end_rodata = .;
> +	}
>  
> -	. = ALIGN(8);
> -	.data : {
> +	.data ALIGN(4096) : {
> +	    __start_data = .;
>  		*(.data*)
> +	    . = ALIGN(4096);
> +	    __end_data = .;
>  	}
>  
> -	. = ALIGN(8);
> -
> -	. = .;
> -
>  	. = ALIGN(8);
>  	__u_boot_list : {
>  		KEEP(*(SORT(__u_boot_list*)));
>  	}
>  
> -	.efi_runtime_rel : {
> +	.efi_runtime_rel ALIGN(4096) : {
>                  __efi_runtime_rel_start = .;
>  		*(.rel*.efi_runtime)
>  		*(.rel*.efi_runtime.*)
> +		. = ALIGN(4096);
>                  __efi_runtime_rel_stop = .;
>  	}
>  
> @@ -136,10 +142,10 @@ SECTIONS
>  	/*
>  	 * arch/arm/lib/crt0_64.S assumes __bss_start - __bss_end % 8 == 0
>  	 */
> -	.bss ALIGN(8) : {
> +	.bss ALIGN(4096) : {
>  		__bss_start = .;
>  		*(.bss*)
> -		. = ALIGN(8);
> +		. = ALIGN(4096);
>  		__bss_end = .;
>  	}
>  
> diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h
> index b6bca53db10d..5626df796f33 100644
> --- a/include/asm-generic/sections.h
> +++ b/include/asm-generic/sections.h
> @@ -23,6 +23,7 @@ extern char __kprobes_text_start[], __kprobes_text_end[];
>  extern char __entry_text_start[], __entry_text_end[];
>  extern char __initdata_begin[], __initdata_end[];
>  extern char __start_rodata[], __end_rodata[];
> +extern char __start_data[], __end_data[];
>  extern char __efi_helloworld_begin[];
>  extern char __efi_helloworld_end[];
>  extern char __efi_var_file_begin[];
> @@ -63,6 +64,7 @@ static inline int arch_is_kernel_data(unsigned long addr)
>  
>  /* Start of U-Boot text region */
>  extern char __text_start[];
> +extern char __text_end[];
>  
>  /* This marks the text region which must be relocated */
>  extern char __image_copy_start[], __image_copy_end[];
> diff --git a/lib/efi_loader/efi_runtime.c b/lib/efi_loader/efi_runtime.c
> index 35eb6a777665..c10a79301a92 100644
> --- a/lib/efi_loader/efi_runtime.c
> +++ b/lib/efi_loader/efi_runtime.c
> @@ -742,6 +742,8 @@ void efi_runtime_relocate(ulong offset, struct efi_mem_desc *map)
>  		      rel->info, *p, rel->offset);
>  
>  		switch (rel->info & R_MASK) {
> +		case 0:
> +			break;

It looks like this may need to go into the same fixup patch as the
Makefile changes above.

>  		case R_RELATIVE:
>  #ifdef IS_RELA
>  		newaddr = rel->addend + offset - CONFIG_TEXT_BASE;

For the linker script changes:

Acked-by: Jerome Forissier <jerome.forissier@linaro.org>
Ilias Apalodimas Jan. 30, 2025, 9:19 a.m. UTC | #2
On Thu, 30 Jan 2025 at 11:09, Jerome Forissier
<jerome.forissier@linaro.org> wrote:
>
> Hi Ilias,
>
> On 1/30/25 08:20, Ilias Apalodimas wrote:
> > Upcoming patches are switching the memory mappings to RW, RO, RW^X page
> > permissions after the U-Boot binary and its data are relocated. Add
> > annotations in the linker scripts to and mark text, data, rodata etc
> > sections and align them to a page boundary
> >
> > Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
> > ---
> >  Makefile                       | 15 +++++++++------
> >  arch/arm/cpu/armv8/u-boot.lds  | 32 +++++++++++++++++++-------------
> >  include/asm-generic/sections.h |  2 ++
> >  lib/efi_loader/efi_runtime.c   |  2 ++
> >  4 files changed, 32 insertions(+), 19 deletions(-)
> >
> > diff --git a/Makefile b/Makefile
> > index 33bb86343c5b..8d7c062ec830 100644
> > --- a/Makefile
> > +++ b/Makefile
> > @@ -2176,13 +2176,16 @@ System.map:   u-boot
> >  # ARM relocations should all be R_ARM_RELATIVE (32-bit) or
> >  # R_AARCH64_RELATIVE (64-bit).
> >  checkarmreloc: u-boot
> > -     @RELOC="`$(CROSS_COMPILE)readelf -r -W $< | cut -d ' ' -f 4 | \
> > +     @RELOCS="`$(CROSS_COMPILE)readelf -r -W $< | cut -d ' ' -f 4 | \
> >               grep R_A | sort -u`"; \
> > -     if test "$$RELOC" != "R_ARM_RELATIVE" -a \
> > -              "$$RELOC" != "R_AARCH64_RELATIVE"; then \
> > -             echo "$< contains unexpected relocations: $$RELOC"; \
> > -             false; \
> > -     fi
> > +     for reloc in $$RELOCS; do \
> > +             if [ "$$reloc" != "R_ARM_RELATIVE" -a \
> > +                  "$$reloc" != "R_AARCH64_RELATIVE" -a \
> > +             "$$reloc" != "R_AARCH64_NONE" ]; then \
> > +                     echo "$< contains unexpected relocations: $$reloc"; \
> > +                     false; \
>
> s/false/exit 1/ otherwise the loop won't break and make won't get a
> failure status unless the error is on the last reloc.
>
> > +             fi; \
> > +     done
>
> This Makefile change seems unrelated to the current patch. Should it
> go into a separate fixup patch?
>
> >  tools/version.h: include/version.h
> >       $(Q)mkdir -p $(dir $@)
> > diff --git a/arch/arm/cpu/armv8/u-boot.lds b/arch/arm/cpu/armv8/u-boot.lds
> > index 857f44412e07..18e168e27135 100644
> > --- a/arch/arm/cpu/armv8/u-boot.lds
> > +++ b/arch/arm/cpu/armv8/u-boot.lds
> > @@ -22,7 +22,7 @@ SECTIONS
> >
> >       . = ALIGN(8);
> >       __image_copy_start = ADDR(.text);
> > -     .text :
> > +     .text ALIGN(4096):
> >       {
> >               CPUDIR/start.o (.text*)
> >       }
> > @@ -36,9 +36,12 @@ SECTIONS
> >                  __efi_runtime_stop = .;
> >       }
> >
> > -     .text_rest :
> > +     .text_rest ALIGN(4096) :
> >       {
> > +             __text_start = .;
> >               *(.text*)
> > +             . = ALIGN(4096);
> > +             __text_end = .;
> >       }
> >
> >  #ifdef CONFIG_ARMV8_PSCI
> > @@ -98,27 +101,30 @@ SECTIONS
> >       }
> >  #endif
> >
> > -     . = ALIGN(8);
> > -     .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
> > +     .rodata ALIGN(4096): {
> > +         __start_rodata = .;
> > +         *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
> > +         . = ALIGN(4096);
> > +         __end_rodata = .;
> > +     }
> >
> > -     . = ALIGN(8);
> > -     .data : {
> > +     .data ALIGN(4096) : {
> > +         __start_data = .;
> >               *(.data*)
> > +         . = ALIGN(4096);
> > +         __end_data = .;
> >       }
> >
> > -     . = ALIGN(8);
> > -
> > -     . = .;
> > -
> >       . = ALIGN(8);
> >       __u_boot_list : {
> >               KEEP(*(SORT(__u_boot_list*)));
> >       }
> >
> > -     .efi_runtime_rel : {
> > +     .efi_runtime_rel ALIGN(4096) : {
> >                  __efi_runtime_rel_start = .;
> >               *(.rel*.efi_runtime)
> >               *(.rel*.efi_runtime.*)
> > +             . = ALIGN(4096);
> >                  __efi_runtime_rel_stop = .;
> >       }
> >
> > @@ -136,10 +142,10 @@ SECTIONS
> >       /*
> >        * arch/arm/lib/crt0_64.S assumes __bss_start - __bss_end % 8 == 0
> >        */
> > -     .bss ALIGN(8) : {
> > +     .bss ALIGN(4096) : {
> >               __bss_start = .;
> >               *(.bss*)
> > -             . = ALIGN(8);
> > +             . = ALIGN(4096);
> >               __bss_end = .;
> >       }
> >
> > diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h
> > index b6bca53db10d..5626df796f33 100644
> > --- a/include/asm-generic/sections.h
> > +++ b/include/asm-generic/sections.h
> > @@ -23,6 +23,7 @@ extern char __kprobes_text_start[], __kprobes_text_end[];
> >  extern char __entry_text_start[], __entry_text_end[];
> >  extern char __initdata_begin[], __initdata_end[];
> >  extern char __start_rodata[], __end_rodata[];
> > +extern char __start_data[], __end_data[];
> >  extern char __efi_helloworld_begin[];
> >  extern char __efi_helloworld_end[];
> >  extern char __efi_var_file_begin[];
> > @@ -63,6 +64,7 @@ static inline int arch_is_kernel_data(unsigned long addr)
> >
> >  /* Start of U-Boot text region */
> >  extern char __text_start[];
> > +extern char __text_end[];
> >
> >  /* This marks the text region which must be relocated */
> >  extern char __image_copy_start[], __image_copy_end[];
> > diff --git a/lib/efi_loader/efi_runtime.c b/lib/efi_loader/efi_runtime.c
> > index 35eb6a777665..c10a79301a92 100644
> > --- a/lib/efi_loader/efi_runtime.c
> > +++ b/lib/efi_loader/efi_runtime.c
> > @@ -742,6 +742,8 @@ void efi_runtime_relocate(ulong offset, struct efi_mem_desc *map)
> >                     rel->info, *p, rel->offset);
> >
> >               switch (rel->info & R_MASK) {
> > +             case 0:
> > +                     break;
>
> It looks like this may need to go into the same fixup patch as the
> Makefile changes above.
>
> >               case R_RELATIVE:
> >  #ifdef IS_RELA
> >               newaddr = rel->addend + offset - CONFIG_TEXT_BASE;
>
> For the linker script changes:

All of these are needed in a single patch. The alignment changes
trigger the emitted R_AARCH64_NONE relocs.

Cheers
/Ilias
>
> Acked-by: Jerome Forissier <jerome.forissier@linaro.org>
Jerome Forissier Jan. 30, 2025, 9:27 a.m. UTC | #3
On 1/30/25 10:19, Ilias Apalodimas wrote:
> On Thu, 30 Jan 2025 at 11:09, Jerome Forissier
> <jerome.forissier@linaro.org> wrote:
>>
>> Hi Ilias,
>>
>> On 1/30/25 08:20, Ilias Apalodimas wrote:
>>> Upcoming patches are switching the memory mappings to RW, RO, RW^X page
>>> permissions after the U-Boot binary and its data are relocated. Add
>>> annotations in the linker scripts to and mark text, data, rodata etc
>>> sections and align them to a page boundary
>>>
>>> Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
>>> ---
>>>  Makefile                       | 15 +++++++++------
>>>  arch/arm/cpu/armv8/u-boot.lds  | 32 +++++++++++++++++++-------------
>>>  include/asm-generic/sections.h |  2 ++
>>>  lib/efi_loader/efi_runtime.c   |  2 ++
>>>  4 files changed, 32 insertions(+), 19 deletions(-)
>>>
>>> diff --git a/Makefile b/Makefile
>>> index 33bb86343c5b..8d7c062ec830 100644
>>> --- a/Makefile
>>> +++ b/Makefile
>>> @@ -2176,13 +2176,16 @@ System.map:   u-boot
>>>  # ARM relocations should all be R_ARM_RELATIVE (32-bit) or
>>>  # R_AARCH64_RELATIVE (64-bit).
>>>  checkarmreloc: u-boot
>>> -     @RELOC="`$(CROSS_COMPILE)readelf -r -W $< | cut -d ' ' -f 4 | \
>>> +     @RELOCS="`$(CROSS_COMPILE)readelf -r -W $< | cut -d ' ' -f 4 | \
>>>               grep R_A | sort -u`"; \
>>> -     if test "$$RELOC" != "R_ARM_RELATIVE" -a \
>>> -              "$$RELOC" != "R_AARCH64_RELATIVE"; then \
>>> -             echo "$< contains unexpected relocations: $$RELOC"; \
>>> -             false; \
>>> -     fi
>>> +     for reloc in $$RELOCS; do \
>>> +             if [ "$$reloc" != "R_ARM_RELATIVE" -a \
>>> +                  "$$reloc" != "R_AARCH64_RELATIVE" -a \
>>> +             "$$reloc" != "R_AARCH64_NONE" ]; then \
>>> +                     echo "$< contains unexpected relocations: $$reloc"; \
>>> +                     false; \
>>
>> s/false/exit 1/ otherwise the loop won't break and make won't get a
>> failure status unless the error is on the last reloc.
>>
>>> +             fi; \
>>> +     done
>>
>> This Makefile change seems unrelated to the current patch. Should it
>> go into a separate fixup patch?
>>
>>>  tools/version.h: include/version.h
>>>       $(Q)mkdir -p $(dir $@)
>>> diff --git a/arch/arm/cpu/armv8/u-boot.lds b/arch/arm/cpu/armv8/u-boot.lds
>>> index 857f44412e07..18e168e27135 100644
>>> --- a/arch/arm/cpu/armv8/u-boot.lds
>>> +++ b/arch/arm/cpu/armv8/u-boot.lds
>>> @@ -22,7 +22,7 @@ SECTIONS
>>>
>>>       . = ALIGN(8);
>>>       __image_copy_start = ADDR(.text);
>>> -     .text :
>>> +     .text ALIGN(4096):
>>>       {
>>>               CPUDIR/start.o (.text*)
>>>       }
>>> @@ -36,9 +36,12 @@ SECTIONS
>>>                  __efi_runtime_stop = .;
>>>       }
>>>
>>> -     .text_rest :
>>> +     .text_rest ALIGN(4096) :
>>>       {
>>> +             __text_start = .;
>>>               *(.text*)
>>> +             . = ALIGN(4096);
>>> +             __text_end = .;
>>>       }
>>>
>>>  #ifdef CONFIG_ARMV8_PSCI
>>> @@ -98,27 +101,30 @@ SECTIONS
>>>       }
>>>  #endif
>>>
>>> -     . = ALIGN(8);
>>> -     .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
>>> +     .rodata ALIGN(4096): {
>>> +         __start_rodata = .;
>>> +         *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
>>> +         . = ALIGN(4096);
>>> +         __end_rodata = .;
>>> +     }
>>>
>>> -     . = ALIGN(8);
>>> -     .data : {
>>> +     .data ALIGN(4096) : {
>>> +         __start_data = .;
>>>               *(.data*)
>>> +         . = ALIGN(4096);
>>> +         __end_data = .;
>>>       }
>>>
>>> -     . = ALIGN(8);
>>> -
>>> -     . = .;
>>> -
>>>       . = ALIGN(8);
>>>       __u_boot_list : {
>>>               KEEP(*(SORT(__u_boot_list*)));
>>>       }
>>>
>>> -     .efi_runtime_rel : {
>>> +     .efi_runtime_rel ALIGN(4096) : {
>>>                  __efi_runtime_rel_start = .;
>>>               *(.rel*.efi_runtime)
>>>               *(.rel*.efi_runtime.*)
>>> +             . = ALIGN(4096);
>>>                  __efi_runtime_rel_stop = .;
>>>       }
>>>
>>> @@ -136,10 +142,10 @@ SECTIONS
>>>       /*
>>>        * arch/arm/lib/crt0_64.S assumes __bss_start - __bss_end % 8 == 0
>>>        */
>>> -     .bss ALIGN(8) : {
>>> +     .bss ALIGN(4096) : {
>>>               __bss_start = .;
>>>               *(.bss*)
>>> -             . = ALIGN(8);
>>> +             . = ALIGN(4096);
>>>               __bss_end = .;
>>>       }
>>>
>>> diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h
>>> index b6bca53db10d..5626df796f33 100644
>>> --- a/include/asm-generic/sections.h
>>> +++ b/include/asm-generic/sections.h
>>> @@ -23,6 +23,7 @@ extern char __kprobes_text_start[], __kprobes_text_end[];
>>>  extern char __entry_text_start[], __entry_text_end[];
>>>  extern char __initdata_begin[], __initdata_end[];
>>>  extern char __start_rodata[], __end_rodata[];
>>> +extern char __start_data[], __end_data[];
>>>  extern char __efi_helloworld_begin[];
>>>  extern char __efi_helloworld_end[];
>>>  extern char __efi_var_file_begin[];
>>> @@ -63,6 +64,7 @@ static inline int arch_is_kernel_data(unsigned long addr)
>>>
>>>  /* Start of U-Boot text region */
>>>  extern char __text_start[];
>>> +extern char __text_end[];
>>>
>>>  /* This marks the text region which must be relocated */
>>>  extern char __image_copy_start[], __image_copy_end[];
>>> diff --git a/lib/efi_loader/efi_runtime.c b/lib/efi_loader/efi_runtime.c
>>> index 35eb6a777665..c10a79301a92 100644
>>> --- a/lib/efi_loader/efi_runtime.c
>>> +++ b/lib/efi_loader/efi_runtime.c
>>> @@ -742,6 +742,8 @@ void efi_runtime_relocate(ulong offset, struct efi_mem_desc *map)
>>>                     rel->info, *p, rel->offset);
>>>
>>>               switch (rel->info & R_MASK) {
>>> +             case 0:
>>> +                     break;
>>
>> It looks like this may need to go into the same fixup patch as the
>> Makefile changes above.
>>
>>>               case R_RELATIVE:
>>>  #ifdef IS_RELA
>>>               newaddr = rel->addend + offset - CONFIG_TEXT_BASE;
>>
>> For the linker script changes:
> 
> All of these are needed in a single patch. The alignment changes
> trigger the emitted R_AARCH64_NONE relocs.

Got it. I suggest mentioning this in the commit description.

Please do not forget my comment about the "exit 1" though ;)

Thanks,
Heinrich Schuchardt Jan. 30, 2025, 10:07 a.m. UTC | #4
On 1/30/25 07:20, Ilias Apalodimas wrote:
> Upcoming patches are switching the memory mappings to RW, RO, RW^X page

RWX, RO, RW?

> permissions after the U-Boot binary and its data are relocated. Add
> annotations in the linker scripts to and mark text, data, rodata etc
> sections and align them to a page boundary
>
> Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
> ---
>   Makefile                       | 15 +++++++++------
>   arch/arm/cpu/armv8/u-boot.lds  | 32 +++++++++++++++++++-------------
>   include/asm-generic/sections.h |  2 ++
>   lib/efi_loader/efi_runtime.c   |  2 ++
>   4 files changed, 32 insertions(+), 19 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index 33bb86343c5b..8d7c062ec830 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -2176,13 +2176,16 @@ System.map:	u-boot
>   # ARM relocations should all be R_ARM_RELATIVE (32-bit) or
>   # R_AARCH64_RELATIVE (64-bit).
>   checkarmreloc: u-boot
> -	@RELOC="`$(CROSS_COMPILE)readelf -r -W $< | cut -d ' ' -f 4 | \
> +	@RELOCS="`$(CROSS_COMPILE)readelf -r -W $< | cut -d ' ' -f 4 | \
>   		grep R_A | sort -u`"; \
> -	if test "$$RELOC" != "R_ARM_RELATIVE" -a \
> -		 "$$RELOC" != "R_AARCH64_RELATIVE"; then \
> -		echo "$< contains unexpected relocations: $$RELOC"; \
> -		false; \
> -	fi
> +	for reloc in $$RELOCS; do \
> +		if [ "$$reloc" != "R_ARM_RELATIVE" -a \
> +		     "$$reloc" != "R_AARCH64_RELATIVE" -a \
> +		"$$reloc" != "R_AARCH64_NONE" ]; then \
> +			echo "$< contains unexpected relocations: $$reloc"; \
> +			false; \
> +		fi; \
> +	done

This seems to be an unrelated change that should go into a separate patch.

>
>   tools/version.h: include/version.h
>   	$(Q)mkdir -p $(dir $@)
> diff --git a/arch/arm/cpu/armv8/u-boot.lds b/arch/arm/cpu/armv8/u-boot.lds
> index 857f44412e07..18e168e27135 100644
> --- a/arch/arm/cpu/armv8/u-boot.lds
> +++ b/arch/arm/cpu/armv8/u-boot.lds
> @@ -22,7 +22,7 @@ SECTIONS
>
>   	. = ALIGN(8);
>   	__image_copy_start = ADDR(.text);
> -	.text :
> +	.text ALIGN(4096):
>   	{
>   		CPUDIR/start.o (.text*)
>   	}
> @@ -36,9 +36,12 @@ SECTIONS
>                   __efi_runtime_stop = .;
>   	}
>
> -	.text_rest :
> +	.text_rest ALIGN(4096) :
>   	{
> +		__text_start = .;
>   		*(.text*)
> +		. = ALIGN(4096);
> +		__text_end = .;
>   	}
>
>   #ifdef CONFIG_ARMV8_PSCI
> @@ -98,27 +101,30 @@ SECTIONS
>   	}
>   #endif
>
> -	. = ALIGN(8);
> -	.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
> +	.rodata ALIGN(4096): {
> +	    __start_rodata = .;
> +	    *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
> +	    . = ALIGN(4096);
> +	    __end_rodata = .;
> +	}
>
> -	. = ALIGN(8);
> -	.data : {
> +	.data ALIGN(4096) : {
> +	    __start_data = .;
>   		*(.data*)
> +	    . = ALIGN(4096);
> +	    __end_data = .;
>   	}
>
> -	. = ALIGN(8);
> -
> -	. = .;
> -
>   	. = ALIGN(8);
>   	__u_boot_list : {
>   		KEEP(*(SORT(__u_boot_list*)));
>   	}
>
> -	.efi_runtime_rel : {
> +	.efi_runtime_rel ALIGN(4096) : {
>                   __efi_runtime_rel_start = .;
>   		*(.rel*.efi_runtime)
>   		*(.rel*.efi_runtime.*)
> +		. = ALIGN(4096);
>                   __efi_runtime_rel_stop = .;
>   	}
>
> @@ -136,10 +142,10 @@ SECTIONS
>   	/*
>   	 * arch/arm/lib/crt0_64.S assumes __bss_start - __bss_end % 8 == 0
>   	 */
> -	.bss ALIGN(8) : {
> +	.bss ALIGN(4096) : {
>   		__bss_start = .;
>   		*(.bss*)
> -		. = ALIGN(8);
> +		. = ALIGN(4096);
>   		__bss_end = .;
>   	}
>
> diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h
> index b6bca53db10d..5626df796f33 100644
> --- a/include/asm-generic/sections.h
> +++ b/include/asm-generic/sections.h
> @@ -23,6 +23,7 @@ extern char __kprobes_text_start[], __kprobes_text_end[];
>   extern char __entry_text_start[], __entry_text_end[];
>   extern char __initdata_begin[], __initdata_end[];
>   extern char __start_rodata[], __end_rodata[];
> +extern char __start_data[], __end_data[];
>   extern char __efi_helloworld_begin[];
>   extern char __efi_helloworld_end[];
>   extern char __efi_var_file_begin[];
> @@ -63,6 +64,7 @@ static inline int arch_is_kernel_data(unsigned long addr)
>
>   /* Start of U-Boot text region */
>   extern char __text_start[];
> +extern char __text_end[];
>
>   /* This marks the text region which must be relocated */
>   extern char __image_copy_start[], __image_copy_end[];
> diff --git a/lib/efi_loader/efi_runtime.c b/lib/efi_loader/efi_runtime.c
> index 35eb6a777665..c10a79301a92 100644
> --- a/lib/efi_loader/efi_runtime.c
> +++ b/lib/efi_loader/efi_runtime.c
> @@ -742,6 +742,8 @@ void efi_runtime_relocate(ulong offset, struct efi_mem_desc *map)
>   		      rel->info, *p, rel->offset);
>
>   		switch (rel->info & R_MASK) {
> +		case 0:
> +			break;

This seems to be an unrelated patch that should be in a separate patch.

Best regards

Heinrich

>   		case R_RELATIVE:
>   #ifdef IS_RELA
>   		newaddr = rel->addend + offset - CONFIG_TEXT_BASE;
Ilias Apalodimas Jan. 30, 2025, 10:30 a.m. UTC | #5
Hi Heinrich

On Thu, 30 Jan 2025 at 12:08, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
>
> On 1/30/25 07:20, Ilias Apalodimas wrote:
> > Upcoming patches are switching the memory mappings to RW, RO, RW^X page
>
> RWX, RO, RW?

RW, RX, RO :)

>
> > permissions after the U-Boot binary and its data are relocated. Add
> > annotations in the linker scripts to and mark text, data, rodata etc
> > sections and align them to a page boundary
> >
> > Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
> > ---
> >   Makefile                       | 15 +++++++++------
> >   arch/arm/cpu/armv8/u-boot.lds  | 32 +++++++++++++++++++-------------
> >   include/asm-generic/sections.h |  2 ++
> >   lib/efi_loader/efi_runtime.c   |  2 ++
> >   4 files changed, 32 insertions(+), 19 deletions(-)
> >
> > diff --git a/Makefile b/Makefile
> > index 33bb86343c5b..8d7c062ec830 100644
> > --- a/Makefile
> > +++ b/Makefile
> > @@ -2176,13 +2176,16 @@ System.map:   u-boot
> >   # ARM relocations should all be R_ARM_RELATIVE (32-bit) or
> >   # R_AARCH64_RELATIVE (64-bit).
> >   checkarmreloc: u-boot
> > -     @RELOC="`$(CROSS_COMPILE)readelf -r -W $< | cut -d ' ' -f 4 | \
> > +     @RELOCS="`$(CROSS_COMPILE)readelf -r -W $< | cut -d ' ' -f 4 | \
> >               grep R_A | sort -u`"; \
> > -     if test "$$RELOC" != "R_ARM_RELATIVE" -a \
> > -              "$$RELOC" != "R_AARCH64_RELATIVE"; then \
> > -             echo "$< contains unexpected relocations: $$RELOC"; \
> > -             false; \
> > -     fi
> > +     for reloc in $$RELOCS; do \
> > +             if [ "$$reloc" != "R_ARM_RELATIVE" -a \
> > +                  "$$reloc" != "R_AARCH64_RELATIVE" -a \
> > +             "$$reloc" != "R_AARCH64_NONE" ]; then \
> > +                     echo "$< contains unexpected relocations: $$reloc"; \
> > +                     false; \
> > +             fi; \
> > +     done
>
> This seems to be an unrelated change that should go into a separate patch.

It's not, R_AARCH64_NONE relocation are emitted now due to the section
alignments.

>
> >
> >   tools/version.h: include/version.h
> >       $(Q)mkdir -p $(dir $@)
> > diff --git a/arch/arm/cpu/armv8/u-boot.lds b/arch/arm/cpu/armv8/u-boot.lds
> > index 857f44412e07..18e168e27135 100644
> > --- a/arch/arm/cpu/armv8/u-boot.lds
> > +++ b/arch/arm/cpu/armv8/u-boot.lds
> > @@ -22,7 +22,7 @@ SECTIONS
> >
> >       . = ALIGN(8);
> >       __image_copy_start = ADDR(.text);
> > -     .text :
> > +     .text ALIGN(4096):
> >       {
> >               CPUDIR/start.o (.text*)
> >       }
> > @@ -36,9 +36,12 @@ SECTIONS
> >                   __efi_runtime_stop = .;
> >       }
> >
> > -     .text_rest :
> > +     .text_rest ALIGN(4096) :
> >       {
> > +             __text_start = .;
> >               *(.text*)
> > +             . = ALIGN(4096);
> > +             __text_end = .;
> >       }
> >
> >   #ifdef CONFIG_ARMV8_PSCI
> > @@ -98,27 +101,30 @@ SECTIONS
> >       }
> >   #endif
> >
> > -     . = ALIGN(8);
> > -     .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
> > +     .rodata ALIGN(4096): {
> > +         __start_rodata = .;
> > +         *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
> > +         . = ALIGN(4096);
> > +         __end_rodata = .;
> > +     }
> >
> > -     . = ALIGN(8);
> > -     .data : {
> > +     .data ALIGN(4096) : {
> > +         __start_data = .;
> >               *(.data*)
> > +         . = ALIGN(4096);
> > +         __end_data = .;
> >       }
> >
> > -     . = ALIGN(8);
> > -
> > -     . = .;
> > -
> >       . = ALIGN(8);
> >       __u_boot_list : {
> >               KEEP(*(SORT(__u_boot_list*)));
> >       }
> >
> > -     .efi_runtime_rel : {
> > +     .efi_runtime_rel ALIGN(4096) : {
> >                   __efi_runtime_rel_start = .;
> >               *(.rel*.efi_runtime)
> >               *(.rel*.efi_runtime.*)
> > +             . = ALIGN(4096);
> >                   __efi_runtime_rel_stop = .;
> >       }
> >
> > @@ -136,10 +142,10 @@ SECTIONS
> >       /*
> >        * arch/arm/lib/crt0_64.S assumes __bss_start - __bss_end % 8 == 0
> >        */
> > -     .bss ALIGN(8) : {
> > +     .bss ALIGN(4096) : {
> >               __bss_start = .;
> >               *(.bss*)
> > -             . = ALIGN(8);
> > +             . = ALIGN(4096);
> >               __bss_end = .;
> >       }
> >
> > diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h
> > index b6bca53db10d..5626df796f33 100644
> > --- a/include/asm-generic/sections.h
> > +++ b/include/asm-generic/sections.h
> > @@ -23,6 +23,7 @@ extern char __kprobes_text_start[], __kprobes_text_end[];
> >   extern char __entry_text_start[], __entry_text_end[];
> >   extern char __initdata_begin[], __initdata_end[];
> >   extern char __start_rodata[], __end_rodata[];
> > +extern char __start_data[], __end_data[];
> >   extern char __efi_helloworld_begin[];
> >   extern char __efi_helloworld_end[];
> >   extern char __efi_var_file_begin[];
> > @@ -63,6 +64,7 @@ static inline int arch_is_kernel_data(unsigned long addr)
> >
> >   /* Start of U-Boot text region */
> >   extern char __text_start[];
> > +extern char __text_end[];
> >
> >   /* This marks the text region which must be relocated */
> >   extern char __image_copy_start[], __image_copy_end[];
> > diff --git a/lib/efi_loader/efi_runtime.c b/lib/efi_loader/efi_runtime.c
> > index 35eb6a777665..c10a79301a92 100644
> > --- a/lib/efi_loader/efi_runtime.c
> > +++ b/lib/efi_loader/efi_runtime.c
> > @@ -742,6 +742,8 @@ void efi_runtime_relocate(ulong offset, struct efi_mem_desc *map)
> >                     rel->info, *p, rel->offset);
> >
> >               switch (rel->info & R_MASK) {
> > +             case 0:
> > +                     break;
>
> This seems to be an unrelated patch that should be in a separate patch.

Same as above

Cheers
/Ilias
>
> Best regards
>
> Heinrich
>
> >               case R_RELATIVE:
> >   #ifdef IS_RELA
> >               newaddr = rel->addend + offset - CONFIG_TEXT_BASE;
>
diff mbox series

Patch

diff --git a/Makefile b/Makefile
index 33bb86343c5b..8d7c062ec830 100644
--- a/Makefile
+++ b/Makefile
@@ -2176,13 +2176,16 @@  System.map:	u-boot
 # ARM relocations should all be R_ARM_RELATIVE (32-bit) or
 # R_AARCH64_RELATIVE (64-bit).
 checkarmreloc: u-boot
-	@RELOC="`$(CROSS_COMPILE)readelf -r -W $< | cut -d ' ' -f 4 | \
+	@RELOCS="`$(CROSS_COMPILE)readelf -r -W $< | cut -d ' ' -f 4 | \
 		grep R_A | sort -u`"; \
-	if test "$$RELOC" != "R_ARM_RELATIVE" -a \
-		 "$$RELOC" != "R_AARCH64_RELATIVE"; then \
-		echo "$< contains unexpected relocations: $$RELOC"; \
-		false; \
-	fi
+	for reloc in $$RELOCS; do \
+		if [ "$$reloc" != "R_ARM_RELATIVE" -a \
+		     "$$reloc" != "R_AARCH64_RELATIVE" -a \
+		"$$reloc" != "R_AARCH64_NONE" ]; then \
+			echo "$< contains unexpected relocations: $$reloc"; \
+			false; \
+		fi; \
+	done
 
 tools/version.h: include/version.h
 	$(Q)mkdir -p $(dir $@)
diff --git a/arch/arm/cpu/armv8/u-boot.lds b/arch/arm/cpu/armv8/u-boot.lds
index 857f44412e07..18e168e27135 100644
--- a/arch/arm/cpu/armv8/u-boot.lds
+++ b/arch/arm/cpu/armv8/u-boot.lds
@@ -22,7 +22,7 @@  SECTIONS
 
 	. = ALIGN(8);
 	__image_copy_start = ADDR(.text);
-	.text :
+	.text ALIGN(4096):
 	{
 		CPUDIR/start.o (.text*)
 	}
@@ -36,9 +36,12 @@  SECTIONS
                 __efi_runtime_stop = .;
 	}
 
-	.text_rest :
+	.text_rest ALIGN(4096) :
 	{
+		__text_start = .;
 		*(.text*)
+		. = ALIGN(4096);
+		__text_end = .;
 	}
 
 #ifdef CONFIG_ARMV8_PSCI
@@ -98,27 +101,30 @@  SECTIONS
 	}
 #endif
 
-	. = ALIGN(8);
-	.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
+	.rodata ALIGN(4096): {
+	    __start_rodata = .;
+	    *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
+	    . = ALIGN(4096);
+	    __end_rodata = .;
+	}
 
-	. = ALIGN(8);
-	.data : {
+	.data ALIGN(4096) : {
+	    __start_data = .;
 		*(.data*)
+	    . = ALIGN(4096);
+	    __end_data = .;
 	}
 
-	. = ALIGN(8);
-
-	. = .;
-
 	. = ALIGN(8);
 	__u_boot_list : {
 		KEEP(*(SORT(__u_boot_list*)));
 	}
 
-	.efi_runtime_rel : {
+	.efi_runtime_rel ALIGN(4096) : {
                 __efi_runtime_rel_start = .;
 		*(.rel*.efi_runtime)
 		*(.rel*.efi_runtime.*)
+		. = ALIGN(4096);
                 __efi_runtime_rel_stop = .;
 	}
 
@@ -136,10 +142,10 @@  SECTIONS
 	/*
 	 * arch/arm/lib/crt0_64.S assumes __bss_start - __bss_end % 8 == 0
 	 */
-	.bss ALIGN(8) : {
+	.bss ALIGN(4096) : {
 		__bss_start = .;
 		*(.bss*)
-		. = ALIGN(8);
+		. = ALIGN(4096);
 		__bss_end = .;
 	}
 
diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h
index b6bca53db10d..5626df796f33 100644
--- a/include/asm-generic/sections.h
+++ b/include/asm-generic/sections.h
@@ -23,6 +23,7 @@  extern char __kprobes_text_start[], __kprobes_text_end[];
 extern char __entry_text_start[], __entry_text_end[];
 extern char __initdata_begin[], __initdata_end[];
 extern char __start_rodata[], __end_rodata[];
+extern char __start_data[], __end_data[];
 extern char __efi_helloworld_begin[];
 extern char __efi_helloworld_end[];
 extern char __efi_var_file_begin[];
@@ -63,6 +64,7 @@  static inline int arch_is_kernel_data(unsigned long addr)
 
 /* Start of U-Boot text region */
 extern char __text_start[];
+extern char __text_end[];
 
 /* This marks the text region which must be relocated */
 extern char __image_copy_start[], __image_copy_end[];
diff --git a/lib/efi_loader/efi_runtime.c b/lib/efi_loader/efi_runtime.c
index 35eb6a777665..c10a79301a92 100644
--- a/lib/efi_loader/efi_runtime.c
+++ b/lib/efi_loader/efi_runtime.c
@@ -742,6 +742,8 @@  void efi_runtime_relocate(ulong offset, struct efi_mem_desc *map)
 		      rel->info, *p, rel->offset);
 
 		switch (rel->info & R_MASK) {
+		case 0:
+			break;
 		case R_RELATIVE:
 #ifdef IS_RELA
 		newaddr = rel->addend + offset - CONFIG_TEXT_BASE;