[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