Merge branch 'efi/queue' into 'master'
A couple EFI fixes
See merge request kvm-unit-tests/kvm-unit-tests!55
diff --git a/lib/efi.c b/lib/efi.c
index 5314eaa..4433783 100644
--- a/lib/efi.c
+++ b/lib/efi.c
@@ -204,6 +204,7 @@
return (char *)cmdline_addr;
}
+#if defined(__aarch64__) || defined(__riscv)
/*
* Open the file and read it into a buffer.
*/
@@ -330,6 +331,12 @@
return fdt_check_header(fdt) == 0 ? fdt : NULL;
}
+#else
+static void *efi_get_fdt(efi_handle_t handle, struct efi_loaded_image_64 *image)
+{
+ return NULL;
+}
+#endif
static const struct {
struct efi_vendor_dev_path vendor;
@@ -399,8 +406,8 @@
efi_system_table = sys_tab;
/* Memory map struct values */
- efi_memory_desc_t *map = NULL;
- unsigned long map_size = 0, desc_size = 0, key = 0, buff_size = 0;
+ efi_memory_desc_t *map;
+ unsigned long map_size, desc_size, key, buff_size;
u32 desc_ver;
/* Helper variables needed to get the cmdline */
@@ -439,13 +446,6 @@
efi_bootinfo.mem_map.key_ptr = &key;
efi_bootinfo.mem_map.buff_size = &buff_size;
- /* Get EFI memory map */
- status = efi_get_memory_map(&efi_bootinfo.mem_map);
- if (status != EFI_SUCCESS) {
- printf("Failed to get memory map\n");
- goto efi_main_error;
- }
-
#ifdef __riscv
status = efi_get_boot_hartid();
if (status != EFI_SUCCESS) {
@@ -454,11 +454,22 @@
}
#endif
- /*
- * Exit EFI boot services, let kvm-unit-tests take full control of the
- * guest
- */
- status = efi_exit_boot_services(handle, &efi_bootinfo.mem_map);
+ status = EFI_INVALID_PARAMETER;
+ while (status == EFI_INVALID_PARAMETER) {
+ status = efi_get_memory_map(&efi_bootinfo.mem_map);
+ if (status != EFI_SUCCESS) {
+ printf("Failed to get memory map\n");
+ goto efi_main_error;
+ }
+ /*
+ * Exit EFI boot services, let kvm-unit-tests take full
+ * control of the guest.
+ */
+ status = efi_exit_boot_services(handle, &efi_bootinfo.mem_map);
+ if (status == EFI_INVALID_PARAMETER)
+ efi_free_pool(*efi_bootinfo.mem_map.map);
+ }
+
if (status != EFI_SUCCESS) {
printf("Failed to exit boot services\n");
goto efi_main_error;