[U-Boot] [PATCH] ti: clocks: Fix do_enable_clocks() to accept NULL pointers as input parameters

Lokesh Vutla lokeshvutla at ti.com
Fri Mar 24 02:02:35 UTC 2017



On 3/24/2017 3:54 AM, Lukasz Majewski wrote:
> Up till this commit passing NULL as input parameter was allowed, but not
> handled properly.
> 
> When one passed NULL to one of this function parameters, the code was
> executed causing data abort.
> 
> However, what is more interesting, the abort was not caught because of code
> execution in HYP mode with masked CPSR A bit ("Imprecise Data Abort mask bit).
> The TI's AM57xx SoC switch to HYP mode with A bit masked in lowlevel_init.S
> due to SMC call. Such operation (by default) is performed in SoC ROM code.
> 
> The problem would pop up when one:
> - Switch back to SVC mode after disabling LPAE support
> - Somebody enables A bit (by executing cpsie a asm instruction)
> 
> and then the previously described exception would be caught.
> 
> Signed-off-by: Lukasz Majewski <lukma at denx.de>
> ---
>  arch/arm/cpu/armv7/omap-common/clocks-common.c | 10 ++++++----

This has been moved to arch/arm/mach-omap2/clocks-common.c
Please use the latest U-Boot.

>  1 file changed, 6 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/arm/cpu/armv7/omap-common/clocks-common.c b/arch/arm/cpu/armv7/omap-common/clocks-common.c
> index 097b8e3..157155a 100644
> --- a/arch/arm/cpu/armv7/omap-common/clocks-common.c
> +++ b/arch/arm/cpu/armv7/omap-common/clocks-common.c
> @@ -822,27 +822,29 @@ void do_enable_clocks(u32 const *clk_domains,
>  	u32 i, max = 100;
>  
>  	/* Put the clock domains in SW_WKUP mode */
> -	for (i = 0; (i < max) && clk_domains[i]; i++) {
> +	for (i = 0; (i < max) && clk_domains && clk_domains[i]; i++) {

Instead of checking for clk_domains every time, can we use max as
ARRAY_SIZE(clk_domains)? Similarly other places.

Thanks and regards,
Lokesh

>  		enable_clock_domain(clk_domains[i],
>  				    CD_CLKCTRL_CLKTRCTRL_SW_WKUP);
>  	}
>  
>  	/* Clock modules that need to be put in HW_AUTO */
> -	for (i = 0; (i < max) && clk_modules_hw_auto[i]; i++) {
> +	for (i = 0; (i < max) && clk_modules_hw_auto &&
> +		     clk_modules_hw_auto[i]; i++) {
>  		enable_clock_module(clk_modules_hw_auto[i],
>  				    MODULE_CLKCTRL_MODULEMODE_HW_AUTO,
>  				    wait_for_enable);
>  	};
>  
>  	/* Clock modules that need to be put in SW_EXPLICIT_EN mode */
> -	for (i = 0; (i < max) && clk_modules_explicit_en[i]; i++) {
> +	for (i = 0; (i < max) && clk_modules_explicit_en &&
> +		     clk_modules_explicit_en[i]; i++) {
>  		enable_clock_module(clk_modules_explicit_en[i],
>  				    MODULE_CLKCTRL_MODULEMODE_SW_EXPLICIT_EN,
>  				    wait_for_enable);
>  	};
>  
>  	/* Put the clock domains in HW_AUTO mode now */
> -	for (i = 0; (i < max) && clk_domains[i]; i++) {
> +	for (i = 0; (i < max) && clk_domains && clk_domains[i]; i++) {
>  		enable_clock_domain(clk_domains[i],
>  				    CD_CLKCTRL_CLKTRCTRL_HW_AUTO);
>  	}
> 


More information about the U-Boot mailing list