Merge tag 'signed-efi-next' of git://github.com/agraf/u-boot
authorTom Rini <trini@konsulko.com>
Tue, 4 Jul 2017 12:00:16 +0000 (08:00 -0400)
committerTom Rini <trini@konsulko.com>
Tue, 4 Jul 2017 12:00:16 +0000 (08:00 -0400)
Patch queue for efi - 2017-07-04

Highlights this time: bugfixes. With these changes, OpenBSD should
be more happy.

MAINTAINERS
cmd/bootefi.c
include/efi_api.h
lib/efi_loader/efi_boottime.c
lib/efi_loader/efi_image_loader.c

index 957e27c..85dfa14 100644 (file)
@@ -264,6 +264,7 @@ F:  test/dm/
 EFI PAYLOAD
 M:     Alexander Graf <agraf@suse.de>
 S:     Maintained
+T:     git git://github.com/agraf/u-boot.git
 F:     include/efi_loader.h
 F:     lib/efi_loader/
 F:     cmd/bootefi.c
index a0a5434..771300e 100644 (file)
@@ -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);
index 5c3836a..f071b36 100644 (file)
@@ -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;
index 51080cb..27e51a2 100644 (file)
@@ -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 = {
index 3262d76..d4c62e6 100644 (file)
@@ -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,