Message ID | 1370974493-21822-16-git-send-email-sjg@chromium.org |
---|---|
State | Accepted |
Delegated to: | Tom Rini |
Headers | show |
Hi Simon, On 06/11/2013 08:14 PM, Simon Glass wrote: > At present the bootm code is mostly duplicated for the plain 'bootm' > command and its sub-command variant. This makes the code harder to > maintain and means that changes must be made to several places. > > Introduce do_bootm_states() which performs selected portions of the bootm > work, so that both plain 'bootm' and 'bootm <sub_command>' can use the > same code. > > Additional duplication exists in bootz, so tidy that up as well. This > is not intended to change behaviour, apart from minor fixes where the > previously-duplicated code missed some chunks of code. > > Signed-off-by: Simon Glass <sjg@chromium.org> Simon, this patch breaks bootm (at least on powerpc), while booting an compressed uImage (with DT). It just hangs while decompressing the kernel image: ## Booting kernel from Legacy Image at 01000000 ... Image Name: Linux-3.5.7 Image Type: PowerPC Linux Kernel Image (gzip compressed) Data Size: 2203312 Bytes = 2.1 MiB Load Address: 00000000 Entry Point: 00000000 ## Flattened Device Tree blob at 01800000 Booting using the fdt blob at 0x1800000 Uncompressing Kernel Image ... I bisected mainline and this patch is the one that breaks booting: [stefan@ubuntu-2012 u-boot ((983c72f...)|BISECTING)]$ git bisect good 35fc84fa1ff51e15ecd3e464dac87eb105ffed30 is the first bad commit commit 35fc84fa1ff51e15ecd3e464dac87eb105ffed30 Author: Simon Glass <sjg@chromium.org> Date: Tue Jun 11 11:14:47 2013 -0700 Refactor the bootm command to reduce code duplication I already looked what might be wrong but I couldn't find any problem upon a quick glance. You know this code may better. Perhaps you could take look at it and give it a try as well. Thanks, Stefan
On Thu, Jun 27, 2013 at 03:40:36PM +0200, Stefan Roese wrote: > Hi Simon, > > On 06/11/2013 08:14 PM, Simon Glass wrote: > > At present the bootm code is mostly duplicated for the plain 'bootm' > > command and its sub-command variant. This makes the code harder to > > maintain and means that changes must be made to several places. > > > > Introduce do_bootm_states() which performs selected portions of the bootm > > work, so that both plain 'bootm' and 'bootm <sub_command>' can use the > > same code. > > > > Additional duplication exists in bootz, so tidy that up as well. This > > is not intended to change behaviour, apart from minor fixes where the > > previously-duplicated code missed some chunks of code. > > > > Signed-off-by: Simon Glass <sjg@chromium.org> > > Simon, this patch breaks bootm (at least on powerpc), while booting an > compressed uImage (with DT). It just hangs while decompressing the > kernel image: I swear I had boot tested a kernel on beaglebone with the series, but I see the similar behavior right now, on ARM. I also see it with FIT images (which I think I'm building correctly, but they go far off into the weeds and are ignoring entry/load values). It's not a hang, it's return to prompt. If you follow with a bootm go, it hangs. With or without CONFIG_SYS_GENERIC_BOARD set.
Hi Stefann, On Thu, Jun 27, 2013 at 6:40 AM, Stefan Roese <sr@denx.de> wrote: > Hi Simon, > > On 06/11/2013 08:14 PM, Simon Glass wrote: > > At present the bootm code is mostly duplicated for the plain 'bootm' > > command and its sub-command variant. This makes the code harder to > > maintain and means that changes must be made to several places. > > > > Introduce do_bootm_states() which performs selected portions of the bootm > > work, so that both plain 'bootm' and 'bootm <sub_command>' can use the > > same code. > > > > Additional duplication exists in bootz, so tidy that up as well. This > > is not intended to change behaviour, apart from minor fixes where the > > previously-duplicated code missed some chunks of code. > > > > Signed-off-by: Simon Glass <sjg@chromium.org> > > Simon, this patch breaks bootm (at least on powerpc), while booting an > compressed uImage (with DT). It just hangs while decompressing the > kernel image: > > ## Booting kernel from Legacy Image at 01000000 ... > Image Name: Linux-3.5.7 > Image Type: PowerPC Linux Kernel Image (gzip compressed) > Data Size: 2203312 Bytes = 2.1 MiB > Load Address: 00000000 > Entry Point: 00000000 > ## Flattened Device Tree blob at 01800000 > Booting using the fdt blob at 0x1800000 > Uncompressing Kernel Image ... > > I bisected mainline and this patch is the one that breaks booting: > > [stefan@ubuntu-2012 u-boot ((983c72f...)|BISECTING)]$ git bisect good > 35fc84fa1ff51e15ecd3e464dac87eb105ffed30 is the first bad commit > commit 35fc84fa1ff51e15ecd3e464dac87eb105ffed30 > Author: Simon Glass <sjg@chromium.org> > Date: Tue Jun 11 11:14:47 2013 -0700 > > Refactor the bootm command to reduce code duplication > > > I already looked what might be wrong but I couldn't find any problem > upon a quick glance. You know this code may better. Perhaps you could > take look at it and give it a try as well. > Yes I will take a look today. I created a test suite for it but it did not include decompression - I will see if I can diagnose it and then add another test. If you have the .its file (device tree input to mkimage) please send it to me. Regards, Simon > > Thanks, > Stefan > >
Hi Stefan, On Thu, Jun 27, 2013 at 6:40 AM, Stefan Roese <sr@denx.de> wrote: > Hi Simon, > > On 06/11/2013 08:14 PM, Simon Glass wrote: > > At present the bootm code is mostly duplicated for the plain 'bootm' > > command and its sub-command variant. This makes the code harder to > > maintain and means that changes must be made to several places. > > > > Introduce do_bootm_states() which performs selected portions of the bootm > > work, so that both plain 'bootm' and 'bootm <sub_command>' can use the > > same code. > > > > Additional duplication exists in bootz, so tidy that up as well. This > > is not intended to change behaviour, apart from minor fixes where the > > previously-duplicated code missed some chunks of code. > > > > Signed-off-by: Simon Glass <sjg@chromium.org> > > Simon, this patch breaks bootm (at least on powerpc), while booting an > compressed uImage (with DT). It just hangs while decompressing the > kernel image: > > ## Booting kernel from Legacy Image at 01000000 ... > Image Name: Linux-3.5.7 > Image Type: PowerPC Linux Kernel Image (gzip compressed) > Data Size: 2203312 Bytes = 2.1 MiB > Load Address: 00000000 > Entry Point: 00000000 > ## Flattened Device Tree blob at 01800000 > Booting using the fdt blob at 0x1800000 > Uncompressing Kernel Image ... > > I bisected mainline and this patch is the one that breaks booting: > > [stefan@ubuntu-2012 u-boot ((983c72f...)|BISECTING)]$ git bisect good > 35fc84fa1ff51e15ecd3e464dac87eb105ffed30 is the first bad commit > commit 35fc84fa1ff51e15ecd3e464dac87eb105ffed30 > Author: Simon Glass <sjg@chromium.org> > Date: Tue Jun 11 11:14:47 2013 -0700 > > Refactor the bootm command to reduce code duplication > > > I already looked what might be wrong but I couldn't find any problem > upon a quick glance. You know this code may better. Perhaps you could > take look at it and give it a try as well. > I thought I had a repro, but it turned out to be that I was using kernel_noload so it was decompressing onto itself: Uncompressing Kernel Image (no loading done) ... LZO: uncompress or overwrite error -6 - must RESET board to recover When I give a load address, it seems to work: Bytes transferred = 3953092 (3c51c4 hex) ## Loading kernel from FIT Image at 40008000 ... Using 'conf@8' configuration Trying 'kernel@1' kernel subimage Description: unavailable Type: Kernel Image Compression: gzip compressed Data Start: 0x400080c8 Data Size: 3633253 Bytes = 3.5 MiB Architecture: ARM OS: Linux Load Address: 0x20008000 Entry Point: 0x20008000 Verifying Hash Integrity ... OK ## Loading fdt from FIT Image at 40008000 ... Using 'conf@8' configuration Trying 'fdt@8' fdt subimage Description: exynos5420-peach-pit-rev3.dtb Type: Flat Device Tree Compression: uncompressed Data Start: 0x403b19e0 Data Size: 43298 Bytes = 42.3 KiB Architecture: ARM Hash algo: sha1 Hash value: 097dda51183eed6948ab942c57b14581c77ea22f Verifying Hash Integrity ... sha1+ OK Booting using the fdt blob at 0x403b19e0 Uncompressing Kernel Image ... OK Loading Device Tree to 3ffed000, end 3ffff921 ... OK So I think it might be something to do with the load address. I'm going to fall back to code inspection... Regards, Simon
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 06/27/2013 03:51 PM, Simon Glass wrote: > Hi Stefan, > > On Thu, Jun 27, 2013 at 6:40 AM, Stefan Roese <sr@denx.de > <mailto:sr@denx.de>> wrote: > > Hi Simon, > > On 06/11/2013 08:14 PM, Simon Glass wrote: >> At present the bootm code is mostly duplicated for the plain >> 'bootm' command and its sub-command variant. This makes the code >> harder to maintain and means that changes must be made to several >> places. >> >> Introduce do_bootm_states() which performs selected portions of > the bootm >> work, so that both plain 'bootm' and 'bootm <sub_command>' can >> use the same code. >> >> Additional duplication exists in bootz, so tidy that up as well. >> This is not intended to change behaviour, apart from minor fixes >> where the previously-duplicated code missed some chunks of code. >> >> Signed-off-by: Simon Glass <sjg@chromium.org > <mailto:sjg@chromium.org>> > > Simon, this patch breaks bootm (at least on powerpc), while booting > an compressed uImage (with DT). It just hangs while decompressing > the kernel image: > > ## Booting kernel from Legacy Image at 01000000 ... Image Name: > Linux-3.5.7 Image Type: PowerPC Linux Kernel Image (gzip > compressed) Data Size: 2203312 Bytes = 2.1 MiB Load Address: > 00000000 Entry Point: 00000000 ## Flattened Device Tree blob at > 01800000 Booting using the fdt blob at 0x1800000 Uncompressing > Kernel Image ... > > I bisected mainline and this patch is the one that breaks booting: > > [stefan@ubuntu-2012 u-boot ((983c72f...)|BISECTING)]$ git bisect > good 35fc84fa1ff51e15ecd3e464dac87eb105ffed30 is the first bad > commit commit 35fc84fa1ff51e15ecd3e464dac87eb105ffed30 Author: > Simon Glass <sjg@chromium.org <mailto:sjg@chromium.org>> Date: > Tue Jun 11 11:14:47 2013 -0700 > > Refactor the bootm command to reduce code duplication > > > I already looked what might be wrong but I couldn't find any > problem upon a quick glance. You know this code may better. Perhaps > you could take look at it and give it a try as well. > > > > I thought I had a repro, but it turned out to be that I was using > kernel_noload so it was decompressing onto itself: > > Uncompressing Kernel Image (no loading done) ... LZO: uncompress > or overwrite error -6 - must RESET board to recover > > When I give a load address, it seems to work: > > Bytes transferred = 3953092 (3c51c4 hex) ## Loading kernel from FIT > Image at 40008000 ... Using 'conf@8' configuration Trying > 'kernel@1' kernel subimage Description: unavailable Type: > Kernel Image Compression: gzip compressed Data Start: > 0x400080c8 Data Size: 3633253 Bytes = 3.5 MiB Architecture: ARM > OS: Linux Load Address: 0x20008000 Entry Point: > 0x20008000 Verifying Hash Integrity ... OK ## Loading fdt from FIT > Image at 40008000 ... Using 'conf@8' configuration Trying 'fdt@8' > fdt subimage Description: exynos5420-peach-pit-rev3.dtb Type: > Flat Device Tree Compression: uncompressed Data Start: > 0x403b19e0 Data Size: 43298 Bytes = 42.3 KiB Architecture: ARM > Hash algo: sha1 Hash value: > 097dda51183eed6948ab942c57b14581c77ea22f Verifying Hash Integrity > ... sha1+ OK Booting using the fdt blob at 0x403b19e0 Uncompressing > Kernel Image ... OK Loading Device Tree to 3ffed000, end 3ffff921 > ... OK > > > So I think it might be something to do with the load address. I'm > going to fall back to code inspection... Or FIT images? I couldn't come up with a working FIT image here (since my DDR starts at offset 0x80000000 not 0x0 and it was dumping to much lower than my base, despite the entry/load in the .its file), but a simple uImage fails to work. - -- Tom -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBAgAGBQJRzJudAAoJENk4IS6UOR1WZkkQALHEtAd978EYUggvCMv7mZM3 iMLXbug7qhbTQe0PsEvkuQggwrZDGUpArqe3TRrNy6GPP9wvVHDI5D0WFQ0zPb3B 42W/Sejes5DvbCcjpSyoo113PCieoVH+csXODXWOb4Dp4+xIGDckmaQVs1yoK1j4 1/ofXihmSzdw8lHRZrTYTCSk6MxCYZYqjRv5hHGn6KZIptnSb/Koh7JXTuq+zPbV rJxpS8q7wKC43LPxLJr4VlGmUex/SoAhVbUvdt05ZU/xIiI9qXcLlI0mgPQOpGEP Zamqk6rZ6Kq2PxLuL/J81aiE1/cHwpMvDf7T++quSRP/4rX03wfvRhj9zJQbhlwB 8vcVx6kyBYWgBqX9bQUig81ij/oVE7huaGm0lhguO4TqmT490X8JMLeefT6N7bhr 3e8QJwOB0ZrnVBhi4Q7JyKZR1xNvNU0sgFBPGsdpHNcJDbscEs2puJtSuCYxTTbw QN7aHWOumdA1fT+OE+jj0HTO2tHh7sCGDOPpTQlnYAtSxz3yvgpJRHxJsAlbTa+l wpxmqa2s+cKqtQfra+SMMkXU6XiGnK8cqqH7ydpHJ8+5qZNBzn4QNU2xz9E7DJA9 lH7X980h+XQP69ClWkIHpshDVlLPoi8oiwBf828LAB13zJd/MgtL1L2K4bYSS2tK /jopfv09h/7xbUKhOi5j =2yZU -----END PGP SIGNATURE-----
Hi Stefan, I can create something with or without compression and I cannot see the failure. Tom is seeing it though. I will see if I can get another board to try. If you have any ideas please let me know. scanning bus 0 for devices... 2 USB Device(s) found scanning usb for storage devices... 0 Storage Device(s) found scanning usb for ethernet devices... 1 Ethernet Device(s) found Waiting for Ethernet connection... done. BOOTP broadcast 1 *** Unhandled DHCP Option in OFFER/ACK: 2 *** Unhandled DHCP Option in OFFER/ACK: 176 *** Unhandled DHCP Option in OFFER/ACK: 35 *** Unhandled DHCP Option in OFFER/ACK: 208 *** Unhandled DHCP Option in OFFER/ACK: 242 *** Unhandled DHCP Option in OFFER/ACK: 101 *** Unhandled DHCP Option in OFFER/ACK: 119 *** Unhandled DHCP Option in OFFER/ACK: 42 *** Unhandled DHCP Option in OFFER/ACK: 2 *** Unhandled DHCP Option in OFFER/ACK: 176 *** Unhandled DHCP Option in OFFER/ACK: 35 *** Unhandled DHCP Option in OFFER/ACK: 208 *** Unhandled DHCP Option in OFFER/ACK: 242 *** Unhandled DHCP Option in OFFER/ACK: 101 *** Unhandled DHCP Option in OFFER/ACK: 119 *** Unhandled DHCP Option in OFFER/ACK: 42 DHCP client bound to address 172.22.83.47 Using asx0 device TFTP from server 172.22.83.1; our IP address is 172.22.83.47 Filename '/var/lib/tftpboot/image.plain'. Load address: 0x40008000 Loading: ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ###################################### 4.4 MiB/s done Bytes transferred = 8183088 (7cdd30 hex) Using asx0 device TFTP from server 172.22.83.1; our IP address is 172.22.83.47 Filename '/var/lib/tftpboot/exynos5420-peach-pit-rev3.dtb'. Load address: 0x41000000 Loading: ### 640.6 KiB/s done Bytes transferred = 43298 (a922 hex) * kernel: cmdline image address = 0x40008000 ## Booting kernel from Legacy Image at 40008000 ... Image Name: plain Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 8183024 Bytes = 7.8 MiB Load Address: 20008000 Entry Point: 20008000 Verifying Checksum ... OK kernel data at 0x40008040, len = 0x007cdcf0 (8183024) ## Flattened Device Tree blob at 41000000 Booting using the fdt blob at 0x41000000 Loading Kernel Image ... load_buff=20008000, image_buf=40008040, image_len=7cdcf0 OK OK kernel loaded at 0x20008000, end = 0x207d5cf0 load_end = 207d5cf0 Loading Device Tree to 3ffed000, end 3ffff921 ... OK boot_kernel.c: ft_board_setup: warning: g_crossystem_data is NULL Starting kernel ... Regards, SImon On Thu, Jun 27, 2013 at 12:51 PM, Simon Glass <sjg@chromium.org> wrote: > Hi Stefan, > > On Thu, Jun 27, 2013 at 6:40 AM, Stefan Roese <sr@denx.de> wrote: > >> Hi Simon, >> >> On 06/11/2013 08:14 PM, Simon Glass wrote: >> > At present the bootm code is mostly duplicated for the plain 'bootm' >> > command and its sub-command variant. This makes the code harder to >> > maintain and means that changes must be made to several places. >> > >> > Introduce do_bootm_states() which performs selected portions of the >> bootm >> > work, so that both plain 'bootm' and 'bootm <sub_command>' can use the >> > same code. >> > >> > Additional duplication exists in bootz, so tidy that up as well. This >> > is not intended to change behaviour, apart from minor fixes where the >> > previously-duplicated code missed some chunks of code. >> > >> > Signed-off-by: Simon Glass <sjg@chromium.org> >> >> Simon, this patch breaks bootm (at least on powerpc), while booting an >> compressed uImage (with DT). It just hangs while decompressing the >> kernel image: >> >> ## Booting kernel from Legacy Image at 01000000 ... >> Image Name: Linux-3.5.7 >> Image Type: PowerPC Linux Kernel Image (gzip compressed) >> Data Size: 2203312 Bytes = 2.1 MiB >> Load Address: 00000000 >> Entry Point: 00000000 >> ## Flattened Device Tree blob at 01800000 >> Booting using the fdt blob at 0x1800000 >> Uncompressing Kernel Image ... >> >> I bisected mainline and this patch is the one that breaks booting: >> >> [stefan@ubuntu-2012 u-boot ((983c72f...)|BISECTING)]$ git bisect good >> 35fc84fa1ff51e15ecd3e464dac87eb105ffed30 is the first bad commit >> commit 35fc84fa1ff51e15ecd3e464dac87eb105ffed30 >> Author: Simon Glass <sjg@chromium.org> >> Date: Tue Jun 11 11:14:47 2013 -0700 >> >> Refactor the bootm command to reduce code duplication >> >> >> I already looked what might be wrong but I couldn't find any problem >> upon a quick glance. You know this code may better. Perhaps you could >> take look at it and give it a try as well. >> > > > I thought I had a repro, but it turned out to be that I was using > kernel_noload so it was decompressing onto itself: > > Uncompressing Kernel Image (no loading done) ... LZO: uncompress or > overwrite error -6 - must RESET board to recover > > When I give a load address, it seems to work: > > Bytes transferred = 3953092 (3c51c4 hex) > ## Loading kernel from FIT Image at 40008000 ... > Using 'conf@8' configuration > Trying 'kernel@1' kernel subimage > Description: unavailable > Type: Kernel Image > Compression: gzip compressed > Data Start: 0x400080c8 > Data Size: 3633253 Bytes = 3.5 MiB > Architecture: ARM > OS: Linux > Load Address: 0x20008000 > Entry Point: 0x20008000 > Verifying Hash Integrity ... OK > ## Loading fdt from FIT Image at 40008000 ... > Using 'conf@8' configuration > Trying 'fdt@8' fdt subimage > Description: exynos5420-peach-pit-rev3.dtb > Type: Flat Device Tree > Compression: uncompressed > Data Start: 0x403b19e0 > Data Size: 43298 Bytes = 42.3 KiB > Architecture: ARM > Hash algo: sha1 > Hash value: 097dda51183eed6948ab942c57b14581c77ea22f > Verifying Hash Integrity ... sha1+ OK > Booting using the fdt blob at 0x403b19e0 > Uncompressing Kernel Image ... OK > Loading Device Tree to 3ffed000, end 3ffff921 ... OK > > > So I think it might be something to do with the load address. I'm going to > fall back to code inspection... > > Regards, > Simon > >
Hi Simon, On 06/28/2013 04:14 AM, Simon Glass wrote: > I can create something with or without compression and I cannot see the > failure. Tom is seeing it though. I will see if I can get another board > to try. If you have any ideas please let me know. Sorry, but I don't have any ideas. I also checked the parameters of the gunzip call. And they were identical in the working (before this patch) and non-working version (with this patch). gunzip() just didn't return. One idea: It might have something to do with the interrupt disabling, as powerpc compresses to 0. And thats the location of the interrupt vectors (timer?). Just an idea. Do you remember shuffling the disable_interrupts() call around? I'll check myself in a few hours. Thanks, Stefan
Hi Stefan, On Thu, Jun 27, 2013 at 9:12 PM, Stefan Roese <sr@denx.de> wrote: > Hi Simon, > > On 06/28/2013 04:14 AM, Simon Glass wrote: > > I can create something with or without compression and I cannot see the > > failure. Tom is seeing it though. I will see if I can get another board > > to try. If you have any ideas please let me know. > > Sorry, but I don't have any ideas. I also checked the parameters of the > gunzip call. And they were identical in the working (before this patch) > and non-working version (with this patch). gunzip() just didn't return. > > One idea: It might have something to do with the interrupt disabling, as > powerpc compresses to 0. And thats the location of the interrupt vectors > (timer?). Just an idea. Do you remember shuffling the > disable_interrupts() call around? > > I'll check myself in a few hours. > Thanks. Apparently it happens on an ARM board also. I am writing some more sandbox tests to increase the test coverage and hopefully spot something. Please let me know if you have any ideas on this. It seems like (at least in the ARM case) it must be returning BOOTM_ERR_OVERLAP from bootm_load_os(). In your case it may be dying before then by overwriting memory. So the addresses used in that function may be the key to it. However you say they are the same, so I am not sure. I am also doing a careful diff against the Chromium tree, which seems to work, to try to see if there is a difference somewhere. Regards, Simon
Hi Stefan, On Thu, Jun 27, 2013 at 9:12 PM, Stefan Roese <sr@denx.de> wrote: > Hi Simon, > > On 06/28/2013 04:14 AM, Simon Glass wrote: > > I can create something with or without compression and I cannot see the > > failure. Tom is seeing it though. I will see if I can get another board > > to try. If you have any ideas please let me know. > > Sorry, but I don't have any ideas. I also checked the parameters of the > gunzip call. And they were identical in the working (before this patch) > and non-working version (with this patch). gunzip() just didn't return. > > One idea: It might have something to do with the interrupt disabling, as > powerpc compresses to 0. And thats the location of the interrupt vectors > (timer?). Just an idea. Do you remember shuffling the > disable_interrupts() call around? > Hmmm yes I did shuffle them around, figuring that the interrupts needed to be disabled before booting the OS but not before loading it. It seems like I made a bad assumption here. I have been through the code multiple times and I cannot see a difference in operation. Also it does work correctly on the ARM platforms I have tried. It is broken on Tom's ARM platform, but perhaps that could be an interrupt issue also. I am going to post a patch to restore the interrupt code to where it was, hoping that this shows some difference for your error. I will also post a couple of revert patches for those who are blocked on this. We will have to apply reverts fairly soon if the solution doesn't present itself. > I'll check myself in a few hours. > OK please let me know if you find anything else. Thanks for your help. Refactoring code is a tricky business...I much prefer the new bootm code, if it can work on all platforms. Regards, Simon
On 06/28/2013 08:58 AM, Simon Glass wrote: > One idea: It might have something to do with the interrupt disabling, as > powerpc compresses to 0. And thats the location of the interrupt vectors > (timer?). Just an idea. Do you remember shuffling the > disable_interrupts() call around? > > > Hmmm yes I did shuffle them around, figuring that the interrupts needed > to be disabled before booting the OS but not before loading it. It seems > like I made a bad assumption here. Yes, I already found that one as well. But moving this disable before kernel loading unfortunately doesn't fix this issue completely. gunzip now finished with "... OK". But Linux Kernel booting still does not work. > I have been through the code multiple times and I cannot see a > difference in operation. Also it does work correctly on the ARM > platforms I have tried. It is broken on Tom's ARM platform, but perhaps > that could be an interrupt issue also. > > I am going to post a patch to restore the interrupt code to where it > was, hoping that this shows some difference for your error. I will also > post a couple of revert patches for those who are blocked on this. We > will have to apply reverts fairly soon if the solution doesn't present > itself. > > > I'll check myself in a few hours. > > > OK please let me know if you find anything else. Thanks for your help. > Refactoring code is a tricky business...I much prefer the new bootm > code, if it can work on all platforms. I'm still at it. Will keep you informed. Stay tuned... Thanks, Stefan
Hi Stefan, On Fri, Jun 28, 2013 at 12:04 AM, Stefan Roese <sr@denx.de> wrote: > On 06/28/2013 08:58 AM, Simon Glass wrote: > > One idea: It might have something to do with the interrupt > disabling, as > > powerpc compresses to 0. And thats the location of the interrupt > vectors > > (timer?). Just an idea. Do you remember shuffling the > > disable_interrupts() call around? > > > > > > Hmmm yes I did shuffle them around, figuring that the interrupts needed > > to be disabled before booting the OS but not before loading it. It seems > > like I made a bad assumption here. > > Yes, I already found that one as well. But moving this disable before > kernel loading unfortunately doesn't fix this issue completely. gunzip > now finished with "... OK". But Linux Kernel booting still does not work. > Well actually that is progress, since now it is similar to Tom's ARM platform. I will post the patch soon once buildman finishes. > > > I have been through the code multiple times and I cannot see a > > difference in operation. Also it does work correctly on the ARM > > platforms I have tried. It is broken on Tom's ARM platform, but perhaps > > that could be an interrupt issue also. > > > > I am going to post a patch to restore the interrupt code to where it > > was, hoping that this shows some difference for your error. I will also > > post a couple of revert patches for those who are blocked on this. We > > will have to apply reverts fairly soon if the solution doesn't present > > itself. > > > > > > I'll check myself in a few hours. > > > > > > OK please let me know if you find anything else. Thanks for your help. > > Refactoring code is a tricky business...I much prefer the new bootm > > code, if it can work on all platforms. > > I'm still at it. Will keep you informed. Stay tuned... > Thanks very much! Regards, Simon
Hi Stefan, On Fri, Jun 28, 2013 at 12:12 AM, Simon Glass <sjg@chromium.org> wrote: > Hi Stefan, > > On Fri, Jun 28, 2013 at 12:04 AM, Stefan Roese <sr@denx.de> wrote: > >> On 06/28/2013 08:58 AM, Simon Glass wrote: >> > One idea: It might have something to do with the interrupt >> disabling, as >> > powerpc compresses to 0. And thats the location of the interrupt >> vectors >> > (timer?). Just an idea. Do you remember shuffling the >> > disable_interrupts() call around? >> > >> > >> > Hmmm yes I did shuffle them around, figuring that the interrupts needed >> > to be disabled before booting the OS but not before loading it. It seems >> > like I made a bad assumption here. >> >> Yes, I already found that one as well. But moving this disable before >> kernel loading unfortunately doesn't fix this issue completely. gunzip >> now finished with "... OK". But Linux Kernel booting still does not work. >> > > Well actually that is progress, since now it is similar to Tom's ARM > platform. I will post the patch soon once buildman finishes. > >> >> > I have been through the code multiple times and I cannot see a >> > difference in operation. Also it does work correctly on the ARM >> > platforms I have tried. It is broken on Tom's ARM platform, but perhaps >> > that could be an interrupt issue also. >> > >> > I am going to post a patch to restore the interrupt code to where it >> > was, hoping that this shows some difference for your error. I will also >> > post a couple of revert patches for those who are blocked on this. We >> > will have to apply reverts fairly soon if the solution doesn't present >> > itself. >> > >> > >> > I'll check myself in a few hours. >> > >> > >> > OK please let me know if you find anything else. Thanks for your help. >> > Refactoring code is a tricky business...I much prefer the new bootm >> > code, if it can work on all platforms. >> >> I'm still at it. Will keep you informed. Stay tuned... >> > > Thanks very much! > I have sent the interrupt patch and two reverts, all run through buildman. Please take a look at those also if you have a chance. I will check what you find in the morning - I am halfway through writing some sandbox tests for legacy images. Test coverage of bootm seems desirable to me given the large number of features it supports. There is still a bug there but so far it eludes me. Hopefully tomorrow I can repeat it, and then it will be much easier to figure out. Regards, Simon
diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index 0e8a221..821c702 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -105,7 +105,7 @@ static const void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc, * - loaded (first part of) image to header load address, * - disabled interrupts. * - * @flag: Command flags (CMD_FLAG_...) + * @flag: Flags indicating what to do (BOOTM_STATE_...) * @argc: Number of arguments. Note that the arguments are shifted down * so that 0 is the first argument not processed by U-Boot, and * argc is adjusted accordingly. This avoids confusion as to how @@ -208,15 +208,21 @@ static inline void boot_start_lmb(bootm_headers_t *images) { } static int bootm_start(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { - const void *os_hdr; - int ret; - memset((void *)&images, 0, sizeof(images)); images.verify = getenv_yesno("verify"); boot_start_lmb(&images); bootstage_mark_name(BOOTSTAGE_ID_BOOTM_START, "bootm_start"); + images.state = BOOTM_STATE_START; + + return 0; +} + +static int bootm_find_os(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[]) +{ + const void *os_hdr; /* get kernel image header, start address and length */ os_hdr = boot_get_kernel(cmdtp, flag, argc, argv, @@ -279,6 +285,8 @@ static int bootm_start(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[] images.ep = image_get_ep(&images.legacy_hdr_os_copy); #if defined(CONFIG_FIT) } else if (images.fit_uname_os) { + int ret; + ret = fit_image_get_entry(images.fit_hdr_os, images.fit_noffset_os, &images.ep); if (ret) { @@ -296,6 +304,16 @@ static int bootm_start(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[] images.ep += images.os.load; } + images.os.start = (ulong)os_hdr; + + return 0; +} + +static int bootm_find_other(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[]) +{ + int ret; + if (((images.os.type == IH_TYPE_KERNEL) || (images.os.type == IH_TYPE_KERNEL_NOLOAD) || (images.os.type == IH_TYPE_MULTI)) && @@ -321,9 +339,6 @@ static int bootm_start(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[] #endif } - images.os.start = (ulong)os_hdr; - images.state = BOOTM_STATE_START; - return 0; } @@ -455,7 +470,7 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress) return 0; } -static int bootm_start_standalone(ulong iflag, int argc, char * const argv[]) +static int bootm_start_standalone(int argc, char * const argv[]) { char *s; int (*appl)(int, char * const []); @@ -487,103 +502,208 @@ static cmd_tbl_t cmd_bootm_sub[] = { U_BOOT_CMD_MKENT(go, 0, 1, (void *)BOOTM_STATE_OS_GO, "", ""), }; +static int boot_selected_os(int argc, char * const argv[], int state, + bootm_headers_t *images, boot_os_fn *boot_fn, ulong *iflag) +{ + if (images->os.type == IH_TYPE_STANDALONE) { + /* This may return when 'autostart' is 'no' */ + bootm_start_standalone(argc, argv); + return 0; + } + /* + * We have reached the point of no return: we are going to + * overwrite all exception vector code, so we cannot easily + * recover from any failures any more... + */ + *iflag = disable_interrupts(); +#ifdef CONFIG_NETCONSOLE + /* Stop the ethernet stack if NetConsole could have left it up */ + eth_halt(); +#endif + +#if defined(CONFIG_CMD_USB) + /* + * turn off USB to prevent the host controller from writing to the + * SDRAM while Linux is booting. This could happen (at least for OHCI + * controller), because the HCCA (Host Controller Communication Area) + * lies within the SDRAM and the host controller writes continously to + * this area (as busmaster!). The HccaFrameNumber is for example + * updated every 1 ms within the HCCA structure in SDRAM! For more + * details see the OpenHCI specification. + */ + usb_stop(); +#endif +#ifdef CONFIG_SILENT_CONSOLE + if (images->os.os == IH_OS_LINUX) + fixup_silent_linux(); +#endif + arch_preboot_os(); + boot_fn(state, argc, argv, images); + bootstage_error(BOOTSTAGE_ID_BOOT_OS_RETURNED); +#ifdef DEBUG + puts("\n## Control returned to monitor - resetting...\n"); +#endif + return BOOTM_ERR_RESET; +} + +/** + * Execute selected states of the bootm command. + * + * Note the arguments to this state must be the first argument, Any 'bootm' + * or sub-command arguments must have already been taken. + * + * Note that if states contains more than one flag it MUST contain + * BOOTM_STATE_START, since this handles and consumes the command line args. + * + * @param cmdtp Pointer to bootm command table entry + * @param flag Command flags (CMD_FLAG_...) + * @param argc Number of subcommand arguments (0 = no arguments) + * @param argv Arguments + * @param states Mask containing states to run (BOOTM_STATE_...) + * @param images Image header information + * @param boot_progress 1 to show boot progress, 0 to not do this + * @return 0 if ok, something else on error. Some errors will cause this + * function to perform a reboot! If states contains BOOTM_STATE_OS_GO + * then the intent is to boot an OS, so this function will not return + * unless the image type is standalone. + */ +static int do_bootm_states(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[], int states, bootm_headers_t *images, + int boot_progress) +{ + boot_os_fn *boot_fn; + ulong iflag = 0; + int ret = 0; + + images->state |= states; + + /* + * Work through the states and see how far we get. We stop on + * any error. + */ + if (states & BOOTM_STATE_START) + ret = bootm_start(cmdtp, flag, argc, argv); + + if (!ret && (states & BOOTM_STATE_FINDOS)) + ret = bootm_find_os(cmdtp, flag, argc, argv); + + if (!ret && (states & BOOTM_STATE_FINDOTHER)) { + ret = bootm_find_other(cmdtp, flag, argc, argv); + argc = 0; /* consume the args */ + } + + /* Load the OS */ + if (!ret && (states & BOOTM_STATE_LOADOS)) { + ulong load_end; + + ret = bootm_load_os(images->os, &load_end, 0); + if (!ret) { + lmb_reserve(&images->lmb, images->os.load, + (load_end - images->os.load)); + } + } + + /* Relocate the ramdisk */ +#ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH + if (!ret && (states & BOOTM_STATE_RAMDISK)) { + ulong rd_len = images->rd_end - images->rd_start; + + ret = boot_ramdisk_high(&images->lmb, images->rd_start, + rd_len, &images->initrd_start, &images->initrd_end); + if (!ret) { + setenv_hex("initrd_start", images->initrd_start); + setenv_hex("initrd_end", images->initrd_end); + } + } +#endif +#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_LMB) + if (!ret && (states & BOOTM_STATE_FDT)) { + boot_fdt_add_mem_rsv_regions(&images->lmb, images->ft_addr); + ret = boot_relocate_fdt(&images->lmb, &images->ft_addr, + &images->ft_len); + } +#endif + + /* From now on, we need the OS boot function */ + if (ret) + return ret; + boot_fn = boot_os[images->os.os]; + if (boot_fn == NULL) { + if (iflag) + enable_interrupts(); + printf("ERROR: booting os '%s' (%d) is not supported\n", + genimg_get_os_name(images->os.os), images->os.os); + bootstage_error(BOOTSTAGE_ID_CHECK_BOOT_OS); + return 1; + } + + /* Call various other states that are not generally used */ + if (!ret && (states & BOOTM_STATE_OS_CMDLINE)) + ret = boot_fn(BOOTM_STATE_OS_CMDLINE, argc, argv, images); + if (!ret && (states & BOOTM_STATE_OS_BD_T)) + ret = boot_fn(BOOTM_STATE_OS_BD_T, argc, argv, images); + if (!ret && (states & BOOTM_STATE_OS_PREP)) + ret = boot_fn(BOOTM_STATE_OS_PREP, argc, argv, images); + + /* Now run the OS! We hope this doesn't return */ + if (!ret && (states & BOOTM_STATE_OS_GO)) + ret = boot_selected_os(argc, argv, BOOTM_STATE_OS_GO, + images, boot_fn, &iflag); + + /* Deal with any fallout */ + if (ret < 0) { + if (ret == BOOTM_ERR_UNIMPLEMENTED) { + if (iflag) + enable_interrupts(); + bootstage_error(BOOTSTAGE_ID_DECOMP_UNIMPL); + return 1; + } else if (ret == BOOTM_ERR_OVERLAP) { + if (images->legacy_hdr_valid) { + if (image_get_type(&images->legacy_hdr_os_copy) + == IH_TYPE_MULTI) + puts("WARNING: legacy format multi component image overwritten\n"); + } else { + puts("ERROR: new format image overwritten - must RESET the board to recover\n"); + bootstage_error(BOOTSTAGE_ID_OVERWRITTEN); + ret = BOOTM_ERR_RESET; + } + } + if (ret == BOOTM_ERR_RESET) + do_reset(cmdtp, flag, argc, argv); + } + if (iflag) + enable_interrupts(); + if (ret) + puts("subcommand not supported\n"); + + return ret; +} + static int do_bootm_subcommand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { int ret = 0; long state; cmd_tbl_t *c; - boot_os_fn *boot_fn; c = find_cmd_tbl(argv[0], &cmd_bootm_sub[0], ARRAY_SIZE(cmd_bootm_sub)); argc--; argv++; if (c) { state = (long)c->cmd; - - /* treat start special since it resets the state machine */ if (state == BOOTM_STATE_START) - return bootm_start(cmdtp, flag, argc, argv); + state |= BOOTM_STATE_FINDOS | BOOTM_STATE_FINDOTHER; } else { /* Unrecognized command */ return CMD_RET_USAGE; } - if (images.state < BOOTM_STATE_START || - images.state >= state) { + if (state != BOOTM_STATE_START && images.state >= state) { printf("Trying to execute a command out of order\n"); return CMD_RET_USAGE; } - images.state |= state; - boot_fn = boot_os[images.os.os]; - - switch (state) { - ulong load_end; - case BOOTM_STATE_START: - /* should never occur */ - break; - case BOOTM_STATE_LOADOS: - ret = bootm_load_os(images.os, &load_end, 0); - if (ret) - return ret; - - lmb_reserve(&images.lmb, images.os.load, - (load_end - images.os.load)); - break; -#ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH - case BOOTM_STATE_RAMDISK: - { - ulong rd_len = images.rd_end - images.rd_start; - - ret = boot_ramdisk_high(&images.lmb, images.rd_start, - rd_len, &images.initrd_start, &images.initrd_end); - if (ret) - return ret; - - setenv_hex("initrd_start", images.initrd_start); - setenv_hex("initrd_end", images.initrd_end); - } - break; -#endif -#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_LMB) - case BOOTM_STATE_FDT: - { - boot_fdt_add_mem_rsv_regions(&images.lmb, - images.ft_addr); - ret = boot_relocate_fdt(&images.lmb, - &images.ft_addr, &images.ft_len); - break; - } -#endif - case BOOTM_STATE_OS_CMDLINE: - ret = boot_fn(BOOTM_STATE_OS_CMDLINE, argc, argv, &images); - if (ret) - printf("cmdline subcommand not supported\n"); - break; - case BOOTM_STATE_OS_BD_T: - ret = boot_fn(BOOTM_STATE_OS_BD_T, argc, argv, &images); - if (ret) - printf("bdt subcommand not supported\n"); - break; - case BOOTM_STATE_OS_PREP: - ret = boot_fn(BOOTM_STATE_OS_PREP, argc, argv, &images); - if (ret) - printf("prep subcommand not supported\n"); - break; - case BOOTM_STATE_OS_GO: - disable_interrupts(); -#ifdef CONFIG_NETCONSOLE - /* - * Stop the ethernet stack if NetConsole could have - * left it up - */ - eth_halt(); -#endif - arch_preboot_os(); - boot_fn(BOOTM_STATE_OS_GO, argc, argv, &images); - break; - } + ret = do_bootm_states(cmdtp, flag, argc, argv, state, &images, 0); return ret; } @@ -594,10 +714,6 @@ static int do_bootm_subcommand(cmd_tbl_t *cmdtp, int flag, int argc, int do_bootm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { - ulong iflag; - ulong load_end = 0; - int ret; - boot_os_fn *boot_fn; #ifdef CONFIG_NEEDS_MANUAL_RELOC static int relocated = 0; @@ -635,101 +751,10 @@ int do_bootm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) return do_bootm_subcommand(cmdtp, flag, argc, argv); } - if (bootm_start(cmdtp, flag, argc, argv)) - return 1; - - /* - * We have reached the point of no return: we are going to - * overwrite all exception vector code, so we cannot easily - * recover from any failures any more... - */ - iflag = disable_interrupts(); - -#ifdef CONFIG_NETCONSOLE - /* Stop the ethernet stack if NetConsole could have left it up */ - eth_halt(); -#endif - -#if defined(CONFIG_CMD_USB) - /* - * turn off USB to prevent the host controller from writing to the - * SDRAM while Linux is booting. This could happen (at least for OHCI - * controller), because the HCCA (Host Controller Communication Area) - * lies within the SDRAM and the host controller writes continously to - * this area (as busmaster!). The HccaFrameNumber is for example - * updated every 1 ms within the HCCA structure in SDRAM! For more - * details see the OpenHCI specification. - */ - usb_stop(); -#endif - - ret = bootm_load_os(images.os, &load_end, 1); - - if (ret < 0) { - if (ret == BOOTM_ERR_RESET) - do_reset(cmdtp, flag, argc, argv); - if (ret == BOOTM_ERR_OVERLAP) { - if (images.legacy_hdr_valid) { - image_header_t *hdr; - hdr = &images.legacy_hdr_os_copy; - if (image_get_type(hdr) == IH_TYPE_MULTI) - puts("WARNING: legacy format multi " - "component image " - "overwritten\n"); - } else { - puts("ERROR: new format image overwritten - " - "must RESET the board to recover\n"); - bootstage_error(BOOTSTAGE_ID_OVERWRITTEN); - do_reset(cmdtp, flag, argc, argv); - } - } - if (ret == BOOTM_ERR_UNIMPLEMENTED) { - if (iflag) - enable_interrupts(); - bootstage_error(BOOTSTAGE_ID_DECOMP_UNIMPL); - return 1; - } - } - - lmb_reserve(&images.lmb, images.os.load, (load_end - images.os.load)); - - if (images.os.type == IH_TYPE_STANDALONE) { - if (iflag) - enable_interrupts(); - /* This may return when 'autostart' is 'no' */ - bootm_start_standalone(iflag, argc, argv); - return 0; - } - - bootstage_mark(BOOTSTAGE_ID_CHECK_BOOT_OS); - -#if defined(CONFIG_SILENT_CONSOLE) && !defined(CONFIG_SILENT_U_BOOT_ONLY) - if (images.os.os == IH_OS_LINUX) - fixup_silent_linux(); -#endif - - boot_fn = boot_os[images.os.os]; - - if (boot_fn == NULL) { - if (iflag) - enable_interrupts(); - printf("ERROR: booting os '%s' (%d) is not supported\n", - genimg_get_os_name(images.os.os), images.os.os); - bootstage_error(BOOTSTAGE_ID_CHECK_BOOT_OS); - return 1; - } - - arch_preboot_os(); - - boot_fn(0, argc, argv, &images); - - bootstage_error(BOOTSTAGE_ID_BOOT_OS_RETURNED); -#ifdef DEBUG - puts("\n## Control returned to monitor - resetting...\n"); -#endif - do_reset(cmdtp, flag, argc, argv); - - return 1; + return do_bootm_states(cmdtp, flag, argc, argv, BOOTM_STATE_START | + BOOTM_STATE_FINDOS | BOOTM_STATE_FINDOTHER | + BOOTM_STATE_LOADOS | BOOTM_STATE_OS_PREP | + BOOTM_STATE_OS_GO, &images, 1); } int bootm_maybe_autostart(cmd_tbl_t *cmdtp, const char *cmd) @@ -1671,9 +1696,8 @@ static int bootz_start(cmd_tbl_t *cmdtp, int flag, int argc, int ret; void *zi_start, *zi_end; - memset(images, 0, sizeof(bootm_headers_t)); - - boot_start_lmb(images); + ret = do_bootm_states(cmdtp, flag, argc, argv, BOOTM_STATE_START, + images, 1); /* Setup Linux kernel zImage entry point */ if (argc < 2) { @@ -1692,73 +1716,24 @@ static int bootz_start(cmd_tbl_t *cmdtp, int flag, int argc, lmb_reserve(&images->lmb, images->ep, zi_end - zi_start); - /* Find ramdisk */ - ret = boot_get_ramdisk(argc, argv, images, IH_INITRD_ARCH, - &images->rd_start, &images->rd_end); - if (ret) { - puts("Ramdisk image is corrupt or invalid\n"); - return 1; - } - -#if defined(CONFIG_OF_LIBFDT) - /* find flattened device tree */ - ret = boot_get_fdt(flag, argc, argv, IH_ARCH_DEFAULT, images, - &images->ft_addr, &images->ft_len); - if (ret) { - puts("Could not find a valid device tree\n"); - return 1; - } - - set_working_fdt_addr(images->ft_addr); -#endif + ret = do_bootm_states(cmdtp, flag, argc, argv, BOOTM_STATE_FINDOTHER, + images, 1); - return 0; + return ret; } static int do_bootz(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { bootm_headers_t images; + int ret; if (bootz_start(cmdtp, flag, argc, argv, &images)) return 1; - /* - * We have reached the point of no return: we are going to - * overwrite all exception vector code, so we cannot easily - * recover from any failures any more... - */ - disable_interrupts(); - -#ifdef CONFIG_NETCONSOLE - /* Stop the ethernet stack if NetConsole could have left it up */ - eth_halt(); -#endif + ret = do_bootm_states(cmdtp, flag, argc, argv, + BOOTM_STATE_OS_GO, &images, 1); -#if defined(CONFIG_CMD_USB) - /* - * turn off USB to prevent the host controller from writing to the - * SDRAM while Linux is booting. This could happen (at least for OHCI - * controller), because the HCCA (Host Controller Communication Area) - * lies within the SDRAM and the host controller writes continously to - * this area (as busmaster!). The HccaFrameNumber is for example - * updated every 1 ms within the HCCA structure in SDRAM! For more - * details see the OpenHCI specification. - */ - usb_stop(); -#endif - -#if defined(CONFIG_SILENT_CONSOLE) && !defined(CONFIG_SILENT_U_BOOT_ONLY) - fixup_silent_linux(); -#endif - arch_preboot_os(); - - do_bootm_linux(0, argc, argv, &images); -#ifdef DEBUG - puts("\n## Control returned to monitor - resetting...\n"); -#endif - do_reset(cmdtp, flag, argc, argv); - - return 1; + return ret; } #ifdef CONFIG_SYS_LONGHELP diff --git a/include/image.h b/include/image.h index 8ccc00b..8675a82 100644 --- a/include/image.h +++ b/include/image.h @@ -320,13 +320,15 @@ typedef struct bootm_headers { int verify; /* getenv("verify")[0] != 'n' */ #define BOOTM_STATE_START (0x00000001) -#define BOOTM_STATE_LOADOS (0x00000002) -#define BOOTM_STATE_RAMDISK (0x00000004) -#define BOOTM_STATE_FDT (0x00000008) -#define BOOTM_STATE_OS_CMDLINE (0x00000010) -#define BOOTM_STATE_OS_BD_T (0x00000020) -#define BOOTM_STATE_OS_PREP (0x00000040) -#define BOOTM_STATE_OS_GO (0x00000080) +#define BOOTM_STATE_FINDOS (0x00000002) +#define BOOTM_STATE_FINDOTHER (0x00000004) +#define BOOTM_STATE_LOADOS (0x00000008) +#define BOOTM_STATE_RAMDISK (0x00000010) +#define BOOTM_STATE_FDT (0x00000020) +#define BOOTM_STATE_OS_CMDLINE (0x00000040) +#define BOOTM_STATE_OS_BD_T (0x00000080) +#define BOOTM_STATE_OS_PREP (0x00000100) +#define BOOTM_STATE_OS_GO (0x00000200) int state; #ifdef CONFIG_LMB
At present the bootm code is mostly duplicated for the plain 'bootm' command and its sub-command variant. This makes the code harder to maintain and means that changes must be made to several places. Introduce do_bootm_states() which performs selected portions of the bootm work, so that both plain 'bootm' and 'bootm <sub_command>' can use the same code. Additional duplication exists in bootz, so tidy that up as well. This is not intended to change behaviour, apart from minor fixes where the previously-duplicated code missed some chunks of code. Signed-off-by: Simon Glass <sjg@chromium.org> --- Changes in v2: - Fix missing BOOTM_STATE_OS_PREP in do_bootm() - Rebase on top of mainline - Remove unneeded debug printf()s for non RFC version common/cmd_bootm.c | 457 +++++++++++++++++++++++++---------------------------- include/image.h | 16 +- 2 files changed, 225 insertions(+), 248 deletions(-)