loader: Set preferred kenv for acpi.rsdp on arm64
Several years ago, x86 moved from using hints to communicate this information to using the simpler acpi.rsdp variables. If one compiles static hints into the kernel, then these hints are ignored. We can remove this when we branch FreeBSD 15. Thought about BURN_BRIDGES here, but it's too messy. Sponsored by: Netflix Reviewed by: andrew, jhb Differential Revision: https://reviews.freebsd.org/D35632
This commit is contained in:
parent
064f00ec27
commit
37a3df3d61
@ -81,6 +81,15 @@ elf64_exec(struct preloaded_file *fp)
|
||||
int err, revision;
|
||||
void (*entry)(vm_offset_t);
|
||||
|
||||
/*
|
||||
* Report the RSDP to the kernel. The old code used the 'hints' method
|
||||
* to communite this to the kernel. However, while convenient, the
|
||||
* 'hints' method is fragile and does not work when static hints are
|
||||
* compiled into the kernel. 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);
|
||||
@ -88,23 +97,29 @@ elf64_exec(struct preloaded_file *fp)
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user