[PATCH 2/2] mkeficapsule: Support "--flags reset" option

Heinrich Schuchardt xypron.glpk at gmx.de
Sat Feb 5 07:47:39 CET 2022


On 1/25/22 12:31, Masami Hiramatsu wrote:
> Support "--flags reset" option to set the CAPSULE_FLAGS_INITIATE_RESET
> flag to capsule header.
>
> Signed-off-by: Masami Hiramatsu <masami.hiramatsu at linaro.org>
> ---
>   tools/mkeficapsule.c |   26 ++++++++++++++++++++++----
>   1 file changed, 22 insertions(+), 4 deletions(-)
>
> diff --git a/tools/mkeficapsule.c b/tools/mkeficapsule.c
> index 4995ba4e0c..ca3a1c77ad 100644
> --- a/tools/mkeficapsule.c
> +++ b/tools/mkeficapsule.c
> @@ -44,6 +44,7 @@ static struct option options[] = {
>   	{"raw", required_argument, NULL, 'r'},
>   	{"index", required_argument, NULL, 'i'},
>   	{"instance", required_argument, NULL, 'I'},
> +	{"flags", required_argument, NULL, 'F' },
>   	{"help", no_argument, NULL, 'h'},
>   	{NULL, 0, NULL, 0},
>   };
> @@ -57,12 +58,13 @@ static void print_usage(void)
>   	       "\t-r, --raw <raw image>       new raw image file\n"
>   	       "\t-i, --index <index>         update image index\n"
>   	       "\t-I, --instance <instance>   update hardware instance\n"
> +	       "\t-F, --flags <flags>         set capsule flags (support only \"reset\")\n"

How should a user know if this "reset" means
CAPSULE_FLAGS_PERSIST_ACROSS_RESET 0x00010000 or
CAPSULE_FLAGS_INITIATE_RESET 0x00040000?

We need a man-page file for mkeficapsule (cf. /doc/mkimage.1 for mkimage).

The tool should support CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE 0x00020000
even if it is not implemented in U-Boot yet.

CAPSULE_FLAGS_PERSIST_ACROSS_RESET should not be set automatically if
--flags is provided.

Isn't CAPSULE_FLAGS_PERSIST_ACROSS_RESET |
CAPSULE_FLAGS_INITIATE_RESET what we need by default?

Best regards

Heinrich

>   	       "\t-h, --help                  print a help message\n",
>   	       tool_name);
>   }
>
>   static int create_fwbin(char *path, char *bin, efi_guid_t *guid,
> -			unsigned long index, unsigned long instance)
> +			unsigned long index, unsigned long instance, u32 flags)
>   {
>   	struct efi_capsule_header header;
>   	struct efi_firmware_management_capsule_header capsule;
> @@ -101,7 +103,7 @@ static int create_fwbin(char *path, char *bin, efi_guid_t *guid,
>   	header.capsule_guid = efi_guid_fm_capsule;
>   	header.header_size = sizeof(header);
>   	/* TODO: The current implementation ignores flags */
> -	header.flags = CAPSULE_FLAGS_PERSIST_ACROSS_RESET;
> +	header.flags = CAPSULE_FLAGS_PERSIST_ACROSS_RESET | flags;
>   	header.capsule_image_size = sizeof(header)
>   					+ sizeof(capsule) + sizeof(u64)
>   					+ sizeof(image)
> @@ -171,6 +173,14 @@ err_1:
>   	return -1;
>   }
>
> +int decode_capsule_flags(const char *flagstr, u32 *flags)
> +{
> +	if (strcmp(flagstr, "reset"))
> +		return -EINVAL;
> +	*flags = CAPSULE_FLAGS_INITIATE_RESET;
> +	return 0;
> +}
> +
>   /*
>    * Usage:
>    *   $ mkeficapsule -f <firmware binary> <output file>
> @@ -178,6 +188,7 @@ err_1:
>   int main(int argc, char **argv)
>   {
>   	char *file;
> +	u32 flags;
>   	efi_guid_t *guid;
>   	unsigned long index, instance;
>   	int c, idx;
> @@ -186,8 +197,9 @@ int main(int argc, char **argv)
>   	guid = NULL;
>   	index = 0;
>   	instance = 0;
> +	flags = 0;
>   	for (;;) {
> -		c = getopt_long(argc, argv, "f:r:i:I:v:h", options, &idx);
> +		c = getopt_long(argc, argv, "f:r:i:I:v:F:h", options, &idx);
>   		if (c == -1)
>   			break;
>
> @@ -214,6 +226,12 @@ int main(int argc, char **argv)
>   		case 'I':
>   			instance = strtoul(optarg, NULL, 0);
>   			break;
> +		case 'F':
> +			if (decode_capsule_flags(optarg, &flags) < 0) {
> +				printf("Unsupported flags %s\n", optarg);
> +				return -1;
> +			}
> +			break;
>   		case 'h':
>   			print_usage();
>   			return 0;
> @@ -232,7 +250,7 @@ int main(int argc, char **argv)
>   		exit(EXIT_SUCCESS);
>   	}
>
> -	if (create_fwbin(argv[optind], file, guid, index, instance)
> +	if (create_fwbin(argv[optind], file, guid, index, instance, flags)
>   			< 0) {
>   		printf("Creating firmware capsule failed\n");
>   		exit(EXIT_FAILURE);
>



More information about the U-Boot mailing list