mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
efi: avoid calling boot services after ExitBootServices()
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. Suggested-by: Jan Beulich <jbeulich@suse.com> Signed-off-by: Ross Lagerwall <ross.lagerwall@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com> Acked-by: Ian Campbell <ian.campbell@citrix.com>
This commit is contained in:
1 parent
7c9a93a013
commit
d4300db3a0
3 files changed
+23
-3
No files matched your search
@@ -6,6 +6,7 @@
|
||||
#include <xen/device_tree.h>
|
||||
#include <xen/libfdt/libfdt.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/smp.h>
|
||||
|
||||
void noreturn efi_xen_start(void *fdt_ptr, uint32_t fdt_size);
|
||||
|
||||
@@ -522,6 +523,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) )
|
||||
|
||||
@@ -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;
|
||||
|
||||
+10
-3
@@ -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;
|
||||
}
|
||||
|
||||