On 2/5/25 08:16, Ilias Apalodimas wrote:
> Now that we have everything in place switch the page permissions for
> .rodata, .text and .data just after we relocate everything in top of the
> RAM.
> 
> Unfortunately we can't enable this by default, since we have examples of
> U-Boot crashing due to invalid access. This usually happens because code
> defines const variables that it later writes. So hide it behind a Kconfig
> option until we sort it out.
> 
> It's worth noting that EFI runtime services are not covered by this
> patch on purpose. Since the OS can call SetVirtualAddressMap which can
> relocate runtime services, we need to set them to RX initially but remap
> them as RWX right before ExitBootServices.
> 
> Link: 
> https://lore.kernel.org/u-boot/20250129-rockchip-pinctrl-const-v1-0-450ccdadf...@cherry.de/
> Link: 
> https://lore.kernel.org/u-boot/20250130133646.2177194-1-andre.przyw...@arm.com/
> Signed-off-by: Ilias Apalodimas <ilias.apalodi...@linaro.org>
> ---
>  common/Kconfig   | 13 +++++++++++++
>  common/board_r.c | 20 ++++++++++++++++++++
>  2 files changed, 33 insertions(+)
> 
> diff --git a/common/Kconfig b/common/Kconfig
> index 7685914fa6fd..dbae7e062b0a 100644
> --- a/common/Kconfig
> +++ b/common/Kconfig
> @@ -914,6 +914,19 @@ config STACKPROTECTOR
>         Enable stack smash detection through compiler's stack-protector
>         canary logic
>  
> +config MMU_PGPROT
> +     bool "Enable RO, RW and RX mappings"
> +     help
> +       U-Boot maps all pages as RWX. If selected pages will
> +       be marked as RO(.rodata), RX(.text), RW(.data) right after

Space before (

> +       we relocate. Since code sections needs to be page aligned
> +       the final binary size will increase.
> +       The mapping can be dumped using the 'meminfo' command.

OK

> +       We should make this default 'y' in the future, but currently
> +       we have code defining const variables that are later written.
> +       Enabling this will crash U-Boot if that code path runs, so keep
> +       it off by default until we fix invalid accesses.

Not sure this needs to be documented in the Kconfig help. Perhaps just
keep a patch ready and send it early in the next release cycle for people
to test and debug?

> +
>  config SPL_STACKPROTECTOR
>       bool "Stack Protector buffer overflow detection for SPL"
>       depends on STACKPROTECTOR && SPL
> diff --git a/common/board_r.c b/common/board_r.c
> index 179259b00de8..c1e9aa46e3fa 100644
> --- a/common/board_r.c
> +++ b/common/board_r.c
> @@ -170,7 +170,27 @@ static int initr_reloc_global_data(void)
>       efi_save_gd();
>  
>       efi_runtime_relocate(gd->relocaddr, NULL);
> +
>  #endif
> +     /*
> +      * We are done with all relocations change the permissions of the binary
> +      * NOTE: __start_rodata etc are defined in arm64 linker scripts and
> +      * sections.h. If you want to add support for your platform you need to
> +      * add the symbols on your linker script, otherwise they will point to
> +      * random addresses.
> +      *
> +      */
> +     if (IS_ENABLED(CONFIG_MMU_PGPROT)) {
> +             pgprot_set_attrs((phys_addr_t)(uintptr_t)(__start_rodata),
> +                              (phys_addr_t)(uintptr_t)(__end_rodata - 
> __start_rodata),
> +                              MMU_ATTR_RO);
> +             pgprot_set_attrs((phys_addr_t)(uintptr_t)(__start_data),
> +                              (phys_addr_t)(uintptr_t)(__end_data - 
> __start_data),
> +                              MMU_ATTR_RW);
> +             pgprot_set_attrs((phys_addr_t)(uintptr_t)(__text_start),
> +                              (phys_addr_t)(uintptr_t)(__text_end - 
> __text_start),
> +                              MMU_ATTR_RX);
> +     }
>  
>       return 0;
>  }

Reviewed-by: Jerome Forissier <jerome.foriss...@linaro.org>

Thanks,
-- 
Jerome

Reply via email to