summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorTom Rini <[email protected]>2017-07-04 08:00:16 -0400
committerTom Rini <[email protected]>2017-07-04 08:00:16 -0400
commit7e09145ea2e985511c660bdf567b61614acd75b3 (patch)
tree91860537dec991900895747c64c957785c7d32f6 /lib
parent2f4c1d83f4e838bda4a02a408321aebc746b9eaa (diff)
parentda684a646d0c94f7a6126e7ecf110278691465a6 (diff)
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.
Diffstat (limited to 'lib')
-rw-r--r--lib/efi_loader/efi_boottime.c38
-rw-r--r--lib/efi_loader/efi_image_loader.c10
2 files changed, 34 insertions, 14 deletions
diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
index 51080cbeed2..27e51a253fc 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 3262d76bcac..d4c62e677c6 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,