|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2] efi: Reallocate memory map if ExitBootServices() fails
>>> On 29.05.15 at 15:30, <ross.lagerwall@xxxxxxxxxx> wrote:
> @@ -1053,14 +1053,23 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE
> *SystemTable)
> efi_arch_video_init(gop, info_size, mode_info);
> }
>
> - efi_bs->GetMemoryMap(&efi_memmap_size, NULL, &map_key,
> - &efi_mdesc_size, &mdesc_ver);
> - efi_memmap = efi_arch_allocate_mmap_buffer(&efi_memmap_size);
> - if ( !efi_memmap )
> - blexit(L"Unable to allocate memory for EFI memory map");
> -
> for ( retry = 0; ; retry = 1 )
> {
> + efi_bs->GetMemoryMap(&memmap_size, NULL, &map_key,
> + &efi_mdesc_size, &mdesc_ver);
> + if ( memmap_size > efi_memmap_size )
> + {
> + efi_memmap_size = memmap_size + EFI_PAGE_SIZE;
I'd really like to make sure the value is a multiple of efi_mdesc_size
(i.e. simply adding EFI_PAGE_SIZE will not do). And that's leaving
aside whether the increase really needs to be that big.
> + efi_memmap = efi_arch_allocate_mmap_buffer(&efi_memmap_size);
So considering the ARM side (which this breaks) - did you try at all
the alternative of allocating a slightly larger memory map ahead of
the loop?
> + if ( !efi_memmap )
> + {
> + if ( retry )
> + PrintErr(L"Unable to allocate memory for EFI memory
> map");
> + else
> + blexit(L"Unable to allocate memory for EFI memory map");
> + }
Looking at this again (and remembering that PrintErrMesg(), as used
a few lines down, also calls blexit()), I think we should handle this
inside blexit(): If ExitBootServices() was already used enter an
infinite loop right after printing the message(s). I wonder whether,
to signal this, we shouldn't set efi_bs to NULL right after calling
ExitBootServices(), replacing the single remaining valid use with
SystemTable->BootServices->GetMemoryMap().
In no case should you allow execution to fall through here.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |