From: Tom Rini Date: Tue, 4 Jul 2017 12:00:16 +0000 (-0400) Subject: Merge tag 'signed-efi-next' of git://github.com/agraf/u-boot X-Git-Tag: v2017.07~38 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7e09145ea2e985511c660bdf567b61614acd75b3;hp=2f4c1d83f4e838bda4a02a408321aebc746b9eaa;p=platform%2Fkernel%2Fu-boot.git Merge tag 'signed-efi-next' of git://github.com/agraf/u-boot Patch queue for efi - 2017-07-04 Highlights this time: bugfixes. With these changes, OpenBSD should be more happy. --- diff --git a/MAINTAINERS b/MAINTAINERS index 957e27c..85dfa14 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -264,6 +264,7 @@ F: test/dm/ EFI PAYLOAD M: Alexander Graf S: Maintained +T: git git://github.com/agraf/u-boot.git F: include/efi_loader.h F: lib/efi_loader/ F: cmd/bootefi.c diff --git a/cmd/bootefi.c b/cmd/bootefi.c index a0a5434..771300e 100644 --- a/cmd/bootefi.c +++ b/cmd/bootefi.c @@ -133,7 +133,13 @@ static void *copy_fdt(void *fdt) &new_fdt_addr) != EFI_SUCCESS) { /* If we can't put it there, put it somewhere */ new_fdt_addr = (ulong)memalign(4096, fdt_size); + if (efi_allocate_pages(1, EFI_BOOT_SERVICES_DATA, fdt_pages, + &new_fdt_addr) != EFI_SUCCESS) { + printf("ERROR: Failed to reserve space for FDT\n"); + return NULL; + } } + new_fdt = (void*)(ulong)new_fdt_addr; memcpy(new_fdt, fdt, fdt_totalsize(fdt)); fdt_set_totalsize(new_fdt, fdt_size); diff --git a/include/efi_api.h b/include/efi_api.h index 5c3836a..f071b36 100644 --- a/include/efi_api.h +++ b/include/efi_api.h @@ -28,6 +28,9 @@ enum efi_event_type { EFI_TIMER_RELATIVE = 2 }; +#define EVT_NOTIFY_WAIT 0x00000100 +#define EVT_NOTIFY_SIGNAL 0x00000200 + /* EFI Boot Services table */ struct efi_boot_services { struct efi_table_hdr hdr; diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c index 51080cb..27e51a2 100644 --- a/lib/efi_loader/efi_boottime.c +++ b/lib/efi_loader/efi_boottime.c @@ -104,9 +104,9 @@ static void EFIAPI efi_restore_tpl(unsigned long old_tpl) EFI_EXIT(efi_unsupported(__func__)); } -efi_status_t EFIAPI efi_allocate_pages_ext(int type, int memory_type, - unsigned long pages, - uint64_t *memory) +static efi_status_t EFIAPI efi_allocate_pages_ext(int type, int memory_type, + unsigned long pages, + uint64_t *memory) { efi_status_t r; @@ -115,7 +115,8 @@ efi_status_t EFIAPI efi_allocate_pages_ext(int type, int memory_type, return EFI_EXIT(r); } -efi_status_t EFIAPI efi_free_pages_ext(uint64_t memory, unsigned long pages) +static efi_status_t EFIAPI efi_free_pages_ext(uint64_t memory, + unsigned long pages) { efi_status_t r; @@ -124,11 +125,12 @@ efi_status_t EFIAPI efi_free_pages_ext(uint64_t memory, unsigned long pages) return EFI_EXIT(r); } -efi_status_t EFIAPI efi_get_memory_map_ext(unsigned long *memory_map_size, - struct efi_mem_desc *memory_map, - unsigned long *map_key, - unsigned long *descriptor_size, - uint32_t *descriptor_version) +static efi_status_t EFIAPI efi_get_memory_map_ext( + unsigned long *memory_map_size, + struct efi_mem_desc *memory_map, + unsigned long *map_key, + unsigned long *descriptor_size, + uint32_t *descriptor_version) { efi_status_t r; @@ -189,6 +191,16 @@ static efi_status_t EFIAPI efi_create_event( return EFI_EXIT(EFI_OUT_OF_RESOURCES); } + if (event == NULL) + return EFI_EXIT(EFI_INVALID_PARAMETER); + + if ((type & EVT_NOTIFY_SIGNAL) && (type & EVT_NOTIFY_WAIT)) + return EFI_EXIT(EFI_INVALID_PARAMETER); + + if ((type & (EVT_NOTIFY_SIGNAL|EVT_NOTIFY_WAIT)) && + notify_function == NULL) + return EFI_EXIT(EFI_INVALID_PARAMETER); + efi_event.type = type; efi_event.notify_tpl = notify_tpl; efi_event.notify_function = notify_function; @@ -210,7 +222,9 @@ void efi_timer_check(void) /* Triggering! */ if (efi_event.trigger_type == EFI_TIMER_PERIODIC) efi_event.trigger_next += efi_event.trigger_time / 10; - efi_event.notify_function(&efi_event, efi_event.notify_context); + if (efi_event.type & (EVT_NOTIFY_WAIT | EVT_NOTIFY_SIGNAL)) + efi_event.notify_function(&efi_event, + efi_event.notify_context); } WATCHDOG_RESET(); @@ -738,8 +752,8 @@ static efi_status_t EFIAPI efi_handle_protocol(void *handle, efi_guid_t *protocol, void **protocol_interface) { - return efi_open_protocol(handle, protocol, protocol_interface, - NULL, NULL, 0); + return efi_open_protocol(handle, protocol, protocol_interface, NULL, + NULL, EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL); } static const struct efi_boot_services efi_boot_services = { diff --git a/lib/efi_loader/efi_image_loader.c b/lib/efi_loader/efi_image_loader.c index 3262d76..d4c62e6 100644 --- a/lib/efi_loader/efi_image_loader.c +++ b/lib/efi_loader/efi_image_loader.c @@ -26,7 +26,7 @@ efi_status_t EFIAPI efi_return_handle(void *handle, efi_guid_t *protocol, return EFI_SUCCESS; } -static void efi_loader_relocate(const IMAGE_BASE_RELOCATION *rel, +static efi_status_t efi_loader_relocate(const IMAGE_BASE_RELOCATION *rel, unsigned long rel_size, void *efi_reloc) { const IMAGE_BASE_RELOCATION *end; @@ -63,11 +63,13 @@ static void efi_loader_relocate(const IMAGE_BASE_RELOCATION *rel, default: printf("Unknown Relocation off %x type %x\n", offset, type); + return EFI_LOAD_ERROR; } relocs++; } rel = (const IMAGE_BASE_RELOCATION *)relocs; } + return EFI_SUCCESS; } void __weak invalidate_icache_all(void) @@ -171,7 +173,11 @@ void *efi_load_pe(void *efi, struct efi_loaded_image *loaded_image_info) } /* Run through relocations */ - efi_loader_relocate(rel, rel_size, efi_reloc); + if (efi_loader_relocate(rel, rel_size, efi_reloc) != EFI_SUCCESS) { + efi_free_pages((uintptr_t) efi_reloc, + (virt_size + EFI_PAGE_MASK) >> EFI_PAGE_SHIFT); + return NULL; + } /* Flush cache */ flush_cache((ulong)efi_reloc,