Page MenuHomeFreeBSD

D42459.id129696.diff
No OneTemporary

D42459.id129696.diff

diff --git a/stand/efi/loader/arch/amd64/elf64_freebsd.c b/stand/efi/loader/arch/amd64/elf64_freebsd.c
--- a/stand/efi/loader/arch/amd64/elf64_freebsd.c
+++ b/stand/efi/loader/arch/amd64/elf64_freebsd.c
@@ -41,17 +41,8 @@
#include "bootstrap.h"
-#include "platform/acfreebsd.h"
-#include "acconfig.h"
-#define ACPI_SYSTEM_XFACE
-#include "actypes.h"
-#include "actbl.h"
-
#include "loader_efi.h"
-static EFI_GUID acpi_guid = ACPI_TABLE_GUID;
-static EFI_GUID acpi20_guid = ACPI_20_TABLE_GUID;
-
extern int bi_load(char *args, vm_offset_t *modulep, vm_offset_t *kernendp,
bool exit_bs);
@@ -104,9 +95,6 @@
Elf_Ehdr *ehdr;
vm_offset_t modulep, kernend, trampcode, trampstack;
int err, i;
- ACPI_TABLE_RSDP *rsdp;
- char buf[24];
- int revision;
bool copy_auto;
copy_auto = copy_staging == COPY_STAGING_AUTO;
@@ -114,38 +102,6 @@
copy_staging = fp->f_kernphys_relocatable ?
COPY_STAGING_DISABLE : COPY_STAGING_ENABLE;
- /*
- * Report the RSDP to the kernel. While this can be found with
- * a BIOS boot, the RSDP may be elsewhere when booted from UEFI.
- */
-
- rsdp = efi_get_table(&acpi20_guid);
- if (rsdp == NULL) {
- rsdp = efi_get_table(&acpi_guid);
- }
- if (rsdp != NULL) {
- sprintf(buf, "0x%016llx", (unsigned long long)rsdp);
- setenv("acpi.rsdp", buf, 1);
- revision = rsdp->Revision;
- if (revision == 0)
- revision = 1;
- sprintf(buf, "%d", revision);
- setenv("acpi.revision", buf, 1);
- strncpy(buf, rsdp->OemId, sizeof(rsdp->OemId));
- buf[sizeof(rsdp->OemId)] = '\0';
- setenv("acpi.oem", buf, 1);
- sprintf(buf, "0x%016x", rsdp->RsdtPhysicalAddress);
- setenv("acpi.rsdt", buf, 1);
- if (revision >= 2) {
- /* XXX extended checksum? */
- sprintf(buf, "0x%016llx",
- (unsigned long long)rsdp->XsdtPhysicalAddress);
- setenv("acpi.xsdt", buf, 1);
- sprintf(buf, "%d", rsdp->Length);
- setenv("acpi.xsdt_length", buf, 1);
- }
- }
-
if ((md = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL)
return (EFTYPE);
ehdr = (Elf_Ehdr *)&(md->md_data);
diff --git a/stand/efi/loader/arch/arm64/exec.c b/stand/efi/loader/arch/arm64/exec.c
--- a/stand/efi/loader/arch/arm64/exec.c
+++ b/stand/efi/loader/arch/arm64/exec.c
@@ -40,16 +40,6 @@
#include "loader_efi.h"
#include "cache.h"
-#include "platform/acfreebsd.h"
-#include "acconfig.h"
-#define ACPI_SYSTEM_XFACE
-#define ACPI_USE_SYSTEM_INTTYPES
-#include "actypes.h"
-#include "actbl.h"
-
-static EFI_GUID acpi_guid = ACPI_TABLE_GUID;
-static EFI_GUID acpi20_guid = ACPI_20_TABLE_GUID;
-
static int elf64_exec(struct preloaded_file *amp);
static int elf64_obj_exec(struct preloaded_file *amp);
@@ -73,52 +63,10 @@
vm_offset_t clean_addr;
size_t clean_size;
struct file_metadata *md;
- ACPI_TABLE_RSDP *rsdp;
Elf_Ehdr *ehdr;
- char buf[24];
- int err, revision;
+ int err;
void (*entry)(vm_offset_t);
- /*
- * Report the RSDP to the kernel. The old code used the 'hints' method
- * to communicate this to the kernel, but this is now considered legacy.
- * Instead, move to setting different tunables that start with acpi.
- * The old 'hints' can be removed before we branch for FreeBSD 15.
- */
-
- rsdp = efi_get_table(&acpi20_guid);
- if (rsdp == NULL) {
- rsdp = efi_get_table(&acpi_guid);
- }
- if (rsdp != NULL) {
- sprintf(buf, "0x%016llx", (unsigned long long)rsdp);
- setenv("hint.acpi.0.rsdp", buf, 1);
- setenv("acpi.rsdp", buf, 1);
- revision = rsdp->Revision;
- if (revision == 0)
- revision = 1;
- sprintf(buf, "%d", revision);
- setenv("hint.acpi.0.revision", buf, 1);
- setenv("acpi.revision", buf, 1);
- strncpy(buf, rsdp->OemId, sizeof(rsdp->OemId));
- buf[sizeof(rsdp->OemId)] = '\0';
- setenv("hint.acpi.0.oem", buf, 1);
- setenv("acpi.oem", buf, 1);
- sprintf(buf, "0x%016x", rsdp->RsdtPhysicalAddress);
- setenv("hint.acpi.0.rsdt", buf, 1);
- setenv("acpi.rsdt", buf, 1);
- if (revision >= 2) {
- /* XXX extended checksum? */
- sprintf(buf, "0x%016llx",
- (unsigned long long)rsdp->XsdtPhysicalAddress);
- setenv("hint.acpi.0.xsdt", buf, 1);
- setenv("acpi.xsdt", buf, 1);
- sprintf(buf, "%d", rsdp->Length);
- setenv("hint.acpi.0.xsdt_length", buf, 1);
- setenv("acpi.xsdt_length", buf, 1);
- }
- }
-
if ((md = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL)
return(EFTYPE);
diff --git a/stand/efi/loader/main.c b/stand/efi/loader/main.c
--- a/stand/efi/loader/main.c
+++ b/stand/efi/loader/main.c
@@ -60,6 +60,12 @@
#include "efizfs.h"
#include "framebuffer.h"
+#include "platform/acfreebsd.h"
+#include "acconfig.h"
+#define ACPI_SYSTEM_XFACE
+#include "actypes.h"
+#include "actbl.h"
+
#include "loader_efi.h"
struct arch_switch archsw; /* MI/MD interface boundary */
@@ -896,6 +902,39 @@
return ((caddr_t)x);
}
+static void
+acpi_detect(void)
+{
+ ACPI_TABLE_RSDP *rsdp;
+ char buf[24];
+ int revision;
+
+ if ((rsdp = efi_get_table(&acpi20)) == NULL)
+ if ((rsdp = efi_get_table(&acpi)) == NULL)
+ return;
+
+ sprintf(buf, "0x%016llx", (unsigned long long)rsdp);
+ setenv("acpi.rsdp", buf, 1);
+ revision = rsdp->Revision;
+ if (revision == 0)
+ revision = 1;
+ sprintf(buf, "%d", revision);
+ setenv("acpi.revision", buf, 1);
+ strncpy(buf, rsdp->OemId, sizeof(rsdp->OemId));
+ buf[sizeof(rsdp->OemId)] = '\0';
+ setenv("acpi.oem", buf, 1);
+ sprintf(buf, "0x%016x", rsdp->RsdtPhysicalAddress);
+ setenv("acpi.rsdt", buf, 1);
+ if (revision >= 2) {
+ /* XXX extended checksum? */
+ sprintf(buf, "0x%016llx",
+ (unsigned long long)rsdp->XsdtPhysicalAddress);
+ setenv("acpi.xsdt", buf, 1);
+ sprintf(buf, "%d", rsdp->Length);
+ setenv("acpi.xsdt_length", buf, 1);
+ }
+}
+
EFI_STATUS
main(int argc, CHAR16 *argv[])
{
@@ -942,6 +981,9 @@
/* Get our loaded image protocol interface structure. */
(void) OpenProtocolByHandle(IH, &imgid, (void **)&boot_img);
+ /* Report the RSDP early. */
+ acpi_detect();
+
/*
* Chicken-and-egg problem; we want to have console output early, but
* some console attributes may depend on reading from eg. the boot
diff --git a/stand/lua/core.lua b/stand/lua/core.lua
--- a/stand/lua/core.lua
+++ b/stand/lua/core.lua
@@ -32,6 +32,7 @@
local core = {}
+local default_acpi = false
local default_safe_mode = false
local default_single_user = false
local default_verbose = false
@@ -46,20 +47,14 @@
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 @@
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)
@@ -358,7 +353,7 @@
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)
@@ -441,10 +436,6 @@
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
--- a/stand/lua/core.lua.8
+++ b/stand/lua/core.lua.8
@@ -68,7 +68,7 @@
.Pp
The following menu entry type constants are defined in
.Nm :
-.Bl -tag -width MENU_CAROUSEL_ENTRY -compact -offset indent
+.Bl -tag -width MENU_RETURN -compact -offset indent
.It Ic MENU_RETURN
Return to the parent menu.
.It Ic MENU_ENTRY
@@ -90,7 +90,7 @@
.Ss Exported functions
The following functions are exported from
.Nm :
-.Bl -tag -width core.getACPIPresent -offset indent
+.Bl -tag -width core.setVerbose -offset indent
.It Fn core.setVerbose verbose
Sets or unsets
.Ev boot_verbose .
@@ -103,15 +103,14 @@
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 ,
@@ -202,9 +201,6 @@
.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
--- a/stand/lua/menu.lua
+++ b/stand/lua/menu.lua
@@ -176,7 +176,7 @@
-- acpi
{
entry_type = core.MENU_ENTRY,
- visible = core.isSystem386,
+ visible = core.hasACPI,
name = function()
return OnOff(color.highlight("A") ..
"CPI :", core.acpi)

File Metadata

Mime Type
text/plain
Expires
Sat, May 23, 9:32 AM (14 h, 17 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33444471
Default Alt Text
D42459.id129696.diff (10 KB)

Event Timeline