git: 16c09de80135 - stable/14 - loader: improve lua ACPI detection and handling

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

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

commit 16c09de801353a3e88addd9c43966fc8e01b2822
Author:     R. Christian McDonald <rcm@FreeBSD.org>
AuthorDate: 2023-11-20 17:13:08 +0000
Commit:     Warner Losh <imp@FreeBSD.org>
CommitDate: 2024-04-16 02:32:04 +0000

    loader: improve lua ACPI detection and handling
    
    This is a follow-up patch to https://reviews.freebsd.org/D42459
    that modifies the loader lua to use the correct loader variables
    for determining ACPI availability.
    
    This also fixes a bug where ACPI can be inadvertently disabled when
    setting System Defaults at the loader menu.
    
    Reviewed by:    imp, kevans
    Approved by:    kp
    Sponsored by:   Rubicon Communications, LLC ("Netgate")
    Differential Revision:  https://reviews.freebsd.org/D42483
    
    (cherry picked from commit e0f3dc82727f236b0bea495d8a4d6e6dc630854d)
---
 stand/lua/core.lua   | 39 +++++++++++++++------------------------
 stand/lua/core.lua.8 | 22 +++++++++-------------
 stand/lua/menu.lua   |  2 +-
 3 files changed, 25 insertions(+), 38 deletions(-)

diff --git a/stand/lua/core.lua b/stand/lua/core.lua
index 747f8c1f0fcf..3bbdca3de01e 100644
--- a/stand/lua/core.lua
+++ b/stand/lua/core.lua
@@ -32,6 +32,7 @@ local hook = require("hook")
 
 local core = {}
 
+local default_acpi = false
 local default_safe_mode = false
 local default_single_user = false
 local default_verbose = false
@@ -46,20 +47,14 @@ local function composeLoaderCmd(cmd_name, argstr)
 end
 
 local function recordDefaults()
-	-- On i386, hint.acpi.0.rsdp will be set before we're loaded. On !i386,
-	-- it will generally be set upon execution of the kernel. Because of
-	-- this, we can't (or don't really want to) detect/disable ACPI on !i386
-	-- reliably. Just set it enabled if we detect it and leave well enough
-	-- alone if we don't.
-	local boot_acpi = core.isSystem386() and core.getACPIPresent(false)
 	local boot_single = loader.getenv("boot_single") or "no"
 	local boot_verbose = loader.getenv("boot_verbose") or "no"
+
+	default_acpi = core.getACPI()
 	default_single_user = boot_single:lower() ~= "no"
 	default_verbose = boot_verbose:lower() ~= "no"
 
-	if boot_acpi then
-		core.setACPI(true)
-	end
+	core.setACPI(default_acpi)
 	core.setSingleUser(default_single_user)
 	core.setVerbose(default_verbose)
 end
@@ -137,18 +132,18 @@ function core.setSingleUser(single_user)
 	core.su = single_user
 end
 
-function core.getACPIPresent(checking_system_defaults)
-	local c = loader.getenv("hint.acpi.0.rsdp")
+function core.hasACPI()
+	return loader.getenv("acpi.rsdp") ~= nil
+end
 
-	if c ~= nil then
-		if checking_system_defaults then
-			return true
-		end
-		-- Otherwise, respect disabled if it's set
-		c = loader.getenv("hint.acpi.0.disabled")
-		return c == nil or tonumber(c) ~= 1
+function core.getACPI()
+	if not core.hasACPI() then
+		return false
 	end
-	return false
+
+	-- Otherwise, respect disabled if it's set
+	local c = loader.getenv("hint.acpi.0.disabled")
+	return c == nil or tonumber(c) ~= 1
 end
 
 function core.setACPI(acpi)
@@ -378,7 +373,7 @@ function core.loadEntropy()
 end
 
 function core.setDefaults()
-	core.setACPI(core.getACPIPresent(true))
+	core.setACPI(default_acpi)
 	core.setSafeMode(default_safe_mode)
 	core.setSingleUser(default_single_user)
 	core.setVerbose(default_verbose)
@@ -470,10 +465,6 @@ function core.isSerialBoot()
 	return false
 end
 
-function core.isSystem386()
-	return loader.machine_arch == "i386"
-end
-
 -- Is the menu skipped in the environment in which we've booted?
 function core.isMenuSkipped()
 	return string.lower(loader.getenv("beastie_disable") or "") == "yes"
diff --git a/stand/lua/core.lua.8 b/stand/lua/core.lua.8
index e1752475f942..cb52ae9f1b30 100644
--- a/stand/lua/core.lua.8
+++ b/stand/lua/core.lua.8
@@ -90,7 +90,7 @@ constants.
 .Ss Exported functions
 The following functions are exported from
 .Nm :
-.Bl -tag -width core.getACPIPresent -offset indent
+.Bl -tag -width core.setSingleUser -offset indent
 .It Fn core.setVerbose verbose
 Sets or unsets
 .Ev boot_verbose .
@@ -103,15 +103,14 @@ Sets or unsets
 If
 .Fa singleUser
 is omitted, toggle the current single user setting.
-.It Fn core.getACPIPresent checkingSystemDefaults
-Check whether ACPI is present.
-This will only be accurate for i386-compatible loaders, including non-UEFI
-loaders on amd64 systems.
-If
-.Fa checkingSystemDefaults
-is true, ignore the current value of
-.Ev hint.acpi.0.disabled .
-Otherwise, return true only if ACPI is both present and not disabled.
+.It Fn core.getACPI
+Return true if ACPI is both present and not explicitly disabled by
+.Ev hints.acpi.0.disabled .
+.It Fn core.hasACPI
+Checks whether ACPI support is present.
+This requires the loader to probe the system and set
+.Ev acpi.rsdp
+early before starting the interpreter.
 .It Fn core.setACPI acpi
 Sets or unsets
 .Ev acpi_load ,
@@ -209,9 +208,6 @@ This checks
 .Ev boot_serial ,
 and
 .Ev boot_multicons .
-.It Fn core.isSystem386
-Returns true if this bootloader was compiled as an i386 binary.
-This generally applies to i386 loaders as well as non-UEFI loaders on amd64.
 .It Fn core.deepCopyTable tbl
 Recursively deep copies
 .Fa tbl
diff --git a/stand/lua/menu.lua b/stand/lua/menu.lua
index 7da03ad9e673..4a948acf8241 100644
--- a/stand/lua/menu.lua
+++ b/stand/lua/menu.lua
@@ -176,7 +176,7 @@ menu.boot_options = {
 		-- acpi
 		{
 			entry_type = core.MENU_ENTRY,
-			visible = core.isSystem386,
+			visible = core.hasACPI,
 			name = function()
 				return OnOff(color.highlight("A") ..
 				    "CPI       :", core.acpi)