[PATCH v13 00/24] Modernize U-Boot shell

Patrice CHOTARD patrice.chotard at foss.st.com
Wed Jan 17 11:05:28 CET 2024



On 1/16/24 18:25, Francis Laniel wrote:
> Hi!
> 
> 
> Le mardi 16 janvier 2024, 00:34:24 +07 Patrice CHOTARD a écrit :
>> On 1/11/24 18:04, Francesco Dolcini wrote:
>>> Hello Tom, Francis
>>>
>>> On Fri, Dec 29, 2023 at 07:55:37PM +0100, Francis Laniel wrote:
>>>> Le jeudi 28 décembre 2023, 21:58:59 CET Tom Rini a écrit :
>>>>> On Fri, 22 Dec 2023 22:02:20 +0100, Francis Laniel wrote:
>>>>>> During 2021 summer, Sean Anderson wrote a contribution to add a new
>>>>>> shell,
>>>>>> based on LIL, to U-Boot [1, 2].
>>>>>> While one of the goals of this contribution was to address the fact
>>>>>> actual
>>>>>> U-Boot shell, which is based on Busybox hush, is old there was a
>>>>>> discussion
>>>>>> about adding a new shell versus updating the actual one [3, 4].
>>>>>>
>>>>>> So, in this series, with Harald Seiler, we updated the actual U-Boot
>>>>>> shell
>>>>>> to reflect what is currently in Busybox source code.
>>>>>> Basically, this contribution is about taking a snapshot of Busybox
>>>>>> shell/hush.c file (as it exists in commit 37460f5da) and adapt it to
>>>>>> suit
>>>>>> U-Boot needs.
>>>>>>
>>>>>> [...]
>>>>>
>>>>> Applied to u-boot/next, thanks!
>>>>
>>>> Thank you for the merge!
>>>> If there is any problem, do not hesitate to mail me and I will take care
>>>> of
>>>> it!
>>>
>>> This change, specifically setting the modern hush shell as default, is
>>> breaking our boot script, just noticed since the current U-Boot master
>>> has a regression for us.
>>>
>>> We still need to figure out the exact details, here [1] you can find the
>>> boot script (that has some placeholder that is replaced during build).
>>>
>>> and the error is something like:
>>>
>>> ```
>>> ## Executing script at 90280000
>>> Loading DeviceTree: k3-am625-verdin-nonwifi-dev.dtb
>>> 69025 bytes read in 11 ms (6 MiB/s)
>>> 82 bytes read in 9 ms (8.8 KiB/s)
>>> Working FDT set to 90200000
>>> syntax error at 'done'HUSH died!
>>> resetting ...
>>> ```
>>>
>>> that I _assume_ comes from this line
>>>
>>>     env set set_apply_overlays 'env set apply_overlays "for overlay_file
>>>     in \\${fdt_overlays}; do echo Applying Overlay: \\${overlay_file} &&
>>>     ${load_cmd} \\${loadaddr} \\${overlays_prefix}\\${overlay_file} &&
>>>     fdt apply \\${loadaddr}; env set overlay_file; done; true"'> 
>>> [1]
>>> https://git.toradex.com/cgit/meta-toradex-bsp-common.git/tree/recipes-bsp
>>> /u-boot/u-boot-distro-boot/boot.cmd.in
>>>
>>> Francesco
>>
>> Hi all
>>
>> I observed a similar issue with STM32MP157c-DK2 board.
>> Since commit 78912cfde281 ("cmd: Set modern hush as default shell") U-Boot
>> crashes :
>>
>>
>> U-Boot 2024.01-00486-g697758e7c81-dirty (Jan 15 2024 - 18:23:52 +0100)
>>
>> CPU: STM32MP157CAC Rev.B
>> Model: STMicroelectronics STM32MP157C-DK2 Discovery Board
>> Board: stm32mp1 in trusted mode (st,stm32mp157c-dk2)
>> Board: MB1272 Var2.0 Rev.C-01
>> DRAM:  512 MiB
>> Clocks:
>> - MPU : 650 MHz
>> - MCU : 208.878 MHz
>> - AXI : 266.500 MHz
>> - PER : 24 MHz
>> - DDR : 533 MHz
>> optee optee: OP-TEE: revision 4.0 (e92de4ca)
>> I/TC: Reserved shared memory is disabled
>> I/TC: Dynamic shared memory is enabled
>> I/TC: Normal World virtualization support is disabled
>> I/TC: Asynchronous notifications are disabled
>> Core:  311 devices, 40 uclasses, devicetree: board
>> WDT:   Started watchdog at 5a002000 with servicing every 1000ms (32s timeout)
>> NAND:  0 MiB
>> MMC:   STM32 SD/MMC: 0
>> Loading Environment from MMC... OK
>> In:    No input devices available!
>> Out:   No output devices available!
>> Err:   No error devices available!
>> Net:   eth0: ethernet at 5800a000
>> Hit any key to stop autoboot:  0
>> Boot over mmc0!
>> switch to partitions #0, OK
>> mmc0 is current device
>> Scanning mmc 0:8...
>> data abort
>> pc : [<ddb3f77a>]          lr : [<ddb44c95>]
>> reloc pc : [<c012777a>]    lr : [<c012cc95>]
>> sp : dbafc848  ip : ddbfc578     fp : ddbedf18
>> r10: 00000000  r9 : dbb15e70     r8 : 00000000
>> r7 : dbb5bf98  r6 : dbb5de10     r5 : dbb5bf98  r4 : ddbeda78
>> r3 : dbb5dc08  r2 : 000033f8     r1 : 00000071  r0 : ddbede00
>> Flags: nzcv  IRQs off  FIQs off  Mode SVC_32 (T)
>> Code: 3138 1c48 f854 0030 (eb04) 05c1
>> Resetting CPU ...
>>
>>
>> It crashes in blkcache_fill() , i didn't investigate deeply into this issue
>> yet, but i can reproduce this issue by stopping autoboot by pressing a key
>> and running a environment command as shown below :
>>
>> U-Boot 2024.01-00486-g697758e7c81-dirty (Jan 15 2024 - 18:23:52 +0100)
>>
>> CPU: STM32MP157CAC Rev.B
>> Model: STMicroelectronics STM32MP157C-DK2 Discovery Board
>> Board: stm32mp1 in trusted mode (st,stm32mp157c-dk2)
>> Board: MB1272 Var2.0 Rev.C-01
>> DRAM:  512 MiB
>> Clocks:
>> - MPU : 650 MHz
>> - MCU : 208.878 MHz
>> - AXI : 266.500 MHz
>> - PER : 24 MHz
>> - DDR : 533 MHz
>> optee optee: OP-TEE: revision 4.0 (e92de4ca)
>> I/TC: Reserved shared memory is disabled
>> I/TC: Dynamic shared memory is enabled
>> I/TC: Normal World virtualization support is disabled
>> I/TC: Asynchronous notifications are disabled
>> Core:  311 devices, 40 uclasses, devicetree: board
>> WDT:   Started watchdog at 5a002000 with servicing every 1000ms (32s timeout)
>> NAND:  0 MiB
>> MMC:   STM32 SD/MMC: 0
>> Loading Environment from MMC... OK
>> In:    No input devices available!
>> Out:   No output devices available!
>> Err:   No error devices available!
>> Net:   eth0: ethernet at 5800a000
>> Hit any key to stop autoboot:  0
>> STM32MP>
>> STM32MP>
>>
>>
>> Then i run "printenv" :
>>
>> STM32MP> printenv
>> arch=arm
>> autoload=0
>> baudrate=115200
>> board=stm32mp1
>> board_id=0x1272
>> board_name=stm32mp157c-dk2
>> board_rev=0x000c
>> boot_a_script=load ${devtype} ${devnum}:${distro_bootpart} ${scriptaddr}
>> ${prefix}${script}; source ${scriptaddr} boot_auth=0
>> boot_device=mmc
>> boot_efi_binary=load ${devtype} ${devnum}:${distro_bootpart}
>> ${kernel_addr_r} efi/boot/bootarm.efi; if fdt addr -q ${fdt_addr_r}; then
>> bootefi ${kernel_addr_r} ${fdt_i boot_efi_bootmgr=if fdt addr -q
>> ${fdt_addr_r}; then bootefi bootmgr ${fdt_addr_r};else bootefi bootmgr;fi
>> boot_extlinux=sysboot ${devtype} ${devnum}:${distro_bootpart} any
>> ${scriptaddr} ${prefix}${boot_syslinux_conf} boot_instance=0
>> boot_net_usb_start=true
>> boot_part=1
>> boot_prefixes=/ /boot/
>> boot_script_dhcp=boot.scr.uimg
>> boot_scripts=boot.scr.uimg boot.scr
>> boot_syslinux_conf=extlinux/extlinux.conf
>> boot_targets=mmc1 ubifs0 mmc0 mmc2 usb0 pxe
>> bootcmd=run bootcmd_stm32mp
>> bootcmd_mmc0=devnum=0; run mmc_boot
>> bootcmd_mmc1=devnum=1; run mmc_boot
>> bootcmd_mmc2=devnum=2; run mmc_boot
>> bootcmd_pxe=run boot_net_usb_start; dhcp; if pxe get; then pxe boot; fi
>> bootcmd_stm32mp=echo "Boot over ${boot_device}${boot_instance}!";if test
>> ${boot_device} = serial || test ${boot_device} = usb;then stm32prog
>> ${boot_device} ${boot_ins; bootcmd_ubifs0=bootubipart=UBI; bootubivol=boot;
>> bootubioff=; run ubifs_boot bootcmd_usb0=devnum=0; run usb_boot
>> bootdelay=1
>> console=ttySTM0
>> cpu=armv7
>> distro_bootcmd=for target in ${boot_targets}; do run bootcmd_${target}; done
>> efi_dtb_prefixes=/ /dtb/ /dtb/current/
>> env_check=if env info -p -d -q; then env save; fi
>> ethaddr=00:80:e1:42:48:f9
>> fdt_addr_r=0xc4000000
>> fdtcontroladdr=dbafd730
>> fdtfile=stm32mp157c-dk2.dtb
>> fdtoverlay_addr_r=0xc4300000
>> kernel_addr_r=0xc2000000
>> load_efi_dtb=load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r}
>> ${prefix}${efi_fdtfile} loadaddr=0xc2000000
>> mmc_boot=if mmc dev ${devnum}; then devtype=mmc; run scan_dev_for_boot_part;
>> fi pxefile_addr_r=0xc4200000
>> ramdisk_addr_r=0xc4400000
>> scan_dev_for_boot=echo Scanning ${devtype} ${devnum}:${distro_bootpart}...;
>> for prefix in ${boot_prefixes}; do run scan_dev_for_extlinux; run
>> scan_dev_for_scripts; do; scan_dev_for_boot_part=part list ${devtype}
>> ${devnum} -bootable devplist; env exists devplist || setenv devplist 1; for
>> distro_bootpart in ${devplist}; do if fstype $t scan_dev_for_efi=setenv
>> efi_fdtfile ${fdtfile}; if test -z "${fdtfile}" -a -n "${soc}"; then setenv
>> efi_fdtfile ${soc}-${board}${boardver}.dtb; fi; for prefix in ${efe
>> scan_dev_for_extlinux=if test -e ${devtype} ${devnum}:${distro_bootpart}
>> ${prefix}${boot_syslinux_conf}; then echo Found
>> ${prefix}${boot_syslinux_conf}; run boot_extli scan_dev_for_scripts=for
>> script in ${boot_scripts}; do if test -e ${devtype}
>> ${devnum}:${distro_bootpart} ${prefix}${script}; then echo Found U-Boot
>> script ${prefix}$e scriptaddr=0xc4100000
>> serial#=003700433338511634383330
>> serverip=192.168.1.1
>> soc=stm32mp
>> soc_pkg=AC
>> soc_rev=B
>> soc_type=157C
>> splashimage=0xc2000000
>> splashpos=m,m
>> ubifs_boot=if ubi part ${bootubipart} ${bootubioff} && ubifsmount
>> ubi0:${bootubivol}; then devtype=ubi; devnum=ubi0; bootfstype=ubifs;
>> distro_bootpart=${bootubivol}; i usb_boot=usb start; if usb dev ${devnum};
>> then devtype=usb; run scan_dev_for_boot_part; fi usb_pgood_delay=2000
>> vendor=st
>>
>> Environment size: 4321/8187 bytes
>>
>>
>> and after i execute "run bootcmd_mmc0"
>>
>> STM32MP> run bootcmd_mmc0
>> switch to partitions #0, OK
>> mmc0 is current device
>> Scanning mmc 0:8...
>> data abort
>> pc : [<ddb3f7a4>]          lr : [<ddb44c95>]
>> reloc pc : [<c01277a4>]    lr : [<c012cc95>]
>> sp : dbafcad8  ip : ddbfc578     fp : ddbedf18
>> r10: 00000000  r9 : dbb15e70     r8 : 00000000
>> r7 : dbb5f700  r6 : dbb615b8     r5 : dbb5f700  r4 : ddbeda78
>> r3 : dbb613b0  r2 : 00005c50     r1 : 0000002e  r0 : 00005c51
>> Flags: Nzcv  IRQs off  FIQs off  Mode SVC_32 (T)
>> Code: 315b e7e9 2954 d802 (0b11) 316e
>> Resetting CPU ...
>>
>> resetting ...
>>
> 

Hi Francis

> Again, sorry for the troubles caused...
> With regard to crashing in blkcache_fill() I suspect this is because some input 
> data are wrong due to error in hush.

I got additionnal information, the crash occurs more precisely in blkcache_invalidate() 
when executing "free(node->cache);"

Another information, the issue doesn't occurs if the partition, on which we attempt to read,
is formatted in EXT4. In my case, the partition is formatted in FAT.


> I am not really sure to understand how you reproduced it. Do you need to run 
> printenv before to generate the bug?

No, the printenv is not necessary, it was just to give some clue just in case.

> Also, can you please check the value of scan_dev_for_boot_part? I am wondering 
> if something is wrong with variable expansion and escaping character.

I finally succeed to reproduce the issue with limited action :

U-Boot 2024.01-00486-g697758e7c81 (Jan 17 2024 - 09:14:46 +0100)

CPU: STM32MP157CAC Rev.B
Model: STMicroelectronics STM32MP157C-DK2 Discovery Board
Board: stm32mp1 in trusted mode (st,stm32mp157c-dk2)
Board: MB1272 Var2.0 Rev.C-01
DRAM:  512 MiB
Clocks:
- MPU : 650 MHz
- MCU : 208.878 MHz
- AXI : 266.500 MHz
- PER : 24 MHz
- DDR : 533 MHz
optee optee: OP-TEE: revision 4.0 (a441cdcf)
I/TC: Reserved shared memory is disabled
I/TC: Dynamic shared memory is enabled
I/TC: Normal World virtualization support is disabled
I/TC: Asynchronous notifications are disabled
Core:  311 devices, 40 uclasses, devicetree: board
WDT:   Started watchdog at 5a002000 with servicing every 1000ms (32s timeout)
NAND:  0 MiB
MMC:   STM32 SD/MMC: 0
Loading Environment from MMC... Invalid ENV offset in MMC, copy=0
In:    No input devices available!
Out:   No output devices available!
Err:   No error devices available!
Net:   eth0: ethernet at 5800a000
Hit any key to stop autoboot:  0 
STM32MP> ls mmc 0:8
     5545   boot.scr.uimg
            mmc0_extlinux/
            mmc1_extlinux/
            nand0_extlinux/
    18244   splash.bmp
   384894   splash_yellow.bmp
  6243746   st-image-resize-initrd
    44390   stm32mp135f-dk.dtb
    98349   stm32mp157c-dk2-scmi.dtb
    97393   stm32mp157c-dk2.dtb
    98101   stm32mp157c-ev1-scmi.dtb
    97137   stm32mp157c-ev1.dtb
     1248   ubootefi.var
            uefi-certificates/
  8761856   zImage
  8057344   zImage-6.7.0-rt-rt1
  8763400   zImage.signed

13 file(s), 4 dir(s)

STM32MP> env set list 1 boot.scr.uimg splash.bmp
STM32MP> env print list
list=1 boot.scr.uimg splash.bmp
STM32MP> for i in ${list}; do if test -e mmc 0:8 ${i}; then echo ${i} found;else echo ${i} not found;fi; done;
1 not found
boot.scr.uimg found
splash.bmp found
data abort
pc : [<ddb3f72a>]          lr : [<ddb39da1>]
reloc pc : [<c012772a>]    lr : [<c0121da1>]
sp : dbafd370  ip : 00000000     fp : 00000017
r10: dbb5d5fc  r9 : dbb15e70     r8 : 0000001c
r7 : ddbedaa8  r6 : dbb5d640     r5 : 6873616c  r4 : ddbeda78
r3 : dbb5d5d0  r2 : 00000080     r1 : 00000000  r0 : 70733d69
Flags: NzcV  IRQs off  FIQs off  Mode SVC_32 (T)
Code: e7e9 2101 e7e7 68f5 (60c5) 60a8 
Resetting CPU ...


Hope it helps ;-)

Patrice

> 
>> Thanks
>> Patrice
> 
> 
> Best regards.
> 
> 


More information about the U-Boot mailing list