[U-Boot] [PATCH] ARM: bootm: do not add PSCI to fdt when booting in secure mode.

Hans de Goede hdegoede at redhat.com
Sun Dec 28 12:30:40 CET 2014


Hi,

On 21-12-14 10:45, Ian Campbell wrote:
> Commit 8bc347e2ec17 "ARM: bootm: Allow booting in secure mode on hyp capable
> systems" added the capability to select nonsec vs sec mode boot via an
> environment var.
>
> There is a subtle gotcha with this functionality, which is that the PSCI nodes
> are still created in the fdt (via armv7_update_dt->fdt_psci) even when booting
> in secure mode. Which means that if the kernel is PSCI aware then it will fail
> to boot because it will try and do PSCI from secure world, which won't work.
>
> This likely didn't get noticed before because the original purpose was to
> support booting the legacy linux-sunxi kernels which don't understand PSCI.
>
> To fix expose boot_nonsec (renaming with armv7_ prefix) outside of bootm.c and
> use from the virt-dt code.
>
> As well as avoiding the creation of the PSCI nodes we should also avoid
> reserving the secure RAM, so do so.
>
> Signed-off-by: Ian Campbell <ijc at hellion.org.uk>
> Cc: Hans de Goede <hdegoede at redhat.com>
> Cc: Albert ARIBAUD <albert.u.boot at aribaud.net>
> Cc: Tom Rini <trini at ti.com>

Looks good to me:

Acked-by: Hans de Goede <hdegoede at redhat.com>

> ---
> I think this should go into v2015.01 as a bug fix.

Agreed.

Regards,

Hans

> ---
>   arch/arm/cpu/armv7/virt-dt.c | 2 ++
>   arch/arm/include/asm/armv7.h | 1 +
>   arch/arm/lib/bootm.c         | 4 ++--
>   3 files changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/cpu/armv7/virt-dt.c b/arch/arm/cpu/armv7/virt-dt.c
> index 0b0d6a7..ad19e4c 100644
> --- a/arch/arm/cpu/armv7/virt-dt.c
> +++ b/arch/arm/cpu/armv7/virt-dt.c
> @@ -90,6 +90,8 @@ static int fdt_psci(void *fdt)
>
>   int armv7_update_dt(void *fdt)
>   {
> +	if (!armv7_boot_nonsec())
> +		return 0;
>   #ifndef CONFIG_ARMV7_SECURE_BASE
>   	/* secure code lives in RAM, keep it alive */
>   	fdt_add_mem_rsv(fdt, (unsigned long)__secure_start,
> diff --git a/arch/arm/include/asm/armv7.h b/arch/arm/include/asm/armv7.h
> index 323f282..a13da23 100644
> --- a/arch/arm/include/asm/armv7.h
> +++ b/arch/arm/include/asm/armv7.h
> @@ -80,6 +80,7 @@ void v7_outer_cache_inval_range(u32 start, u32 end);
>
>   int armv7_init_nonsec(void);
>   int armv7_update_dt(void *fdt);
> +bool armv7_boot_nonsec(void);
>
>   /* defined in assembly file */
>   unsigned int _nonsec_init(void);
> diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c
> index a7f7c67..0c1298a 100644
> --- a/arch/arm/lib/bootm.c
> +++ b/arch/arm/lib/bootm.c
> @@ -238,7 +238,7 @@ static void boot_prep_linux(bootm_headers_t *images)
>   }
>
>   #if defined(CONFIG_ARMV7_NONSEC) || defined(CONFIG_ARMV7_VIRT)
> -static bool boot_nonsec(void)
> +bool armv7_boot_nonsec(void)
>   {
>   	char *s = getenv("bootm_boot_mode");
>   #ifdef CONFIG_ARMV7_BOOT_SEC_DEFAULT
> @@ -305,7 +305,7 @@ static void boot_jump_linux(bootm_headers_t *images, int flag)
>
>   	if (!fake) {
>   #if defined(CONFIG_ARMV7_NONSEC) || defined(CONFIG_ARMV7_VIRT)
> -		if (boot_nonsec()) {
> +		if (armv7_boot_nonsec()) {
>   			armv7_init_nonsec();
>   			secure_ram_addr(_do_nonsec_entry)(kernel_entry,
>   							  0, machid, r2);
>


More information about the U-Boot mailing list