* [PATCH] efi: Avoid calling boot services after ExitBootServices()
@ 2015-06-09 15:06 Ross Lagerwall
2015-06-09 15:55 ` Ian Campbell
0 siblings, 1 reply; 2+ messages in thread
From: Ross Lagerwall @ 2015-06-09 15:06 UTC (permalink / raw)
To: xen-devel
Cc: Keir Fraser, Ian Campbell, Andrew Cooper, Tim Deegan,
Ross Lagerwall, Stefano Stabellini, Jan Beulich
After the first call to ExitBootServices(), avoid calling any boot
services (except GetMemoryMap() and ExitBootServices()) by setting
setting efi_bs to NULL and halting in blexit(). Only GetMemoryMap() and
ExitBootServices() are explicitly allowed to be called after the first
call to ExitBootServices() and so are are called via
SystemTable->BootServices.
Signed-off-by: Ross Lagerwall <ross.lagerwall@citrix.com>
---
Change in V5: Clarify commit message.
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;
}
--
2.1.0
^ permalink raw reply related [flat|nested] 2+ messages in thread* Re: [PATCH] efi: Avoid calling boot services after ExitBootServices()
2015-06-09 15:06 [PATCH] efi: Avoid calling boot services after ExitBootServices() Ross Lagerwall
@ 2015-06-09 15:55 ` Ian Campbell
0 siblings, 0 replies; 2+ messages in thread
From: Ian Campbell @ 2015-06-09 15:55 UTC (permalink / raw)
To: Ross Lagerwall
Cc: Keir Fraser, Andrew Cooper, Tim Deegan, xen-devel,
Stefano Stabellini, Jan Beulich
On Tue, 2015-06-09 at 16:06 +0100, Ross Lagerwall wrote:
> After the first call to ExitBootServices(), avoid calling any boot
> services (except GetMemoryMap() and ExitBootServices()) by setting
> setting efi_bs to NULL and halting in blexit(). Only GetMemoryMap() and
> ExitBootServices() are explicitly allowed to be called after the first
> call to ExitBootServices() and so are are called via
> SystemTable->BootServices.
>
> Signed-off-by: Ross Lagerwall <ross.lagerwall@citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2015-06-09 15:55 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-06-09 15:06 [PATCH] efi: Avoid calling boot services after ExitBootServices() Ross Lagerwall
2015-06-09 15:55 ` Ian Campbell
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.