[PATCH v2] arch/x86/lib: implement cmdline configuration property

Heinrich Schuchardt xypron.glpk at gmx.de
Sat Apr 11 13:25:25 CEST 2026


Am 3. April 2026 16:28:23 MESZ schrieb Guillaume Ranquet <ranquet.guillaume at gmail.com>:
>Implement the cmdline configuration property as described in the spec
>[1]


I can't see in the spec that the command line property is x86 specific. Why would you try to implement it in arch/x86?

Best regards

Heirich

>
>[1]: https://fitspec.osfw.foundation/#id10
>
>Signed-off-by: Guillaume Ranquet <granquet at missingno.tech>
>---
>Changes in v2:
>- EDITME: describe what is new in this series revision.
>- EDITME: use bulletpoints and terse descriptions.
>- Link to v1: https://lore.kernel.org/r/20260401-cmdline-v1-1-c56577f82960@missingno.tech
>---
> arch/x86/include/asm/zimage.h |  2 +-
> arch/x86/lib/bootm.c          | 10 +++++++++-
> arch/x86/lib/zimage.c         |  6 +++---
> boot/image-fit.c              | 30 +++++++++++++++++++++++++++++-
> include/image.h               |  3 +++
> 5 files changed, 45 insertions(+), 6 deletions(-)
>
>diff --git a/arch/x86/include/asm/zimage.h b/arch/x86/include/asm/zimage.h
>index 8b5426051701c8266395afd9232eb1ff30d38304..ee0114a227a2b067a3a3126d7d80ab0cc89cea6e 100644
>--- a/arch/x86/include/asm/zimage.h
>+++ b/arch/x86/include/asm/zimage.h
>@@ -132,7 +132,7 @@ struct boot_params *load_zimage(char *image, unsigned long kernel_size,
>  * Return: 0 (always)
>  */
> int setup_zimage(struct boot_params *setup_base, char *cmd_line, int auto_boot,
>-		 ulong initrd_addr, ulong initrd_size, ulong cmdline_force);
>+		 ulong initrd_addr, ulong initrd_size, const char *cmdline_force);
> 
> /**
>  * zboot_start() - Prepare to boot a zimage
>diff --git a/arch/x86/lib/bootm.c b/arch/x86/lib/bootm.c
>index cde4fbf35574a267b856a668659ece7e0a36367f..e029cc1ff18bd53eb873c0e56fd9d3b0a331b4c2 100644
>--- a/arch/x86/lib/bootm.c
>+++ b/arch/x86/lib/bootm.c
>@@ -61,6 +61,7 @@ int arch_fixup_memory_node(void *blob)
> static int boot_prep_linux(struct bootm_headers *images)
> {
> 	char *cmd_line_dest = NULL;
>+	const char *cmd_line_override = NULL;
> 	struct legacy_img_hdr *hdr;
> 	int is_zimage = 0;
> 	void *data = NULL;
>@@ -99,6 +100,13 @@ static int boot_prep_linux(struct bootm_headers *images)
> 			puts("Can't get image data/size!\n");
> 			goto error;
> 		}
>+
>+		ret = fit_image_get_cmdline(images->fit_hdr_os,
>+					    images->fit_noffset_cfg,
>+					    &cmd_line_override);
>+		if (ret)
>+			debug("unable to retrieve cmdline for zimage\n");
>+
> 		is_zimage = 1;
> #endif
> 	}
>@@ -125,7 +133,7 @@ static int boot_prep_linux(struct bootm_headers *images)
> 	printf("Setup at %#08lx\n", images->ep);
> 	ret = setup_zimage((void *)images->ep, cmd_line_dest,
> 			0, images->rd_start,
>-			images->rd_end - images->rd_start, 0);
>+			images->rd_end - images->rd_start, cmd_line_override);
> 
> 	if (ret) {
> 		printf("## Setting up boot parameters failed ...\n");
>diff --git a/arch/x86/lib/zimage.c b/arch/x86/lib/zimage.c
>index a5f2231aa523356de93368338b5fd249b8abad6e..af7ee8dbcf3e8f402cb0c76767b8a587f205ad5d 100644
>--- a/arch/x86/lib/zimage.c
>+++ b/arch/x86/lib/zimage.c
>@@ -276,7 +276,7 @@ struct boot_params *load_zimage(char *image, unsigned long kernel_size,
> }
> 
> int setup_zimage(struct boot_params *setup_base, char *cmd_line, int auto_boot,
>-		 ulong initrd_addr, ulong initrd_size, ulong cmdline_force)
>+		 ulong initrd_addr, ulong initrd_size, const char *cmdline_force)
> {
> 	struct setup_header *hdr = &setup_base->hdr;
> 	int bootproto = get_boot_protocol(hdr, false);
>@@ -333,7 +333,7 @@ int setup_zimage(struct boot_params *setup_base, char *cmd_line, int auto_boot,
> 
> 		/* build command line at COMMAND_LINE_OFFSET */
> 		if (cmdline_force)
>-			strcpy(cmd_line, (char *)cmdline_force);
>+			strcpy(cmd_line, cmdline_force);
> 		else
> 			build_command_line(cmd_line, auto_boot);
> 		if (IS_ENABLED(CONFIG_CMD_BOOTM)) {
>@@ -404,7 +404,7 @@ int zboot_setup(void)
> 
> 	ret = setup_zimage(base_ptr, (char *)base_ptr + COMMAND_LINE_OFFSET,
> 			   0, state.initrd_addr, state.initrd_size,
>-			   (ulong)state.cmdline);
>+			   state.cmdline);
> 	if (ret)
> 		return -EINVAL;
> 
>diff --git a/boot/image-fit.c b/boot/image-fit.c
>index e7c7212195f4a291e26ed6d3440a1b42274dacab..1790af4a8e5a9c7d11f7dee5f67226071f8f057e 100644
>--- a/boot/image-fit.c
>+++ b/boot/image-fit.c
>@@ -1096,6 +1096,32 @@ int fit_image_get_data(const void *fit, int noffset, const void **data,
> 	return ret;
> }
> 
>+/**
>+ * fit_image_get_cmdline - get image configuration command line
>+ * @fit: pointer to the FIT format image header
>+ * @cfg_noffset: configuration node offset
>+ * @cmdline: double pointer to char, will hold pointer to the cmdline
>+ *
>+ * fit_image_get_cmdline() gets the cmdline from the configuration node.
>+ * If the property is found its data start address is returned to the caller.
>+ *
>+ * returns:
>+ *     0, on success
>+ *     -1, on failure
>+ */
>+int fit_image_get_cmdline(const void *fit, int noffset, const char **cmdline)
>+{
>+	int len;
>+
>+	*cmdline = (const char *)fdt_getprop(fit, noffset, FIT_CMDLINE_PROP, &len);
>+	if (!*cmdline) {
>+		fit_get_debug(fit, noffset, FIT_CMDLINE_PROP, len);
>+		return -1;
>+	}
>+
>+	return 0;
>+}
>+
> /**
>  * fit_image_hash_get_algo - get hash algorithm name
>  * @fit: pointer to the FIT format image header
>@@ -2136,8 +2162,10 @@ int fit_image_load(struct bootm_headers *images, ulong addr,
> 		fit_base_uname_config = fdt_get_name(fit, cfg_noffset, NULL);
> 		printf("   Using '%s' configuration\n", fit_base_uname_config);
> 		/* Remember this config */
>-		if (image_type == IH_TYPE_KERNEL)
>+		if (image_type == IH_TYPE_KERNEL) {
> 			images->fit_uname_cfg = fit_base_uname_config;
>+			images->fit_noffset_cfg = cfg_noffset;
>+		}
> 
> 		if (FIT_IMAGE_ENABLE_VERIFY && images->verify) {
> 			puts("   Verifying Hash Integrity ... ");
>diff --git a/include/image.h b/include/image.h
>index 34efac6056dd29307df359dce21e4f94d5fcbf2d..9916e67168e3a4f5412fc26d318af32047c239e2 100644
>--- a/include/image.h
>+++ b/include/image.h
>@@ -365,6 +365,7 @@ struct bootm_headers {
> 	 * format, even for SPL, this extra data size seems worth it.
> 	 */
> 	const char	*fit_uname_cfg;	/* configuration node unit name */
>+	int		fit_noffset_cfg;	/* configuration node offset */
> 
> 	void		*fit_hdr_os;	/* os FIT image header */
> 	const char	*fit_uname_os;	/* os subimage node unit name */
>@@ -1108,6 +1109,7 @@ int booti_setup(ulong image, ulong *relocated_addr, ulong *size,
> #define FIT_TFA_BL31_PROP	"tfa-bl31"
> #define FIT_TEE_PROP		"tee"
> #define FIT_COMPAT_PROP		"compatible"
>+#define FIT_CMDLINE_PROP	"cmdline"
> 
> #define FIT_MAX_HASH_LEN	HASH_MAX_DIGEST_SIZE
> 
>@@ -1259,6 +1261,7 @@ int fit_get_data_node(const void *fit, const char *image_uname,
> int fit_get_data_conf_prop(const void *fit, const char *prop_name,
> 			   const void **data, size_t *size);
> 
>+int fit_image_get_cmdline(const void *fit, int noffset, const char **cmdline);
> int fit_image_hash_get_algo(const void *fit, int noffset, const char **algo);
> int fit_image_hash_get_value(const void *fit, int noffset, uint8_t **value,
> 				int *value_len);
>
>---
>base-commit: 98cf83d81617f489d7ff7bf78d33e693e2799254
>change-id: 20260401-cmdline-ab954a4e8828
>
>Best regards,



More information about the U-Boot mailing list