[PATCH] powerpc/prom_init: Check display props exist before enabling btext

Alexey Kardashevskiy aik at ozlabs.ru
Sat Aug 22 18:37:58 AEST 2020



On 21/08/2020 20:34, Michael Ellerman wrote:
> It's possible to enable CONFIG_PPC_EARLY_DEBUG_BOOTX for a pseries
> kernel (maybe it shouldn't be), which is then booted with qemu/slof.


CONFIG_BOOTX_TEXT=y
CONFIG_PPC_EARLY_DEBUG=y
CONFIG_PPC_EARLY_DEBUG_BOOTX=y

this does not crash my VM. The changed chunk is sitting under "if
(prom_getprop(node, "linux,boot-display", NULL, 0)" and I cannot find
what creates this property - it is neither slof/grub/qemu, unlikely that
it is phyp so it must be this one:

arch/powerpc/platforms/powermac/bootx_init.c|244|
bootx_dt_add_string("linux,boot-display", mem_end);


which is powermac and not pseries. Or may be that pmac firmware.

Where did you see this crash?


> But if you do that the kernel crashes in draw_byte(), with a DAR
> pointing somewhere near INT_MAX.
> 
> Adding some debug to prom_init we see that we're not able to read the
> "address" property from OF, so we're just using whatever junk value
> was on the stack.
> 
> So check the properties can be read properly from OF, if not we bail
> out before initialising btext, which avoids the crash.

This is a right thing any way, just the commit log is confusing.

Reviewed-by: Alexey Kardashevskiy <aik at ozlabs.ru>



> 
> Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>
> ---
>  arch/powerpc/kernel/prom_init.c | 17 +++++++++++++----
>  1 file changed, 13 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c
> index ae7ec9903191..5090a5ab54e5 100644
> --- a/arch/powerpc/kernel/prom_init.c
> +++ b/arch/powerpc/kernel/prom_init.c
> @@ -2422,10 +2422,19 @@ static void __init prom_check_displays(void)
>  			u32 width, height, pitch, addr;
>  
>  			prom_printf("Setting btext !\n");
> -			prom_getprop(node, "width", &width, 4);
> -			prom_getprop(node, "height", &height, 4);
> -			prom_getprop(node, "linebytes", &pitch, 4);
> -			prom_getprop(node, "address", &addr, 4);
> +
> +			if (prom_getprop(node, "width", &width, 4) == PROM_ERROR)
> +				return;
> +
> +			if (prom_getprop(node, "height", &height, 4) == PROM_ERROR)
> +				return;
> +
> +			if (prom_getprop(node, "linebytes", &pitch, 4) == PROM_ERROR)
> +				return;
> +
> +			if (prom_getprop(node, "address", &addr, 4) == PROM_ERROR)
> +				return;
> +
>  			prom_printf("W=%d H=%d LB=%d addr=0x%x\n",
>  				    width, height, pitch, addr);
>  			btext_setup_display(width, height, 8, pitch, addr);
> 

-- 
Alexey


More information about the Linuxppc-dev mailing list