[PATCH 2/2] mkeficapsule: Support "--flags reset" option
Masami Hiramatsu
masami.hiramatsu at linaro.org
Tue Jan 25 12:31:39 CET 2022
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"
"\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