In some cases, KUT guest might fail to exit boot services due to a possible memory map update that might have taken place between efi_get_memory_map() and efi_exit_boot_services() calls. As per UEFI spec 2.10 (Section 7.4.6 EFI_BOOT_SERVICES.ExitBootServices()), we need to update the memory map and retry call to exit boot services. Signed-off-by: Pavan Kumar Paluri <papaluri@xxxxxxx> --- lib/efi.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/lib/efi.c b/lib/efi.c index 124e77685230..9d066bfad0b6 100644 --- a/lib/efi.c +++ b/lib/efi.c @@ -458,14 +458,27 @@ efi_status_t efi_main(efi_handle_t handle, efi_system_table_t *sys_tab) } #endif - /* + /* * Exit EFI boot services, let kvm-unit-tests take full control of the - * guest + * guest. */ status = efi_exit_boot_services(handle, &efi_bootinfo.mem_map); - if (status != EFI_SUCCESS) { - printf("Failed to exit boot services\n"); - goto efi_main_error; + + /* + * There is a possibility that memory map might have changed + * between efi_get_memory_map() and efi_exit_boot_services in + * which case status is EFI_INVALID_PARAMETER. As per UEFI spec + * 2.10, we need to get the updated memory map and try again. + */ + if (status == EFI_INVALID_PARAMETER) { + efi_get_memory_map(&efi_bootinfo.mem_map); + + status = efi_exit_boot_services(handle, + &efi_bootinfo.mem_map); + if (status != EFI_SUCCESS) { + printf("Failed to exit boot services\n"); + goto efi_main_error; + } } /* Set up arch-specific resources */ -- 2.34.1