[U-Boot] [PATCH] bootm: Reinstate special case for standalone images
Tom Rini
trini at ti.com
Tue Dec 10 15:40:07 CET 2013
On Tue, Dec 10, 2013 at 06:37:40AM +0100, Michal Simek wrote:
> 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.
Since patchwork is down I can't send a link to it, but Jeroen posted a
patch that fixes examples/standalone/stubs.c to use r9 instead of r8 on
lines 43 and 50. I think that's the next thing you need here.
--
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20131210/0c5cc092/attachment.pgp>
More information about the U-Boot
mailing list