[U-Boot] [PATCH 1/2] efi_loader: new functions to print loaded image information
Alexander Graf
agraf at suse.de
Wed Apr 4 09:34:24 UTC 2018
On 29.03.18 23:54, Heinrich Schuchardt wrote:
> Introduce functions to print information about loaded images.
>
> If we want to analyze an exception in an EFI image we need the offset
> between the PC and the start of the loaded image.
>
> With efi_print_image_info() we can print the necessary information for a
> single image, e.g.
>
> UEFI image
> start 0x7fdb4000, size 0xa7b60
> pc offset 0x72ca
> /\snp.efi
>
> efi_print_image_infos() provides output for all loaded images.
This is the only function we're actually calling. That means if you have
3 images loaded, things become quite unpleasant to read, with each image
spanning over 4 lines.
Can you please condense the image information down to a single line?
Something like this:
UEFI image "foo.efi" [0x70db4000:0x70e5b000]
UEFI image "snp.efi" [0x7fdb4000:0x7fe5bb60] pc=0x72ca
UEFI image "bar.efi" [0x7cdb4000:0x7ce50000]
Alex
>
> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
> ---
> include/efi_loader.h | 4 ++++
> lib/efi_loader/efi_image_loader.c | 45 +++++++++++++++++++++++++++++++++++++++
> 2 files changed, 49 insertions(+)
>
> diff --git a/include/efi_loader.h b/include/efi_loader.h
> index 07730c3f39..5ed6ff04d8 100644
> --- a/include/efi_loader.h
> +++ b/include/efi_loader.h
> @@ -284,6 +284,10 @@ efi_status_t efi_setup_loaded_image(
> struct efi_device_path *file_path);
> efi_status_t efi_load_image_from_path(struct efi_device_path *file_path,
> void **buffer);
> +/* Print information about a loaded image */
> +efi_status_t efi_print_image_info(struct efi_loaded_image *image, void *pc);
> +/* Print information about all loaded images */
> +void efi_print_image_infos(void *pc);
>
> #ifdef CONFIG_EFI_LOADER_BOUNCE_BUFFER
> extern void *efi_bounce_buffer;
> diff --git a/lib/efi_loader/efi_image_loader.c b/lib/efi_loader/efi_image_loader.c
> index cac64ba9fe..9750da551a 100644
> --- a/lib/efi_loader/efi_image_loader.c
> +++ b/lib/efi_loader/efi_image_loader.c
> @@ -22,6 +22,51 @@ const efi_guid_t efi_simple_file_system_protocol_guid =
> EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID;
> const efi_guid_t efi_file_info_guid = EFI_FILE_INFO_GUID;
>
> +/*
> + * Print information about a loaded image.
> + *
> + * If the program counter is located within the image the offset to the base
> + * address is shown.
> + *
> + * @image: loaded image
> + * @pc: program counter (use NULL to suppress offset output)
> + * @return: status code
> + */
> +efi_status_t efi_print_image_info(struct efi_loaded_image *image, void *pc)
> +{
> + if (!image)
> + return EFI_INVALID_PARAMETER;
> + printf("UEFI image\nstart 0x%p, size 0x%llx\n",
> + image->image_base, image->image_size);
> + if (pc && pc >= image->image_base &&
> + pc < image->image_base + image->image_size)
> + printf("pc offset 0x%zx\n", pc - image->image_base);
> + if (image->file_path)
> + printf("%pD\n", image->file_path);
> + return EFI_SUCCESS;
> +}
> +
> +/*
> + * Print information about all loaded images.
> + *
> + * @pc: program counter (use NULL to suppress offset output)
> + */
> +void efi_print_image_infos(void *pc)
> +{
> + struct efi_object *efiobj;
> + struct efi_handler *handler;
> +
> + list_for_each_entry(efiobj, &efi_obj_list, link) {
> + list_for_each_entry(handler, &efiobj->protocols, link) {
> + if (!guidcmp(handler->guid, &efi_guid_loaded_image)) {
> + printf("\n");
> + efi_print_image_info(
> + handler->protocol_interface, pc);
> + }
> + }
> + }
> +}
> +
> static efi_status_t efi_loader_relocate(const IMAGE_BASE_RELOCATION *rel,
> unsigned long rel_size, void *efi_reloc)
> {
>
More information about the U-Boot
mailing list