[PATCH 14/24] bootstd: Read the Operating System name for distro/scripts

Heinrich Schuchardt xypron.glpk at gmx.de
Tue Oct 18 00:14:18 CEST 2022


On 10/17/22 22:29, Simon Glass wrote:
> Add the concept of an OS name to the bootflow. This typically includes the
> OS name, version and kernel version.
>
> Implement this for the distro and script bootmeths so that it works with
> Armbian and older version of Fedora.

How do you plan to detect the distro?

Best regards

Heinrich

>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
>   boot/bootflow.c        |  1 +
>   boot/bootmeth_distro.c | 36 ++++++++++++++++++++++++++++++++++++
>   boot/bootmeth_script.c | 34 ++++++++++++++++++++++++++++++++++
>   cmd/bootflow.c         |  1 +
>   include/bootflow.h     |  3 +++
>   test/boot/bootflow.c   |  1 +
>   6 files changed, 76 insertions(+)
>
> diff --git a/boot/bootflow.c b/boot/bootflow.c
> index f9ad4099244..163cd4953dd 100644
> --- a/boot/bootflow.c
> +++ b/boot/bootflow.c
> @@ -354,6 +354,7 @@ void bootflow_free(struct bootflow *bflow)
>   	free(bflow->subdir);
>   	free(bflow->fname);
>   	free(bflow->buf);
> +	free(bflow->os_name);
>   }
>
>   void bootflow_remove(struct bootflow *bflow)
> diff --git a/boot/bootmeth_distro.c b/boot/bootmeth_distro.c
> index 5c6c687f0a6..6ef0fa1f2c9 100644
> --- a/boot/bootmeth_distro.c
> +++ b/boot/bootmeth_distro.c
> @@ -66,6 +66,38 @@ static int distro_check(struct udevice *dev, struct bootflow_iter *iter)
>   	return 0;
>   }
>
> +/**
> + * distro_fill_info() - Decode the extlinux file to find out distro info
> + *
> + * @bflow: Bootflow to process
> + * @return 0 if OK, -ve on error
> + */
> +static int distro_fill_info(struct bootflow *bflow)
> +{
> +	struct membuff mb;
> +	char line[200];
> +	char *data;
> +	int len;
> +
> +	log_debug("parsing bflow file size %x\n", bflow->size);
> +	membuff_init(&mb, bflow->buf, bflow->size);
> +	membuff_putraw(&mb, bflow->size, true, &data);
> +	while (len = membuff_readline(&mb, line, sizeof(line) - 1, ' '), len) {
> +		char *tok, *p = line;
> +
> +		tok = strsep(&p, " ");
> +		if (p) {
> +			if (!strcmp("label", tok)) {
> +				bflow->os_name = strdup(p);
> +				if (!bflow->os_name)
> +					return log_msg_ret("os", -ENOMEM);
> +			}
> +		}
> +	}
> +
> +	return 0;
> +}
> +
>   static int distro_read_bootflow(struct udevice *dev, struct bootflow *bflow)
>   {
>   	struct blk_desc *desc;
> @@ -99,6 +131,10 @@ static int distro_read_bootflow(struct udevice *dev, struct bootflow *bflow)
>   	if (ret)
>   		return log_msg_ret("read", ret);
>
> +	ret = distro_fill_info(bflow);
> +	if (ret)
> +		return log_msg_ret("inf", ret);
> +
>   	return 0;
>   }
>
> diff --git a/boot/bootmeth_script.c b/boot/bootmeth_script.c
> index d1c3f940037..8ba9d93a080 100644
> --- a/boot/bootmeth_script.c
> +++ b/boot/bootmeth_script.c
> @@ -35,6 +35,36 @@ static int script_check(struct udevice *dev, struct bootflow_iter *iter)
>   	return 0;
>   }
>
> +/**
> + * script_fill_info() - Decode the U-Boot script to find out distro info
> + *
> + * @bflow: Bootflow to process
> + * @return 0 if OK, -ve on error
> + */
> +static int script_fill_info(struct bootflow *bflow)
> +{
> +	char *name = NULL;
> +	char *data;
> +	uint len;
> +	int ret;
> +
> +	log_debug("parsing bflow file size %x\n", bflow->size);
> +
> +	ret = image_locate_script(bflow->buf, bflow->size, NULL, &data, &len);
> +	if (!ret) {
> +		if (strstr(data, "armbianEnv"))
> +			name = "Armbian";
> +	}
> +
> +	if (name) {
> +		bflow->os_name = strdup(name);
> +		if (!bflow->os_name)
> +			return log_msg_ret("os", -ENOMEM);
> +	}
> +
> +	return 0;
> +}
> +
>   static int script_read_bootflow(struct udevice *dev, struct bootflow *bflow)
>   {
>   	struct blk_desc *desc = NULL;
> @@ -75,6 +105,10 @@ static int script_read_bootflow(struct udevice *dev, struct bootflow *bflow)
>   	if (ret)
>   		return log_msg_ret("read", ret);
>
> +	ret = script_fill_info(bflow);
> +	if (ret)
> +		return log_msg_ret("inf", ret);
> +
>   	return 0;
>   }
>
> diff --git a/cmd/bootflow.c b/cmd/bootflow.c
> index 313103d2775..6b8ac8c8504 100644
> --- a/cmd/bootflow.c
> +++ b/cmd/bootflow.c
> @@ -337,6 +337,7 @@ static int do_bootflow_info(struct cmd_tbl *cmdtp, int flag, int argc,
>   	printf("Filename:  %s\n", bflow->fname);
>   	printf("Buffer:    %lx\n", (ulong)map_to_sysmem(bflow->buf));
>   	printf("Size:      %x (%d bytes)\n", bflow->size, bflow->size);
> +	printf("OS:        %s\n", bflow->os_name ? bflow->os_name : "(none)");
>   	printf("Error:     %d\n", bflow->err);
>   	if (dump && bflow->buf) {
>   		/* Set some sort of maximum on the size */
> diff --git a/include/bootflow.h b/include/bootflow.h
> index 32dbbbbe261..776158c65df 100644
> --- a/include/bootflow.h
> +++ b/include/bootflow.h
> @@ -52,6 +52,8 @@ enum bootflow_state_t {
>    * @buf: Bootflow file contents (allocated)
>    * @size: Size of bootflow file in bytes
>    * @err: Error number received (0 if OK)
> + * @os_name: Name of the OS / distro being booted, or NULL if not known
> + *	(allocated)
>    */
>   struct bootflow {
>   	struct list_head bm_node;
> @@ -68,6 +70,7 @@ struct bootflow {
>   	char *buf;
>   	int size;
>   	int err;
> +	char *os_name;
>   };
>
>   /**
> diff --git a/test/boot/bootflow.c b/test/boot/bootflow.c
> index e1e07082105..3296316cf0d 100644
> --- a/test/boot/bootflow.c
> +++ b/test/boot/bootflow.c
> @@ -188,6 +188,7 @@ static int bootflow_cmd_info(struct unit_test_state *uts)
>   	ut_assert_nextline("Filename:  /extlinux/extlinux.conf");
>   	ut_assert_nextlinen("Buffer:    ");
>   	ut_assert_nextline("Size:      253 (595 bytes)");
> +	ut_assert_nextline("OS:        Fedora-Workstation-armhfp-31-1.9 (5.3.7-301.fc31.armv7hl)");
>   	ut_assert_nextline("Error:     0");
>   	ut_assert_console_end();
>



More information about the U-Boot mailing list