[U-Boot] [PATCH] bootm: Reinstate special case for standalone images

Michal Simek monstr at monstr.eu
Tue Dec 10 06:37:40 CET 2013


On 12/07/2013 12:26 AM, Simon Glass wrote:
> For standalone images, bootm had a special case where the OS boot function
> was NULL but did actually exist. It was just called manually.
> 
> This was removed by commit 35fc84fa which checks for the non-existence of
> this function before the special case is examined.
> 
> There is no obvious reason why standalone is handled with a special case.
> Adjust the code so that standalone has a normal OS boot function. We still
> need a special case for when the function returns, but at least we can
> avoid the main problem.
> 
> This is intended to fix the reported:
> 
>     ERROR: booting os 'U-Boot' (17) is not supported
> 
> but needs testing.
> 
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
> 
>  common/cmd_bootm.c | 21 ++++++++++++---------
>  1 file changed, 12 insertions(+), 9 deletions(-)
> 
> diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
> index ba73f57..2120aa0 100644
> --- a/common/cmd_bootm.c
> +++ b/common/cmd_bootm.c
> @@ -77,6 +77,9 @@ static int do_imls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
>  static void fixup_silent_linux(void);
>  #endif
>  
> +static int do_bootm_standalone(int flag, int argc, char * const argv[],
> +			       bootm_headers_t *images);
> +
>  static const void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc,
>  				char * const argv[], bootm_headers_t *images,
>  				ulong *os_data, ulong *os_len);
> @@ -131,6 +134,7 @@ static boot_os_fn do_bootm_integrity;
>  #endif
>  
>  static boot_os_fn *boot_os[] = {
> +	[IH_TYPE_STANDALONE] = do_bootm_standalone,

This should be IH_OS_U_BOOT


>  #ifdef CONFIG_BOOTM_LINUX
>  	[IH_OS_LINUX] = do_bootm_linux,
>  #endif
> @@ -487,17 +491,18 @@ static int bootm_load_os(bootm_headers_t *images, unsigned long *load_end,
>  	return 0;
>  }
>  
> -static int bootm_start_standalone(int argc, char * const argv[])
> +static int do_bootm_standalone(int flag, int argc, char * const argv[],
> +			       bootm_headers_t *images)
>  {
>  	char  *s;
>  	int   (*appl)(int, char * const []);
>  
>  	/* Don't start if "autostart" is set to "no" */
>  	if (((s = getenv("autostart")) != NULL) && (strcmp(s, "no") == 0)) {
> -		setenv_hex("filesize", images.os.image_len);
> +		setenv_hex("filesize", images->os.image_len);
>  		return 0;
>  	}
> -	appl = (int (*)(int, char * const []))(ulong)ntohl(images.ep);
> +	appl = (int (*)(int, char * const []))(ulong)ntohl(images->ep);
>  	(*appl)(argc, argv);
>  	return 0;
>  }
> @@ -523,14 +528,12 @@ static cmd_tbl_t cmd_bootm_sub[] = {
>  static int boot_selected_os(int argc, char * const argv[], int state,
>  		bootm_headers_t *images, boot_os_fn *boot_fn)
>  {
> -	if (images->os.type == IH_TYPE_STANDALONE) {
> -		/* This may return when 'autostart' is 'no' */
> -		bootm_start_standalone(argc, argv);
> -		return 0;
> -	}
>  	arch_preboot_os();
>  	boot_fn(state, argc, argv, images);
> -	if (state == BOOTM_STATE_OS_FAKE_GO) /* We expect to return */
> +
> +	/* Stand-alone may return when 'autostart' is 'no' */
> +	if (images->os.type == IH_TYPE_STANDALONE ||
> +	    state == BOOTM_STATE_OS_FAKE_GO) /* We expect to return */
>  		return 0;
>  	bootstage_error(BOOTSTAGE_ID_BOOT_OS_RETURNED);
>  #ifdef DEBUG

But anyway I have tested this in zynq.
Image generation by this command

./tools/mkimage -n "hello" -A arm -O u-boot -T standalone -C none -a c100000 -d examples/standalone/hello_world.bin -v /tftpboot/hello.ub

on 2013.04 is behaviour

U-Boot> bootm
## Booting kernel from Legacy Image at 00001000 ...
   Image Name:   hello
   Image Type:   ARM U-Boot Standalone Program (uncompressed)
   Data Size:    594 Bytes = 594 Bytes
   Load Address: 0c100000
   Entry Point:  0c100000
   Verifying Checksum ... OK
   Loading Standalone Program ... OK
OK
Example expects ABI version 6
Actual U-Boot ABI version 6
Hello World
argc = 0
data abort

    MAYBE you should read doc/README.arm-unaligned-accesses

pc : [<3ffd8e74>]	   lr : [<3ffd9574>]
sp : 3fbadc20  ip : 00000043	 fp : 3ffea2c4
r10: ffffffff  r9 : 3fbaddd4	 r8 : 3fbadf40
r7 : 0c100232  r6 : ea000014	 r5 : ffffffff  r4 : 3fbadcaf
r3 : ea000014  r2 : ea000014	 r1 : ea000013  r0 : ea000014
Flags: nzCv  IRQs off  FIQs off  Mode SVC_32
Resetting CPU ...

resetting ...


on the latest&greatest with fix above

U-Boot 2013.10-00793-gc9ca75a-dirty (Dec 10 2013 - 06:30:03)

I2C:   ready
Memory: ECC disabled
DRAM:  1 GiB
MMC:   zynq_sdhci: 0
SF: Detected N25Q128A with page size 256 Bytes, erase size 4 KiB, total 16 MiB
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
Net:   Gem.e000b000
Hit any key to stop autoboot:  0
zynq-uboot> set serverip 192.168.0.100
zynq-uboot> set ipaddr 192.168.0.10
zynq-uboot> tftp 1000 hello.ub
Gem.e000b000 Waiting for PHY auto negotiation to complete.... done
Using Gem.e000b000 device
TFTP from server 192.168.0.100; our IP address is 192.168.0.10
Filename 'hello.ub'.
Load address: 0x1000
Loading: #
	 642.6 KiB/s
done
Bytes transferred = 658 (292 hex)
zynq-uboot> bootm
## Booting kernel from Legacy Image at 00001000 ...
   Image Name:   hello
   Image Type:   ARM U-Boot Standalone Program (uncompressed)
   Data Size:    594 Bytes = 594 Bytes
   Load Address: 0c100000
   Entry Point:  0c100000
   Verifying Checksum ... OK
   Loading Standalone Program ... OK
software interrupt
pc : [<0000101c>]	   lr : [<0000101c>]
sp : 3fb51d78  ip : 00000000	 fp : 00001000
r10: 3ffae998  r9 : 3ffae998	 r8 : 3fb51f40
r7 : 00000000  r6 : 00000000	 r5 : 3fb527b4  r4 : 3ffae998
r3 : 0000100c  r2 : 00000003	 r1 : 00000000  r0 : 00000000
Flags: nZCv  IRQs off  FIQs off  Mode SVC_32
Resetting CPU ...

resetting ...


It means there is at least problem on arm even with this patch.
Will be great if someone can confirm on any arm platform if
this is working or not. Just to be sure that it is not zynq specific
problem.

Thanks,
Michal

-- 
Michal Simek, Ing. (M.Eng), OpenPGP -> KeyID: FE3D1F91
w: www.monstr.eu p: +42-0-721842854
Maintainer of Linux kernel - Microblaze cpu - http://www.monstr.eu/fdt/
Maintainer of Linux kernel - Xilinx Zynq ARM architecture
Microblaze U-BOOT custodian and responsible for u-boot arm zynq platform


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 263 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20131210/597d0936/attachment.pgp>


More information about the U-Boot mailing list