Skip to content

Commit 0fb3424

Browse files
committed
stand/efi/loader: Move ACPI RSDP detection
1 parent 4a65dc9 commit 0fb3424

File tree

4 files changed

+113
-40
lines changed

4 files changed

+113
-40
lines changed

stand/efi/acpica/acpi_detect.c

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*-
2+
* Copyright (c) 2014 Ed Maste <[email protected]>
3+
* Copyright (c) 2025 Kayla Powell <[email protected]>
4+
* All rights reserved.
5+
*
6+
* Redistribution and use in source and binary forms, with or without
7+
* modification, are permitted provided that the following conditions
8+
* are met:
9+
* 1. Redistributions of source code must retain the above copyright
10+
* notice, this list of conditions and the following disclaimer.
11+
* 2. Redistributions in binary form must reproduce the above copyright
12+
* notice, this list of conditions and the following disclaimer in the
13+
* documentation and/or other materials provided with the distribution.
14+
*
15+
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16+
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18+
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21+
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22+
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23+
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24+
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25+
* SUCH DAMAGE.
26+
*/
27+
28+
#include <machine/_inttypes.h>
29+
#include <efi.h>
30+
#include <acpi.h>
31+
#include "acpi_detect.h"
32+
33+
/* For ACPI rsdp discovery. */
34+
EFI_GUID acpi = ACPI_TABLE_GUID;
35+
EFI_GUID acpi20 = ACPI_20_TABLE_GUID;
36+
ACPI_TABLE_RSDP *rsdp;
37+
38+
void
39+
acpi_detect(void)
40+
{
41+
char buf[24];
42+
int revision;
43+
44+
feature_enable(FEATURE_EARLY_ACPI);
45+
if ((rsdp = efi_get_table(&acpi20)) == NULL)
46+
if ((rsdp = efi_get_table(&acpi)) == NULL)
47+
return;
48+
49+
sprintf(buf, "0x%016"PRIxPTR, (uintptr_t)rsdp);
50+
setenv("acpi.rsdp", buf, 1);
51+
revision = rsdp->Revision;
52+
if (revision == 0)
53+
revision = 1;
54+
sprintf(buf, "%d", revision);
55+
setenv("acpi.revision", buf, 1);
56+
strncpy(buf, rsdp->OemId, sizeof(rsdp->OemId));
57+
buf[sizeof(rsdp->OemId)] = '\0';
58+
setenv("acpi.oem", buf, 1);
59+
sprintf(buf, "0x%016x", rsdp->RsdtPhysicalAddress);
60+
setenv("acpi.rsdt", buf, 1);
61+
if (revision >= 2) {
62+
/* XXX extended checksum? */
63+
sprintf(buf, "0x%016llx",
64+
(unsigned long long)rsdp->XsdtPhysicalAddress);
65+
setenv("acpi.xsdt", buf, 1);
66+
sprintf(buf, "%d", rsdp->Length);
67+
setenv("acpi.xsdt_length", buf, 1);
68+
}
69+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright (c) 2025 Kayla Powell <[email protected]>
3+
* All rights reserved.
4+
*
5+
* Redistribution and use in source and binary forms, with or without
6+
* modification, are permitted provided that the following conditions
7+
* are met:
8+
* 1. Redistributions of source code must retain the above copyright
9+
* notice, this list of conditions and the following disclaimer.
10+
* 2. Redistributions in binary form must reproduce the above copyright
11+
* notice, this list of conditions and the following disclaimer in the
12+
* documentation and/or other materials provided with the distribution.
13+
*
14+
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15+
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17+
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20+
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21+
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22+
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23+
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24+
* SUCH DAMAGE.
25+
*/
26+
27+
#ifndef ACPI_DETECT_H
28+
#define ACPI_DETECT_H
29+
30+
#include <efi.h>
31+
#include <efilib.h>
32+
33+
struct ACPI_TABLE_RSDP; // forward declaration
34+
35+
extern EFI_GUID acpi;
36+
extern EFI_GUID acpi20;
37+
extern ACPI_TABLE_RSDP *rsdp;
38+
39+
void acpi_detect(void);
40+
41+
#endif

stand/efi/loader/Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ SRCS= autoload.c \
3131
8x16.c
3232

3333
# ACPICA Loader Initialization
34+
SRCS+= acpi_detect.c
35+
.PATH: ${.CURDIR}/../acpica
36+
3437
SRCS+= OsdMemory.c osunixxf.c
3538

3639
.PATH: ${.CURDIR}/../acpica/amd64/Osd

stand/efi/loader/main.c

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,6 @@ struct arch_switch archsw = { /* MI/MD interface boundary */
8585
.arch_zfs_probe = efi_zfs_probe,
8686
};
8787

88-
EFI_GUID acpi = ACPI_TABLE_GUID;
89-
EFI_GUID acpi20 = ACPI_20_TABLE_GUID;
9088
EFI_GUID devid = DEVICE_PATH_PROTOCOL;
9189
EFI_GUID imgid = LOADED_IMAGE_PROTOCOL;
9290
EFI_GUID mps = MPS_TABLE_GUID;
@@ -122,11 +120,6 @@ UINT16 boot_current;
122120
*/
123121
EFI_LOADED_IMAGE *boot_img;
124122

125-
/*
126-
* RSDP base table.
127-
*/
128-
ACPI_TABLE_RSDP *rsdp;
129-
130123
static bool
131124
has_keyboard(void)
132125
{
@@ -1131,39 +1124,6 @@ ptov(uintptr_t x)
11311124
return ((caddr_t)x);
11321125
}
11331126

1134-
static void
1135-
acpi_detect(void)
1136-
{
1137-
char buf[24];
1138-
int revision;
1139-
1140-
feature_enable(FEATURE_EARLY_ACPI);
1141-
if ((rsdp = efi_get_table(&acpi20)) == NULL)
1142-
if ((rsdp = efi_get_table(&acpi)) == NULL)
1143-
return;
1144-
1145-
sprintf(buf, "0x%016"PRIxPTR, (uintptr_t)rsdp);
1146-
setenv("acpi.rsdp", buf, 1);
1147-
revision = rsdp->Revision;
1148-
if (revision == 0)
1149-
revision = 1;
1150-
sprintf(buf, "%d", revision);
1151-
setenv("acpi.revision", buf, 1);
1152-
strncpy(buf, rsdp->OemId, sizeof(rsdp->OemId));
1153-
buf[sizeof(rsdp->OemId)] = '\0';
1154-
setenv("acpi.oem", buf, 1);
1155-
sprintf(buf, "0x%016x", rsdp->RsdtPhysicalAddress);
1156-
setenv("acpi.rsdt", buf, 1);
1157-
if (revision >= 2) {
1158-
/* XXX extended checksum? */
1159-
sprintf(buf, "0x%016llx",
1160-
(unsigned long long)rsdp->XsdtPhysicalAddress);
1161-
setenv("acpi.xsdt", buf, 1);
1162-
sprintf(buf, "%d", rsdp->Length);
1163-
setenv("acpi.xsdt_length", buf, 1);
1164-
}
1165-
}
1166-
11671127
static void
11681128
efi_smbios_detect(void)
11691129
{

0 commit comments

Comments
 (0)