[PATCH v2] cmd: bcb: select user(0) hwpart in __bcb_load()

Sean Anderson sean.anderson at seco.com
Thu Oct 13 17:24:41 CEST 2022



On 10/13/22 8:25 AM, Mattijs Korpershoek wrote:
> For some blk operations, it's possible that a different hw partition
> gets selected via blk_dselect_hwpart().
> In that case, only the region of the device covered by that partition
> is accessible.
> 
> This breaks "bcb load" which attempts to read the gpt and assumes it's
> on the user(0) hw partition:
> 
> => bcb load 2 misc
> GUID Partition Table Header signature is wrong: 0xDE7B17AD07D9E5D6 != 0x5452415020494645
> find_valid_gpt: *** ERROR: Invalid GPT ***
> GUID Partition Table Header signature is wrong: 0x0 != 0x5452415020494645
> find_valid_gpt: *** ERROR: Invalid Backup GPT ***
> Error: mmc 2:misc read failed (-2)
> 
> Add a fail-safe in __bcb_load() to ensure we will always read from the
> user(0) hwpartition.
> 
> This fixes the following fastboot sequence:
> 
> $ fastboot erase mmc2boot1    # switch to hwpart1
> $ fastboot reboot bootloader  # switch to hwpart0, then reads GPT
> 
> Signed-off-by: Mattijs Korpershoek <mkorpershoek at baylibre.com>
> ---
> Changes in v2:
> 
> * Move hwpart selection into the bcb command instead of fb_mmc.c
> * Link to v1: https://lore.kernel.org/r/20221010-switch-hwpart-v1-0-52cbd34c72b7@baylibre.com
> ---
>  cmd/bcb.c | 11 +++++++++++
>  1 file changed, 11 insertions(+)
> 
> diff --git a/cmd/bcb.c b/cmd/bcb.c
> index 1622a90c97f0..02d0c70d87e2 100644
> --- a/cmd/bcb.c
> +++ b/cmd/bcb.c
> @@ -14,6 +14,7 @@
>  #include <part.h>
>  #include <malloc.h>
>  #include <memalign.h>
> +#include <linux/err.h>
>  
>  enum bcb_cmd {
>  	BCB_CMD_LOAD,
> @@ -128,6 +129,16 @@ static int __bcb_load(int devnum, const char *partp)
>  		goto err_read_fail;
>  	}
>  
> +	/*
> +	 * always select the USER mmc hwpart in case another
> +	 * blk operation selected a different hwpart
> +	 */
> +	ret = blk_dselect_hwpart(desc, 0);
> +	if (IS_ERR_VALUE(ret)) {
> +		ret = -ENODEV;
> +		goto err_read_fail;
> +	}
> +
>  	part = simple_strtoul(partp, &endp, 0);
>  	if (*endp == '\0') {
>  		ret = part_get_info(desc, part, &info);
> 
> ---
> base-commit: c4c32e359662aa95d9dbda2bd1272181bd9cb830
> change-id: 20221011-usb-hwpart-599c278980b3
> 
> Best regards,
> 

Reviewed-by: Sean Anderson <sean.anderson at seco.com>


More information about the U-Boot mailing list