git: 77d298ea3fb1 - stable/14 - loader: lua: assume late ACPI detection if the feature isn't enabled

From: Warner Losh <imp_at_FreeBSD.org>
Date: Tue, 16 Apr 2024 02:34:51 UTC
The branch stable/14 has been updated by imp:

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

commit 77d298ea3fb1ba6789afe6cd0c4946a4c392a66c
Author:     Kyle Evans <kevans@FreeBSD.org>
AuthorDate: 2023-12-08 21:36:06 +0000
Commit:     Warner Losh <imp@FreeBSD.org>
CommitDate: 2024-04-16 02:32:05 +0000

    loader: lua: assume late ACPI detection if the feature isn't enabled
    
    While we're here, enable the feature in the places we detect ACPI.  This
    lets us side-step the existing issues and provide a path forward for
    folks upgrading from previous releases that haven't updated their ESP
    yet.
    
    Let's also fix core.setACPI: the hint already indicates that the
    user's disabled it more consistently than loader.acpi_disabled_by_user.
    Even more, the latter is wrong because we set it by default if we did
    not detect ACPI.  The ACPI hint remains even when we're setting defaults
    because ACPI loaded into the kernel will make some noise if it's not
    hinted off, even when we didn't detect it.
    
    imp notes that this will result in some relatively harmless noise on
    platforms that don't support ACPI but aren't using the UEFI loader, as
    we would enable the ACPI module for loading on them and then loader
    would not be able to find it.  These are non-fatal, but should probably
    be fixed by just declaring support for EARLY_ACPI in those loaders since
    we know they won't have ACPI early on -- punting on this for the time
    being, though, in favor of providing a safer upgrade path sooner.
    
    Reviewed by:    imp
    Differential Revision:  https://reviews.freebsd.org/D42727
    
    (cherry picked from commit e183039f0882009c455c3b59fe1ab58a4fd25a5e)
---
 stand/efi/loader/main.c       |  1 +
 stand/i386/libi386/biosacpi.c |  2 ++
 stand/lua/core.lua            | 21 +++++++++++----------
 3 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/stand/efi/loader/main.c b/stand/efi/loader/main.c
index 4100c0680b7f..d7cffe5f6df9 100644
--- a/stand/efi/loader/main.c
+++ b/stand/efi/loader/main.c
@@ -914,6 +914,7 @@ acpi_detect(void)
 	char buf[24];
 	int revision;
 
+	feature_enable(FEATURE_EARLY_ACPI);
 	if ((rsdp = efi_get_table(&acpi20)) == NULL)
 		if ((rsdp = efi_get_table(&acpi)) == NULL)
 			return;
diff --git a/stand/i386/libi386/biosacpi.c b/stand/i386/libi386/biosacpi.c
index f94e8684c970..fcad64d81549 100644
--- a/stand/i386/libi386/biosacpi.c
+++ b/stand/i386/libi386/biosacpi.c
@@ -54,6 +54,8 @@ biosacpi_detect(void)
     char		buf[24];
     int			revision;
 
+    feature_enable(FEATURE_EARLY_ACPI);
+
     /* locate and validate the RSDP */
     if ((rsdp = biosacpi_find_rsdp()) == NULL)
 	return;
diff --git a/stand/lua/core.lua b/stand/lua/core.lua
index 65b91cd8f63e..9226de564348 100644
--- a/stand/lua/core.lua
+++ b/stand/lua/core.lua
@@ -133,17 +133,20 @@ function core.setSingleUser(single_user)
 end
 
 function core.hasACPI()
-	return loader.getenv("acpi.rsdp") ~= nil
-end
+	-- We can't trust acpi.rsdp to be set if the loader binary doesn't do
+	-- ACPI detection early enough.  UEFI loader historically didn't, so
+	-- we'll fallback to assuming ACPI is enabled if this binary does not
+	-- declare that it probes for ACPI early enough
+	if loader.getenv("acpi.rsdp") ~= nil then
+		return true
+	end
 
-function core.isX86()
-	return loader.machine_arch == "i386" or loader.machine_arch == "amd64"
+	return not core.hasFeature("EARLY_ACPI")
 end
 
 function core.getACPI()
 	if not core.hasACPI() then
-		-- x86 requires ACPI pretty much
-		return false or core.isX86()
+		return false
 	end
 
 	-- Otherwise, respect disabled if it's set
@@ -157,13 +160,11 @@ function core.setACPI(acpi)
 	end
 
 	if acpi then
-		loader.setenv("acpi_load", "YES")
+		config.enableModule("acpi")
 		loader.setenv("hint.acpi.0.disabled", "0")
-		loader.unsetenv("loader.acpi_disabled_by_user")
 	else
-		loader.unsetenv("acpi_load")
+		config.disableModule("acpi")
 		loader.setenv("hint.acpi.0.disabled", "1")
-		loader.setenv("loader.acpi_disabled_by_user", "1")
 	end
 	core.acpi = acpi
 end