kboot: Need to find the ACPI tables

We need to pass the ACPI tables to the laucnhed kernel (at least for x86
and aarch64). Find it using the Linux standard way.

Sponsored by:		Netflix
This commit is contained in:
Warner Losh 2022-12-08 21:56:06 -07:00
parent e28932c643
commit 1066a70e14
2 changed files with 52 additions and 0 deletions

View File

@ -9,6 +9,9 @@
#define DEVT_HOSTDISK 1234
bool has_acpi(void);
vm_offset_t acpi_rsdp(void);
void do_init(void);
extern const char *hostfs_root;

View File

@ -102,6 +102,50 @@ parse_args(int argc, const char **argv)
return (howto);
}
static vm_offset_t rsdp;
static vm_offset_t
kboot_rsdp_from_efi(void)
{
char buffer[512 + 1];
char *walker, *ep;
if (!file2str("/sys/firmware/efi/systab", buffer, sizeof(buffer)))
return (0); /* Not an EFI system */
ep = buffer + strlen(buffer);
walker = buffer;
while (walker < ep) {
if (strncmp("ACPI20=", walker, 7) == 0)
return((vm_offset_t)strtoull(walker + 7, NULL, 0));
if (strncmp("ACPI=", walker, 5) == 0)
return((vm_offset_t)strtoull(walker + 5, NULL, 0));
walker += strcspn(walker, "\n");
}
return (0);
}
static void
find_acpi()
{
rsdp = kboot_rsdp_from_efi();
#if 0 /* maybe for amd64 */
if (rsdp == 0)
rsdp = find_rsdp_arch();
#endif
}
vm_offset_t
acpi_rsdp()
{
return (rsdp);
}
bool
has_acpi()
{
return rsdp != 0;
}
int
main(int argc, const char **argv)
{
@ -146,6 +190,11 @@ main(int argc, const char **argv)
setenv("LINES", "24", 1);
setenv("usefdt", "1", 1);
/*
* Find acpi, if it exists
*/
find_acpi();
interact(); /* doesn't return */
return (0);