Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 26 Jun 2022 08:25:36 GMT
From:      Toomas Soome <tsoome@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: c8e7050f8a6a - stable/13 - efi: switch boot_services_gone to boot_services_active
Message-ID:  <202206260825.25Q8Pav5077703@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by tsoome:

URL: https://cgit.FreeBSD.org/src/commit/?id=c8e7050f8a6a061f6331f13da0d3ef02c3463b53

commit c8e7050f8a6a061f6331f13da0d3ef02c3463b53
Author:     Warner Losh <imp@FreeBSD.org>
AuthorDate: 2021-11-04 15:34:20 +0000
Commit:     Toomas Soome <tsoome@FreeBSD.org>
CommitDate: 2022-06-26 04:58:55 +0000

    efi: switch boot_services_gone to boot_services_active
    
    Turn the presence or absence of boot services into a positive bool (and
    change its type to bool). Move declaration to efi.h in the global
    variables section.
    
    Sponsored by:           Netflix
    
    Reviewed by:    tsoome, kib
    Differential Revision:  https://reviews.freebsd.org/D31814
    
    (cherry picked from commit 305ef653bcf349c7dea83c90add6f2d97910e545)
---
 stand/common/gfx_fb.c          | 10 ++++++----
 stand/efi/include/efi.h        |  2 ++
 stand/efi/libefi/efi_console.c | 23 +++++++++++------------
 stand/efi/loader/bootinfo.c    |  4 +---
 stand/efi/loader/copy.c        |  4 +---
 5 files changed, 21 insertions(+), 22 deletions(-)

diff --git a/stand/common/gfx_fb.c b/stand/common/gfx_fb.c
index 14524820bea4..b80e9c565944 100644
--- a/stand/common/gfx_fb.c
+++ b/stand/common/gfx_fb.c
@@ -783,14 +783,16 @@ gfxfb_blt(void *BltBuffer, GFXFB_BLT_OPERATION BltOperation,
 #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
index fe8d78286529..7e44a5b819fc 100644
--- a/stand/efi/include/efi.h
+++ b/stand/efi/include/efi.h
@@ -60,11 +60,13 @@ Revision History
 #include "efitcp.h"
 #include "efipoint.h"
 #include "efiuga.h"
+#include <sys/types.h>
 
 /*
  * 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
index 1a264b9821f8..7166b7a3cfbe 100644
--- a/stand/efi/libefi/efi_console.c
+++ b/stand/efi/libefi/efi_console.c
@@ -37,14 +37,15 @@ __FBSDID("$FreeBSD$");
 #include <framebuffer.h>
 #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 @@ efi_text_cursor(void *arg, const teken_pos_t *p)
 	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_text_putchar(void *s, const teken_pos_t *p, teken_char_t c,
 	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 @@ efi_text_fill(void *arg, const teken_rect_t *r, teken_char_t c,
 	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 @@ efi_text_copy(void *arg, const teken_rect_t *r, const teken_pos_t *p)
 	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 @@ efi_text_param(void *arg, int cmd, unsigned int value)
 {
 	teken_gfx_t *state = arg;
 
-	if (boot_services_gone)
+	if (!boot_services_active)
 		return;
 
 	switch (cmd) {
@@ -749,6 +750,8 @@ get_arg(int c)
 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
@@ -756,9 +759,6 @@ efi_term_emu(int c)
 	int t, i;
 	EFI_STATUS status;
  
-	if (boot_services_gone)
-		return;
-
 	switch (esc) {
 	case 0:
 		switch (c) {
@@ -868,8 +868,7 @@ efi_term_emu(int c)
 		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
index 92ca220e2bf9..4bf13d1760ff 100644
--- a/stand/efi/loader/bootinfo.c
+++ b/stand/efi/loader/bootinfo.c
@@ -64,8 +64,6 @@ int bi_load(char *args, vm_offset_t *modulep, vm_offset_t *kernendp);
 
 extern EFI_SYSTEM_TABLE	*ST;
 
-int boot_services_gone;
-
 static int
 bi_getboothowto(char *kargs)
 {
@@ -397,7 +395,7 @@ bi_load_efi_data(struct preloaded_file *kfp)
 
 		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
index 2552ae86d966..47e613ccc2f3 100644
--- a/stand/efi/loader/copy.c
+++ b/stand/efi/loader/copy.c
@@ -42,8 +42,6 @@ __FBSDID("$FreeBSD$");
 #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 <machine/cpufunc.h>
 #include <machine/specialreg.h>
@@ -370,7 +368,7 @@ efi_check_space(vm_offset_t end)
 	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 "



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202206260825.25Q8Pav5077703>