]> git.sur5r.net Git - u-boot/blobdiff - lib/efi_loader/efi_image_loader.c
efi_loader: new functions to print loaded image information
[u-boot] / lib / efi_loader / efi_image_loader.c
index cac64ba9fec229f9f1f2fd9b9efb8e31ce7fe5db..f5885760d416338e58bab63736c97319cf8c3da5 100644 (file)
@@ -22,6 +22,52 @@ 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");
+       printf(" [0x%p:0x%p]",
+              image->reloc_base, image->reloc_base + image->reloc_size - 1);
+       if (pc && pc >= image->reloc_base &&
+           pc < image->reloc_base + image->reloc_size)
+               printf(" pc=0x%zx", pc - image->reloc_base);
+       if (image->file_path)
+               printf(" '%pD'", image->file_path);
+       printf("\n");
+       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)) {
+                               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)
 {
@@ -175,6 +221,7 @@ void *efi_load_pe(void *efi, struct efi_loaded_image *loaded_image_info)
                entry = efi_reloc + opt->AddressOfEntryPoint;
                rel_size = opt->DataDirectory[rel_idx].Size;
                rel = efi_reloc + opt->DataDirectory[rel_idx].VirtualAddress;
+               virt_size = ALIGN(virt_size, opt->SectionAlignment);
        } else if (can_run_nt32 &&
                   (nt->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC)) {
                IMAGE_OPTIONAL_HEADER32 *opt = &nt->OptionalHeader;
@@ -190,6 +237,7 @@ void *efi_load_pe(void *efi, struct efi_loaded_image *loaded_image_info)
                entry = efi_reloc + opt->AddressOfEntryPoint;
                rel_size = opt->DataDirectory[rel_idx].Size;
                rel = efi_reloc + opt->DataDirectory[rel_idx].VirtualAddress;
+               virt_size = ALIGN(virt_size, opt->SectionAlignment);
        } else {
                printf("%s: Invalid optional header magic %x\n", __func__,
                       nt->OptionalHeader.Magic);
@@ -221,6 +269,8 @@ void *efi_load_pe(void *efi, struct efi_loaded_image *loaded_image_info)
        /* Populate the loaded image interface bits */
        loaded_image_info->image_base = efi;
        loaded_image_info->image_size = image_size;
+       loaded_image_info->reloc_base = efi_reloc;
+       loaded_image_info->reloc_size = virt_size;
 
        return entry;
 }