efi_loader: update runtime services table crc32
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Sun, 29 Jul 2018 07:49:04 +0000 (09:49 +0200)
committerAlexander Graf <agraf@suse.de>
Mon, 20 Aug 2018 12:43:12 +0000 (14:43 +0200)
The crc32 of the runtime services table must be updated after detaching.

efi_update_table_header_crc32() must be __efi_runtime. So move it to
efi_runtime.c

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Signed-off-by: Alexander Graf <agraf@suse.de>
include/efi_loader.h
lib/efi_loader/efi_boottime.c
lib/efi_loader/efi_runtime.c

index 57ca550272629482e713ae84e027d0636c5afe8d..f162adfff7e21a69dab8f931d1cb01ba1824ffe2 100644 (file)
@@ -417,6 +417,9 @@ static inline int guidcmp(const efi_guid_t *g1, const efi_guid_t *g2)
 #define __efi_runtime_data __attribute__ ((section (".data.efi_runtime")))
 #define __efi_runtime __attribute__ ((section (".text.efi_runtime")))
 
+/* Update CRC32 in table header */
+void __efi_runtime efi_update_table_header_crc32(struct efi_table_hdr *table);
+
 /* Call this with mmio_ptr as the _pointer_ to a pointer to an MMIO region
  * to make it available at runtime */
 efi_status_t efi_add_runtime_mmio(void *mmio_ptr, u64 len);
index 1192bdb5f5fa1f60631d95e9be7c7a93a3cc567f..3935e4f1ce9b4c297fec50c7e666a16e08c968e7 100644 (file)
@@ -153,18 +153,6 @@ const char *__efi_nesting_dec(void)
        return indent_string(--nesting_level);
 }
 
-/**
- * efi_update_table_header_crc32() - Update CRC32 in table header
- *
- * @table:     EFI table
- */
-static void efi_update_table_header_crc32(struct efi_table_hdr *table)
-{
-       table->crc32 = 0;
-       table->crc32 = crc32(0, (const unsigned char *)table,
-                            table->headersize);
-}
-
 /**
  * efi_queue_event() - queue an EFI event
  * @event:     event to signal
index 45b7809decc12a3af43662cf56e86c64c1dbb85a..633e4cc3e513ca92b579fa6b0706002351886bf3 100644 (file)
@@ -84,6 +84,18 @@ struct elf_rela {
  * handle a good number of runtime callbacks
  */
 
+/**
+ * efi_update_table_header_crc32() - Update crc32 in table header
+ *
+ * @table:     EFI table
+ */
+void __efi_runtime efi_update_table_header_crc32(struct efi_table_hdr *table)
+{
+       table->crc32 = 0;
+       table->crc32 = crc32(0, (const unsigned char *)table,
+                            table->headersize);
+}
+
 static void EFIAPI efi_reset_system_boottime(
                        enum efi_reset_type reset_type,
                        efi_status_t reset_status,
@@ -273,6 +285,9 @@ static void efi_runtime_detach(ulong offset)
                debug("%s: Setting %p to %lx\n", __func__, p, newaddr);
                *p = newaddr;
        }
+
+       /* Update crc32 */
+       efi_update_table_header_crc32(&efi_runtime_services.hdr);
 }
 
 /* Relocate EFI runtime to uboot_reloc_base = offset */