Merge tag 'signed-efi-2019.01' of git://github.com/agraf/u-boot
authorTom Rini <trini@konsulko.com>
Thu, 27 Dec 2018 17:59:01 +0000 (12:59 -0500)
committerTom Rini <trini@konsulko.com>
Thu, 27 Dec 2018 17:59:01 +0000 (12:59 -0500)
Patch queue for efi v2019.01 - 2018-12-27

Three tiny last minute bug fixes:

  - Fix RTS relocation
  - Avoid read after free
  - Fix RTS data positioning (affects BBB)

lib/crc32.c
lib/efi_loader/efi_runtime.c
lib/efi_selftest/efi_selftest_block_device.c

index 71e27df78ebb91cdfc72e05d8e8ad52d7be42d8e..eee21f8d73988e6eb015a680af0dae37eec022da 100644 (file)
@@ -65,7 +65,8 @@ static void __efi_runtime make_crc_table(void)
   int n, k;
   uLong poly;          /* polynomial exclusive-or pattern */
   /* terms of polynomial defining this crc (except x^32): */
-  static const Byte p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
+  static Byte __efi_runtime_data p[] = {
+               0, 1, 2, 4, 5, 7, 8, 10, 11, 12, 16, 22, 23, 26};
 
   /* make exclusive-or pattern from polynomial (0xedb88320L) */
   poly = 0L;
index 95844efdb0e1d48216c17b627108cc93205ff7c4..fff93f0960bf3b193c4cfb5ad32af9c9fc0e3c1b 100644 (file)
@@ -436,14 +436,42 @@ static efi_status_t EFIAPI efi_set_virtual_address_map(
                        uint32_t descriptor_version,
                        struct efi_mem_desc *virtmap)
 {
-       ulong runtime_start = (ulong)&__efi_runtime_start &
-                             ~(ulong)EFI_PAGE_MASK;
        int n = memory_map_size / descriptor_size;
        int i;
+       int rt_code_sections = 0;
 
        EFI_ENTRY("%lx %lx %x %p", memory_map_size, descriptor_size,
                  descriptor_version, virtmap);
 
+       /*
+        * TODO:
+        * Further down we are cheating. While really we should implement
+        * SetVirtualAddressMap() events and ConvertPointer() to allow
+        * dynamically loaded drivers to expose runtime services, we don't
+        * today.
+        *
+        * So let's ensure we see exactly one single runtime section, as
+        * that is the built-in one. If we see more (or less), someone must
+        * have tried adding or removing to that which we don't support yet.
+        * In that case, let's better fail rather than expose broken runtime
+        * services.
+        */
+       for (i = 0; i < n; i++) {
+               struct efi_mem_desc *map = (void*)virtmap +
+                                          (descriptor_size * i);
+
+               if (map->type == EFI_RUNTIME_SERVICES_CODE)
+                       rt_code_sections++;
+       }
+
+       if (rt_code_sections != 1) {
+               /*
+                * We expose exactly one single runtime code section, so
+                * something is definitely going wrong.
+                */
+               return EFI_EXIT(EFI_INVALID_PARAMETER);
+       }
+
        /* Rebind mmio pointers */
        for (i = 0; i < n; i++) {
                struct efi_mem_desc *map = (void*)virtmap +
@@ -483,7 +511,7 @@ static efi_status_t EFIAPI efi_set_virtual_address_map(
                map = (void*)virtmap + (descriptor_size * i);
                if (map->type == EFI_RUNTIME_SERVICES_CODE) {
                        ulong new_offset = map->virtual_start -
-                                          (runtime_start - gd->relocaddr);
+                                          map->physical_start + gd->relocaddr;
 
                        efi_runtime_relocate(new_offset, map);
                        /* Once we're virtual, we can no longer handle
index d4e4fac1c74421921e56228b40c154f3f7a7bf86..f038da9f1909dc2869f666633996ec93524fda64 100644 (file)
@@ -445,11 +445,6 @@ static int execute(void)
                efi_st_error("Failed to write file\n");
                return EFI_ST_FAILURE;
        }
-       ret = file->close(file);
-       if (ret != EFI_SUCCESS) {
-               efi_st_error("Failed to close file\n");
-               return EFI_ST_FAILURE;
-       }
        ret = file->getpos(file, &pos);
        if (ret != EFI_SUCCESS) {
                efi_st_error("GetPosition failed\n");
@@ -460,6 +455,11 @@ static int execute(void)
                             (unsigned int)pos);
                return EFI_ST_FAILURE;
        }
+       ret = file->close(file);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Failed to close file\n");
+               return EFI_ST_FAILURE;
+       }
 
        /* Verify file */
        boottime->set_mem(buf, sizeof(buf), 0);