[PATCH v2 5/6] arm: Use armv8_switch_to_el1 env to switch to EL1

Andre Przywara andre.przywara at arm.com
Fri Aug 20 18:57:51 CEST 2021


On 8/19/21 4:53 PM, Peter Hoyes wrote:

Hi,

> From: Peter Hoyes <Peter.Hoyes at arm.com>
> 
> Use the environment variable armv8_switch_to_el1 to determine whether
> to switch to EL1 at runtime. This is an alternative to the
> CONFIG_ARMV8_SWITCH_TO_EL1 compile-time option.

This might be useful outside of the v8-R64 FVP. I cannot find 
CONFIG_ARMV8_SWITCH_TO_EL1 being set anywhere, which makes me wonder how 
this is used? Are there certain custom builds which define this somehow?

In any case forcing "kernel" entry in either EL1 or EL2, and deciding 
this at runtime sounds useful for certain scenarios in general, and be 
it for debugging and testing. So shall we get rid of this compile time 
option at all, or shall this be retained to avoid extra code?

> The environment variable will be ineffective if the ARMV8_MULTIENTRY
> config is used.
> 
> This is required by the Armv8r64 architecture, which must be able to
> boot at S-EL1 for Linux but may need to boot at other ELs for other
> systems.
> 
> Signed-off-by: Peter Hoyes <Peter.Hoyes at arm.com>
> ---
>   arch/arm/lib/bootm.c | 40 +++++++++++++++++++++++++---------------
>   1 file changed, 25 insertions(+), 15 deletions(-)
> 
> diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c
> index f60ee3a7e6..ea9bfe7570 100644
> --- a/arch/arm/lib/bootm.c
> +++ b/arch/arm/lib/bootm.c
> @@ -317,7 +317,6 @@ __weak void update_os_arch_secondary_cores(uint8_t os_arch)
>   {
>   }
>   
> -#ifdef CONFIG_ARMV8_SWITCH_TO_EL1
>   static void switch_to_el1(void)
>   {
>   	if ((IH_ARCH_DEFAULT == IH_ARCH_ARM64) &&
> @@ -332,7 +331,6 @@ static void switch_to_el1(void)
>   				    ES_TO_AARCH64);
>   }
>   #endif
> -#endif
>   
>   /* Subcommand: GO */
>   static void boot_jump_linux(bootm_headers_t *images, int flag)
> @@ -359,21 +357,33 @@ static void boot_jump_linux(bootm_headers_t *images, int flag)
>   
>   		update_os_arch_secondary_cores(images->os.arch);
>   
> -#ifdef CONFIG_ARMV8_SWITCH_TO_EL1
> -		armv8_switch_to_el2((u64)images->ft_addr, 0, 0, 0,
> -				    (u64)switch_to_el1, ES_TO_AARCH64);
> +#ifdef CONFIG_ARMV8_MULTIENTRY
> +		int armv8_switch_to_el1 = -1;
>   #else
> -		if ((IH_ARCH_DEFAULT == IH_ARCH_ARM64) &&
> -		    (images->os.arch == IH_ARCH_ARM))
> -			armv8_switch_to_el2(0, (u64)gd->bd->bi_arch_number,
> -					    (u64)images->ft_addr, 0,
> -					    (u64)images->ep,
> -					    ES_TO_AARCH32);
> -		else
> -			armv8_switch_to_el2((u64)images->ft_addr, 0, 0, 0,
> -					    images->ep,
> -					    ES_TO_AARCH64);
> +		int armv8_switch_to_el1 = env_get_yesno("armv8_switch_to_el1");
>   #endif
> +#ifdef CONFIG_ARMV8_SWITCH_TO_EL1
> +		if (armv8_switch_to_el1 == -1) {
> +			armv8_switch_to_el1 = 1;
> +		}
> +#endif
> +		if (armv8_switch_to_el1 == 1) {

This looks confusing. Can't we use CONFIG_IS_ENABLED() and override 
armv8_switch_to_el1, then use this one variable to trigger the action?

Cheers,
Andre

> +			armv8_switch_to_el2((u64)images->ft_addr, 0, 0, 0,
> +					    (u64)switch_to_el1, ES_TO_AARCH64);
> +		} else {
> +			if ((IH_ARCH_DEFAULT == IH_ARCH_ARM64) &&
> +					(images->os.arch == IH_ARCH_ARM))
> +				armv8_switch_to_el2(0,
> +						    (u64)gd->bd->bi_arch_number,
> +						    (u64)images->ft_addr, 0,
> +						    (u64)images->ep,
> +						    ES_TO_AARCH32);
> +			else
> +				armv8_switch_to_el2((u64)images->ft_addr,
> +						    0, 0, 0,
> +						    images->ep,
> +						    ES_TO_AARCH64);
> +		}
>   	}
>   #else
>   	unsigned long machid = gd->bd->bi_arch_number;
> 



More information about the U-Boot mailing list