[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Xen-devel] [PATCH v2 18/23] efi: split out efi_exit_boot()
From: |
Konrad Rzeszutek Wilk |
Subject: |
Re: [Xen-devel] [PATCH v2 18/23] efi: split out efi_exit_boot() |
Date: |
Mon, 10 Aug 2015 15:36:08 -0400 |
User-agent: |
Mutt/1.5.23 (2014-03-12) |
On Mon, Jul 20, 2015 at 04:29:13PM +0200, Daniel Kiper wrote:
> ..which gets memory map and calls ExitBootServices(). We want to re-use this
> code to support multiboot2 protocol on EFI platforms.
>
> Signed-off-by: Daniel Kiper <address@hidden>
Reviewed-by: Konrad Rzeszutek Wilk <address@hidden>
> ---
> v2 - suggestions/fixes:
> - improve commit message
> (suggested by Jan Beulich).
> ---
> xen/common/efi/boot.c | 92
> +++++++++++++++++++++++++++----------------------
> 1 file changed, 50 insertions(+), 42 deletions(-)
>
> diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c
> index 04b9c7e..bf2f198 100644
> --- a/xen/common/efi/boot.c
> +++ b/xen/common/efi/boot.c
> @@ -879,6 +879,53 @@ static void __init
> efi_set_gop_mode(EFI_GRAPHICS_OUTPUT_PROTOCOL *gop, UINTN gop
> efi_arch_video_init(gop, info_size, mode_info);
> }
>
> +static void __init efi_exit_boot(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE
> *SystemTable)
> +{
> + EFI_STATUS status;
> + UINTN info_size = 0, map_key;
> + bool_t retry;
> +
> + efi_bs->GetMemoryMap(&info_size, NULL, &map_key,
> + &efi_mdesc_size, &mdesc_ver);
> + info_size += 8 * efi_mdesc_size;
> + efi_memmap = efi_arch_allocate_mmap_buffer(info_size);
> + if ( !efi_memmap )
> + blexit(L"Unable to allocate memory for EFI memory map");
> +
> + for ( retry = 0; ; retry = 1 )
> + {
> + efi_memmap_size = info_size;
> + status = SystemTable->BootServices->GetMemoryMap(&efi_memmap_size,
> + efi_memmap,
> &map_key,
> + &efi_mdesc_size,
> + &mdesc_ver);
> + if ( EFI_ERROR(status) )
> + PrintErrMesg(L"Cannot obtain memory map", status);
> +
> + efi_arch_process_memory_map(SystemTable, efi_memmap, efi_memmap_size,
> + efi_mdesc_size, mdesc_ver);
> +
> + efi_arch_pre_exit_boot();
> +
> + status = SystemTable->BootServices->ExitBootServices(ImageHandle,
> + map_key);
> + efi_bs = NULL;
> + if ( status != EFI_INVALID_PARAMETER || retry )
> + break;
> + }
> +
> + if ( EFI_ERROR(status) )
> + PrintErrMesg(L"Cannot exit boot services", status);
> +
> + /* Adjust pointers into EFI. */
> + efi_ct = (void *)efi_ct + DIRECTMAP_VIRT_START;
> +#ifdef USE_SET_VIRTUAL_ADDRESS_MAP
> + efi_rs = (void *)efi_rs + DIRECTMAP_VIRT_START;
> +#endif
> + efi_memmap = (void *)efi_memmap + DIRECTMAP_VIRT_START;
> + efi_fw_vendor = (void *)efi_fw_vendor + DIRECTMAP_VIRT_START;
> +}
> +
> static int __init __maybe_unused set_color(u32 mask, int bpp, u8 *pos, u8
> *sz)
> {
> if ( bpp < 0 )
> @@ -903,11 +950,11 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE
> *SystemTable)
> EFI_STATUS status;
> unsigned int i, argc;
> CHAR16 **argv, *file_name, *cfg_file_name = NULL, *options = NULL;
> - UINTN map_key, info_size, gop_mode = ~0;
> + UINTN gop_mode = ~0;
> EFI_SHIM_LOCK_PROTOCOL *shim_lock;
> EFI_GRAPHICS_OUTPUT_PROTOCOL *gop = NULL;
> union string section = { NULL }, name;
> - bool_t base_video = 0, retry;
> + bool_t base_video = 0;
> char *option_str;
> bool_t use_cfg_file;
>
> @@ -1125,46 +1172,7 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE
> *SystemTable)
>
> efi_set_gop_mode(gop, gop_mode);
>
> - info_size = 0;
> - efi_bs->GetMemoryMap(&info_size, NULL, &map_key,
> - &efi_mdesc_size, &mdesc_ver);
> - info_size += 8 * efi_mdesc_size;
> - efi_memmap = efi_arch_allocate_mmap_buffer(info_size);
> - if ( !efi_memmap )
> - blexit(L"Unable to allocate memory for EFI memory map");
> -
> - for ( retry = 0; ; retry = 1 )
> - {
> - efi_memmap_size = info_size;
> - status = SystemTable->BootServices->GetMemoryMap(&efi_memmap_size,
> - efi_memmap,
> &map_key,
> - &efi_mdesc_size,
> - &mdesc_ver);
> - if ( EFI_ERROR(status) )
> - PrintErrMesg(L"Cannot obtain memory map", status);
> -
> - efi_arch_process_memory_map(SystemTable, efi_memmap, efi_memmap_size,
> - efi_mdesc_size, mdesc_ver);
> -
> - efi_arch_pre_exit_boot();
> -
> - status = SystemTable->BootServices->ExitBootServices(ImageHandle,
> - map_key);
> - efi_bs = NULL;
> - if ( status != EFI_INVALID_PARAMETER || retry )
> - break;
> - }
> -
> - if ( EFI_ERROR(status) )
> - PrintErrMesg(L"Cannot exit boot services", status);
> -
> - /* Adjust pointers into EFI. */
> - efi_ct = (void *)efi_ct + DIRECTMAP_VIRT_START;
> -#ifdef USE_SET_VIRTUAL_ADDRESS_MAP
> - efi_rs = (void *)efi_rs + DIRECTMAP_VIRT_START;
> -#endif
> - efi_memmap = (void *)efi_memmap + DIRECTMAP_VIRT_START;
> - efi_fw_vendor = (void *)efi_fw_vendor + DIRECTMAP_VIRT_START;
> + efi_exit_boot(ImageHandle, SystemTable);
>
> efi_arch_post_exit_boot();
> for( ; ; ); /* not reached */
> --
> 1.7.10.4
>
>
> _______________________________________________
> Xen-devel mailing list
> address@hidden
> http://lists.xen.org/xen-devel
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Re: [Xen-devel] [PATCH v2 18/23] efi: split out efi_exit_boot(),
Konrad Rzeszutek Wilk <=