From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ross Lagerwall Subject: Re: [PATCH v4] efi: Avoid calling boot services after ExitBootServices() Date: Tue, 9 Jun 2015 11:36:45 +0100 Message-ID: <5576C1BD.9020609@citrix.com> References: <1433237923-14591-1-git-send-email-ross.lagerwall@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; Format="flowed" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1433237923-14591-1-git-send-email-ross.lagerwall@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: Keir Fraser , Ian Campbell , Andrew Cooper , Tim Deegan , Stefano Stabellini , Jan Beulich List-Id: xen-devel@lists.xenproject.org ping On 06/02/2015 10:38 AM, Ross Lagerwall wrote: > After the first call to ExitBootServices(), avoid calling any boot > services by setting setting efi_bs to NULL and halting in blexit(). > > Signed-off-by: Ross Lagerwall > --- > > * Separated halt into an arch hook. > * Applies on top of the first patch from v3. > * Tested on x86, not sure if the ARM version is correct. > > xen/arch/arm/efi/efi-boot.h | 5 +++++ > xen/arch/x86/efi/efi-boot.h | 7 +++++++ > xen/common/efi/boot.c | 13 ++++++++++--- > 3 files changed, 22 insertions(+), 3 deletions(-) > > diff --git a/xen/arch/arm/efi/efi-boot.h b/xen/arch/arm/efi/efi-boot.h > index 3297f27..47efdfc 100644 > --- a/xen/arch/arm/efi/efi-boot.h > +++ b/xen/arch/arm/efi/efi-boot.h > @@ -522,6 +522,11 @@ static void __init efi_arch_blexit(void) > efi_bs->FreePool(memmap); > } > > +static void __init efi_arch_halt(void) > +{ > + stop_cpu(); > +} > + > static void __init efi_arch_load_addr_check(EFI_LOADED_IMAGE *loaded_image) > { > if ( (unsigned long)loaded_image->ImageBase & ((1 << 12) - 1) ) > diff --git a/xen/arch/x86/efi/efi-boot.h b/xen/arch/x86/efi/efi-boot.h > index cd14c19..9f41793 100644 > --- a/xen/arch/x86/efi/efi-boot.h > +++ b/xen/arch/x86/efi/efi-boot.h > @@ -614,6 +614,13 @@ static void __init efi_arch_blexit(void) > efi_bs->FreePages(ucode.addr, PFN_UP(ucode.size)); > } > > +static void __init efi_arch_halt(void) > +{ > + local_irq_disable(); > + for ( ; ; ) > + halt(); > +} > + > static void __init efi_arch_load_addr_check(EFI_LOADED_IMAGE *loaded_image) > { > xen_phys_start = (UINTN)loaded_image->ImageBase; > diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c > index 60c1b8d..4b816f2 100644 > --- a/xen/common/efi/boot.c > +++ b/xen/common/efi/boot.c > @@ -216,6 +216,9 @@ static void __init noreturn blexit(const CHAR16 *str) > PrintStr((CHAR16 *)str); > PrintStr(newline); > > + if ( !efi_bs ) > + efi_arch_halt(); > + > if ( cfg.addr ) > efi_bs->FreePages(cfg.addr, PFN_UP(cfg.size)); > if ( kernel.addr ) > @@ -1063,8 +1066,10 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) > for ( retry = 0; ; retry = 1 ) > { > efi_memmap_size = map_alloc_size; > - status = efi_bs->GetMemoryMap(&efi_memmap_size, efi_memmap, &map_key, > - &efi_mdesc_size, &mdesc_ver); > + 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); > > @@ -1073,7 +1078,9 @@ efi_start(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) > > efi_arch_pre_exit_boot(); > > - status = efi_bs->ExitBootServices(ImageHandle, map_key); > + status = SystemTable->BootServices->ExitBootServices(ImageHandle, > + map_key); > + efi_bs = NULL; > if ( status != EFI_INVALID_PARAMETER || retry ) > break; > } >