[U-Boot] [Urgent Problem] ARM64 Linux fails to boot with initramdisk with uImage header
Masahiro Yamada
yamada.masahiro at socionext.com
Wed Jul 20 13:03:03 CEST 2016
Hi.
I found ARM64 Linux fails to boot since commit 555f45d8f916 ("image:
Convert the IH_... values to enums"). It claims the ramdisk with
uImage header is corrupt or invalid as follow.
## Loading init Ramdisk from Legacy Image at 84a00000 ...
Image Name:
Created: 2016-06-20 4:41:26 UTC
Image Type: ARC Linux RAMDisk Image (uncompressed)
Data Size: 1752025 Bytes = 1.7 MiB
Load Address: 00000000
Entry Point: 00000000
No Linux AArch64 Ramdisk Image
Ramdisk image is corrupt or invalid
Please note the "Image Type" field shows ARC, not AArch64.
The cause of the problem is commit 555f45d8f916
changed IH_ARCH_... values.
Prior to the commit, IH_ARCH_... were defined as follows:
#define IH_ARCH_SH 9 /* SuperH */
#define IH_ARCH_SPARC 10 /* Sparc */
#define IH_ARCH_SPARC64 11 /* Sparc 64 Bit */
#define IH_ARCH_M68K 12 /* M68K */
#define IH_ARCH_MICROBLAZE 14 /* MicroBlaze */
#define IH_ARCH_NIOS2 15 /* Nios-II */
#define IH_ARCH_BLACKFIN 16 /* Blackfin */
#define IH_ARCH_AVR32 17 /* AVR32 */
#define IH_ARCH_ST200 18 /* STMicroelectronics ST200 */
#define IH_ARCH_SANDBOX 19 /* Sandbox architecture (test only) */
#define IH_ARCH_NDS32 20 /* ANDES Technology - NDS32 */
#define IH_ARCH_OPENRISC 21 /* OpenRISC 1000 */
#define IH_ARCH_ARM64 22 /* ARM64 */
#define IH_ARCH_ARC 23 /* Synopsys DesignWare ARC */
#define IH_ARCH_X86_64 24 /* AMD x86_64, Intel and Via */
Please notice 13 is missing!
The enum conversion changed the value of IH_ARCH_ARM64
from 22 to 21.
This broke the compatibility with already existing uImage files.
I think the enum conversion was a bad idea
because we tend to assume the order of items in enum
is arbitrary, like sorting items alphabetically is allowed.
I think the best thing is to revert 555f45d8f916,
but it causes build error:
In file included from tools/common/image.c:1:0:
./tools/../common/image.c:186:20: error: ‘IH_ARCH_COUNT’ undeclared
here (not in a function)
{ "architecture", IH_ARCH_COUNT, uimage_arch },
^
./tools/../common/image.c:187:19: error: ‘IH_COMP_COUNT’ undeclared
here (not in a function)
{ "compression", IH_COMP_COUNT, uimage_comp },
^
./tools/../common/image.c:188:24: error: ‘IH_OS_COUNT’ undeclared here
(not in a function)
{ "operating system", IH_OS_COUNT, uimage_os },
I am in trouble.
Currently, I patch my local tree, like follows.
@@ -182,7 +188,7 @@ enum {
IH_ARCH_SPARC, /* Sparc */
IH_ARCH_SPARC64, /* Sparc 64 Bit */
IH_ARCH_M68K, /* M68K */
- IH_ARCH_MICROBLAZE, /* MicroBlaze */
+ IH_ARCH_MICROBLAZE =14, /* MicroBlaze */
IH_ARCH_NIOS2, /* Nios-II */
IH_ARCH_BLACKFIN, /* Blackfin */
IH_ARCH_AVR32, /* AVR32 */
But, as I said above, I believe enum should not be used here
in the first place.
We need to do something asap.
--
Best Regards
Masahiro Yamada
More information about the U-Boot
mailing list