[U-Boot] [PATCH v3 17/21] efi: Split out test init/uninit into functions
Simon Glass
sjg at chromium.org
Mon Feb 19 15:48:23 UTC 2018
We plan to run more than one EFI test. In order to avoid duplicating code,
create functions which handle preparing for running the test and cleaning
up afterwards.
Also shorten the awfully long variable names here.
Signed-off-by: Simon Glass <sjg at chromium.org>
---
Changes in v3:
- Add new patch to split out test init/uninit into functions
Changes in v2: None
cmd/bootefi.c | 92 ++++++++++++++++++++++++++++++++++++---------------
1 file changed, 66 insertions(+), 26 deletions(-)
diff --git a/cmd/bootefi.c b/cmd/bootefi.c
index d670a541eb..2a5d66e798 100644
--- a/cmd/bootefi.c
+++ b/cmd/bootefi.c
@@ -297,6 +297,64 @@ exit:
return ret;
}
+#ifdef CONFIG_CMD_BOOTEFI_SELFTEST
+/**
+ * bootefi_test_prepare() - prepare to run an EFI test
+ *
+ * This sets things up so we can call EFI functions. This involves preparing
+ * the 'gd' pointer and setting up the load ed image data structures.
+ *
+ * @image: Pointer to a struct which will hold the loaded image info
+ * @obj: Pointer to a struct which will hold the loaded image object
+ * @path: File path to the test being run (often just the test name with a
+ * backslash before it
+ * @test_func: Address of the test function that is being run
+ * @return 0 if OK, -ve on error
+ */
+static efi_status_t bootefi_test_prepare(struct efi_loaded_image *image,
+ struct efi_object *obj,
+ const char *path, ulong test_func)
+{
+ efi_status_t ret;
+
+ memset(image, '\0', sizeof(*image));
+ memset(obj, '\0', sizeof(*obj));
+ /* Construct a dummy device path */
+ bootefi_device_path = efi_dp_from_mem(EFI_RESERVED_MEMORY_TYPE,
+ test_func, test_func);
+ bootefi_image_path = efi_dp_from_file(NULL, 0, path);
+ efi_setup_loaded_image(image, obj, bootefi_device_path,
+ bootefi_image_path);
+ /*
+ * gd lives in a fixed register which may get clobbered while we execute
+ * the payload. So save it here and restore it on every callback entry
+ */
+ efi_save_gd();
+ /* Initialize and populate our EFI object list */
+ ret = efi_init_obj_list();
+ if (ret)
+ return ret;
+ /* Transfer environment variable efi_selftest as load options */
+ set_load_options(image, "efi_selftest");
+
+ return 0;
+}
+
+/**
+ * bootefi_test_finish() - finish up after running an EFI test
+ *
+ * @image: Pointer to a struct which holds the loaded image info
+ * @obj: Pointer to a struct which holds the loaded image object
+ */
+static void bootefi_test_finish(struct efi_loaded_image *image,
+ struct efi_object *obj)
+{
+ efi_restore_gd();
+ free(image->load_options);
+ list_del(&obj->link);
+}
+#endif /* CONFIG_CMD_BOOTEFI_SELFTEST */
+
static int do_bootefi_bootmgr_exec(unsigned long fdt_addr)
{
struct efi_device_path *device_path, *file_path;
@@ -350,34 +408,16 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
#endif
#ifdef CONFIG_CMD_BOOTEFI_SELFTEST
if (!strcmp(argv[1], "selftest")) {
- struct efi_loaded_image loaded_image_info = {};
- struct efi_object loaded_image_info_obj = {};
-
- /* Construct a dummy device path. */
- bootefi_device_path = efi_dp_from_mem(EFI_RESERVED_MEMORY_TYPE,
- (uintptr_t)&efi_selftest,
- (uintptr_t)&efi_selftest);
- bootefi_image_path = efi_dp_from_file(NULL, 0, "\\selftest");
-
- efi_setup_loaded_image(&loaded_image_info,
- &loaded_image_info_obj,
- bootefi_device_path, bootefi_image_path);
- /*
- * gd lives in a fixed register which may get clobbered while we
- * execute the payload. So save it here and restore it on every
- * callback entry
- */
- efi_save_gd();
- /* Initialize and populate EFI object list */
- if (efi_init_obj_list())
+ struct efi_loaded_image image;
+ struct efi_object obj;
+
+ if (bootefi_test_prepare(&image, &obj, "\\test",
+ (uintptr_t)&efi_selftest))
return CMD_RET_FAILURE;
- /* Transfer environment variable efi_selftest as load options */
- set_load_options(&loaded_image_info, "efi_selftest");
+
/* Execute the test */
- r = efi_selftest(loaded_image_info_obj.handle, &systab);
- efi_restore_gd();
- free(loaded_image_info.load_options);
- list_del(&loaded_image_info_obj.link);
+ r = efi_selftest(obj.handle, &systab);
+ bootefi_test_finish(&image, &obj);
return r != EFI_SUCCESS;
} else
#endif
--
2.16.1.291.g4437f3f132-goog
More information about the U-Boot
mailing list