Re: [kvm-unit-tests RFC PATCH 2/3] x86/efi: Retry call to efi exit boot services

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Mar 26, 2024 at 08:45:53AM -0500, Paluri, PavanKumar wrote:
> Hi Mike,
> 
> On 3/26/2024 8:38 AM, Michael Roth wrote:
> > On Mon, Mar 25, 2024 at 04:36:22PM -0500, Pavan Kumar Paluri wrote:
> >> 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;
> > 
> > With this change, error codes other than EFI_INVALID_PARAMETER are only
> > handled if the first failure is EFI_INVALID_PARAMETER. Need to to re-add
> > the previous handling for when the first EBS failure is something other
> > than EFI_INVALID_PARAMETER.
> > 
> But the status codes that could be returned from
> efi_exit_boot_services() are only EFI_INVALID_PARAMETER/EFI_SUCCESS [1].
> 
> [1] UEFI 2.10 Section 7.4.6.

New error codes can be added over time. Also, the block you added handles
!EFI_SUCCESS generally for the 2nd call, so for consistency it makes sense
to continue handling it similarly for the 1st call as well.

-Mike

> 
> Thanks,
> Pavan
> 
> > -Mike
> > 
> >> +
> >> +	/*
> >> +	 * 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
> >>




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux