diff --git a/stand/common/gfx_fb.c b/stand/common/gfx_fb.c --- a/stand/common/gfx_fb.c +++ b/stand/common/gfx_fb.c @@ -751,14 +751,16 @@ #if defined(EFI) EFI_STATUS status; EFI_GRAPHICS_OUTPUT *gop = gfx_state.tg_private; - extern int boot_services_gone; EFI_TPL tpl; /* - * We assume Blt() does work, if not, we will need to build - * exception list case by case. + * We assume Blt() does work, if not, we will need to build exception + * list case by case. We only have boot services during part of our + * exectution. Once terminate boot services, these operations cannot be + * done as they are provided by protocols that disappear when exit + * boot services. */ - if (gop != NULL && boot_services_gone == 0) { + if (gop != NULL && boot_services_active) { tpl = BS->RaiseTPL(TPL_NOTIFY); switch (BltOperation) { case GfxFbBltVideoFill: diff --git a/stand/efi/include/efi.h b/stand/efi/include/efi.h --- a/stand/efi/include/efi.h +++ b/stand/efi/include/efi.h @@ -60,11 +60,13 @@ #include "efitcp.h" #include "efipoint.h" #include "efiuga.h" +#include /* * Global variables */ extern EFI_LOADED_IMAGE *boot_img; +extern bool boot_services_active; /* * FreeBSD UUID diff --git a/stand/efi/libefi/efi_console.c b/stand/efi/libefi/efi_console.c --- a/stand/efi/libefi/efi_console.c +++ b/stand/efi/libefi/efi_console.c @@ -37,14 +37,15 @@ #include #include "bootstrap.h" -extern int boot_services_gone; extern EFI_GUID gop_guid; + +bool boot_services_active = true; /* boot services active first thing in main */ + static EFI_GUID simple_input_ex_guid = EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID; static SIMPLE_TEXT_OUTPUT_INTERFACE *conout; static SIMPLE_INPUT_INTERFACE *conin; static EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *coninex; static bool efi_started; - static int mode; /* Does ConOut have serial console? */ static uint32_t utf8_left; @@ -177,7 +178,7 @@ teken_gfx_t *state = arg; UINTN col, row; - if (boot_services_gone) + if (!boot_services_active) return; row = p->tp_row; @@ -238,7 +239,7 @@ EFI_STATUS status; int idx; - if (boot_services_gone) + if (!boot_services_active) return; idx = p->tp_col + p->tp_row * state->tg_tp.tp_col; @@ -258,7 +259,7 @@ teken_gfx_t *state = arg; teken_pos_t p; - if (boot_services_gone) + if (!boot_services_active) return; if (state->tg_cursor_visible) @@ -313,7 +314,7 @@ int nrow, ncol, x, y; /* Has to be signed - >= 0 comparison */ bool scroll = false; - if (boot_services_gone) + if (!boot_services_active) return; /* @@ -369,7 +370,7 @@ { teken_gfx_t *state = arg; - if (boot_services_gone) + if (!boot_services_active) return; switch (cmd) { @@ -739,6 +740,8 @@ static void efi_term_emu(int c) { + if (!boot_services_active) + return; #ifdef TERM_EMU static int ansi_col[] = { 0, 4, 2, 6, 1, 5, 3, 7 @@ -746,9 +749,6 @@ int t, i; EFI_STATUS status; - if (boot_services_gone) - return; - switch (esc) { case 0: switch (c) { @@ -858,8 +858,7 @@ break; } #else - if (!boot_services_gone) - efi_cons_rawputchar(c); + efi_cons_rawputchar(c); #endif } diff --git a/stand/efi/loader/bootinfo.c b/stand/efi/loader/bootinfo.c --- a/stand/efi/loader/bootinfo.c +++ b/stand/efi/loader/bootinfo.c @@ -63,8 +63,6 @@ int bi_load(char *args, vm_offset_t *modulep, vm_offset_t *kernendp, bool exit_bs); -int boot_services_gone; - static int bi_getboothowto(char *kargs) { @@ -397,7 +395,7 @@ break; status = BS->ExitBootServices(IH, efi_mapkey); if (!EFI_ERROR(status)) { - boot_services_gone = 1; + boot_services_active = false; break; } } diff --git a/stand/efi/loader/copy.c b/stand/efi/loader/copy.c --- a/stand/efi/loader/copy.c +++ b/stand/efi/loader/copy.c @@ -42,8 +42,6 @@ #define M(x) ((x) * 1024 * 1024) #define G(x) (1UL * (x) * 1024 * 1024 * 1024) -extern int boot_services_gone; - #if defined(__i386__) || defined(__amd64__) #include #include @@ -370,7 +368,7 @@ if (end + staging_slop <= staging_end) return (true); - if (boot_services_gone) { + if (!boot_services_active) { if (end <= staging_end) return (true); panic("efi_check_space: cannot expand staging area "