mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-15 04:43:53 +00:00
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:
parent
e28932c643
commit
1066a70e14
|
@ -9,6 +9,9 @@
|
||||||
|
|
||||||
#define DEVT_HOSTDISK 1234
|
#define DEVT_HOSTDISK 1234
|
||||||
|
|
||||||
|
bool has_acpi(void);
|
||||||
|
vm_offset_t acpi_rsdp(void);
|
||||||
|
|
||||||
void do_init(void);
|
void do_init(void);
|
||||||
|
|
||||||
extern const char *hostfs_root;
|
extern const char *hostfs_root;
|
||||||
|
|
|
@ -102,6 +102,50 @@ parse_args(int argc, const char **argv)
|
||||||
return (howto);
|
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
|
int
|
||||||
main(int argc, const char **argv)
|
main(int argc, const char **argv)
|
||||||
{
|
{
|
||||||
|
@ -146,6 +190,11 @@ main(int argc, const char **argv)
|
||||||
setenv("LINES", "24", 1);
|
setenv("LINES", "24", 1);
|
||||||
setenv("usefdt", "1", 1);
|
setenv("usefdt", "1", 1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Find acpi, if it exists
|
||||||
|
*/
|
||||||
|
find_acpi();
|
||||||
|
|
||||||
interact(); /* doesn't return */
|
interact(); /* doesn't return */
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
|
|
Loading…
Reference in a new issue