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.g...@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) > { > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot