On 06/18/2018 04:08 PM, Simon Glass wrote:
> 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 <s...@chromium.org>
> ---
> 
> Changes in v8: None
> Changes in v7: None
> Changes in v6: None
> Changes in v5:
> - Drop call to efi_init_obj_list() which is now done in do_bootefi()
> 
> Changes in v4: None
> Changes in v3:
> - Add new patch to split out test init/uninit into functions
> 
> Changes in v2: None
> 
>  cmd/bootefi.c | 87 +++++++++++++++++++++++++++++++++++++--------------
>  1 file changed, 63 insertions(+), 24 deletions(-)
> 
> diff --git a/cmd/bootefi.c b/cmd/bootefi.c
> index f55a40dc84..2dfd297e78 100644
> --- a/cmd/bootefi.c
> +++ b/cmd/bootefi.c
> @@ -356,6 +356,60 @@ 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)
> +{
> +     memset(image, '\0', sizeof(*image));
> +     memset(obj, '\0', sizeof(*obj));

It is unclear why you are adding the memsets here.

> +     /* Construct a dummy device path */
> +     bootefi_device_path = efi_dp_from_mem(EFI_RESERVED_MEMORY_TYPE,
> +                                           (uintptr_t)test_func,
> +                                           (uintptr_t)test_func);

efi_dp_from_mem() may return NULL in case of an error.

> +     bootefi_image_path = efi_dp_from_file(NULL, 0, path);
> +     efi_setup_loaded_image(image, obj, bootefi_device_path,
> +                            bootefi_image_path);

The return code of efi_setup_loaded_image() should be checked. This
function should not return 0 if the return code is not EFI_SUCCESS.

Best regards

Heinrich

> +     /*
> +      * 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();
> +
> +     /* 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(void)
>  {
>       struct efi_device_path *device_path, *file_path;
> @@ -434,31 +488,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();
> -             /* Transfer environment variable efi_selftest as load options */
> -             set_load_options(&loaded_image_info, "efi_selftest");
> +             struct efi_loaded_image image;
> +             struct efi_object obj;
> +
> +             if (bootefi_test_prepare(&image, &obj, "\\selftest",
> +                                      (uintptr_t)&efi_selftest))
> +                     return CMD_RET_FAILURE;
> +
>               /* 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
> 

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to