Finding x86_setup among FIT configurations
Mike Crowe
mac at mcrowe.com
Fri May 27 18:37:47 CEST 2022
I'm trying to boot a FIT image on x86 and fit_image_load is having trouble
finding the setup binary.
My FIT image looks similar to the one in doc/uImage.FIT/kernel.its:
/ {
images {
kernel-1 {
description = "Linux kernel";
data = <...>
type = "kernel";
arch = "x86";
os = "linux";
compression = "none";
load = <0x1314c40>;
entry = <0x1314c40>;
hash-1 {
value = <...>
algo = "sha256";
};
};
setup-1 {
description = "Linux setup.bin";
data = <...>
type = "x86_setup";
arch = "x86";
os = "linux";
compression = "none";
load = <0x90000>;
entry = <0x90000>;
hash-1 {
value = <...>
algo = "sha256";
};
};
};
configurations {
conf-0 {
description = "Configuration for board 0";
kernel = "kernel-1";
setup = "setup-1";
};
conf-1 {
description = "Configuration for board 1";
kernel = "kernel-1";
setup = "setup-1";
};
};
};
I'm trying to run it with:
bootm ${loadaddr}#conf-0
I get:
## Loading kernel from FIT Image at 10000000 ...
Using 'conf-0' configuration
Trying 'kernel-1' kernel subimage
Description: Linux kernel
Created: 2022-05-27 14:03:08 UTC
Type: Kernel Image
Compression: uncompressed
Data Start: 0x100000f4
Data Size: 13990516 Bytes = 13.3 MiB
Architecture: Intel x86
OS: Linux
Load Address: 0x01314c40
Entry Point: 0x01314c40
Hash algo: sha256
Hash value: 1f4167a38aed74edb02bedf021fc8dbc4a9d0c0a84e886006de22c8b11714645
Verifying Hash Integrity ... sha256+ OK
## Loading setup from FIT Image at 10000000 ...
Could not find configuration node
Loading Kernel Image
## Kernel loading failed (missing x86 kernel setup) ...
subcommand not supported
"could not find configuration node" is emitted because fit_uname_config is
NULL inside image-fit.c:fit-image-load when loading the setup binary. I
don't have CONFIG_FIT_BEST_MATCH enabled, but enabling it didn't seem to
change the observed behaviour.
It appears that the parsing of the configuration name after the load
address is done separately inside bootm.c:boot_get_kernel (for the kernel)
and image-fit.c:boot_get_fdt_fit (for the device tree) and the command
arguments aren't even passed to image-fit.c:boot_get_setup_fit, so it just
passes NULL as fit_uname_config.
If I add:
if (!fit_uname_config)
fit_uname_config = "conf-0";
to image-fit.c:fit_image_load then the setup binary is found and my device
can boot the kernel successfully.
I can't see how this can ever work, so I think I must be missing something.
Can anyone enlighten me as to what that might be?
Thanks.
Mike.
More information about the U-Boot
mailing list