Changeset View
Changeset View
Standalone View
Standalone View
stand/efi/loader/arch/arm64/exec.c
Show First 20 Lines • Show All 75 Lines • ▼ Show 20 Lines | elf64_exec(struct preloaded_file *fp) | ||||
size_t clean_size; | size_t clean_size; | ||||
struct file_metadata *md; | struct file_metadata *md; | ||||
ACPI_TABLE_RSDP *rsdp; | ACPI_TABLE_RSDP *rsdp; | ||||
Elf_Ehdr *ehdr; | Elf_Ehdr *ehdr; | ||||
char buf[24]; | char buf[24]; | ||||
int err, revision; | int err, revision; | ||||
void (*entry)(vm_offset_t); | 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 | |||||
andrew: There is no BIOS on arm64 so the second sentence could be removed. | |||||
* '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); | rsdp = efi_get_table(&acpi20_guid); | ||||
if (rsdp == NULL) { | if (rsdp == NULL) { | ||||
rsdp = efi_get_table(&acpi_guid); | rsdp = efi_get_table(&acpi_guid); | ||||
} | } | ||||
if (rsdp != NULL) { | if (rsdp != NULL) { | ||||
sprintf(buf, "0x%016llx", (unsigned long long)rsdp); | sprintf(buf, "0x%016llx", (unsigned long long)rsdp); | ||||
setenv("hint.acpi.0.rsdp", buf, 1); | setenv("hint.acpi.0.rsdp", buf, 1); | ||||
setenv("acpi.rsdp", buf, 1); | |||||
revision = rsdp->Revision; | revision = rsdp->Revision; | ||||
if (revision == 0) | if (revision == 0) | ||||
revision = 1; | revision = 1; | ||||
sprintf(buf, "%d", revision); | sprintf(buf, "%d", revision); | ||||
setenv("hint.acpi.0.revision", buf, 1); | setenv("hint.acpi.0.revision", buf, 1); | ||||
setenv("acpi.revision", buf, 1); | |||||
strncpy(buf, rsdp->OemId, sizeof(rsdp->OemId)); | strncpy(buf, rsdp->OemId, sizeof(rsdp->OemId)); | ||||
buf[sizeof(rsdp->OemId)] = '\0'; | buf[sizeof(rsdp->OemId)] = '\0'; | ||||
setenv("hint.acpi.0.oem", buf, 1); | setenv("hint.acpi.0.oem", buf, 1); | ||||
setenv("acpi.oem", buf, 1); | |||||
sprintf(buf, "0x%016x", rsdp->RsdtPhysicalAddress); | sprintf(buf, "0x%016x", rsdp->RsdtPhysicalAddress); | ||||
setenv("hint.acpi.0.rsdt", buf, 1); | setenv("hint.acpi.0.rsdt", buf, 1); | ||||
setenv("acpi.rsdt", buf, 1); | |||||
if (revision >= 2) { | if (revision >= 2) { | ||||
/* XXX extended checksum? */ | /* XXX extended checksum? */ | ||||
sprintf(buf, "0x%016llx", | sprintf(buf, "0x%016llx", | ||||
(unsigned long long)rsdp->XsdtPhysicalAddress); | (unsigned long long)rsdp->XsdtPhysicalAddress); | ||||
setenv("hint.acpi.0.xsdt", buf, 1); | setenv("hint.acpi.0.xsdt", buf, 1); | ||||
setenv("acpi.xsdt", buf, 1); | |||||
sprintf(buf, "%d", rsdp->Length); | sprintf(buf, "%d", rsdp->Length); | ||||
setenv("hint.acpi.0.xsdt_length", buf, 1); | setenv("hint.acpi.0.xsdt_length", buf, 1); | ||||
setenv("acpi.xsdt_length", buf, 1); | |||||
} | } | ||||
} | } | ||||
if ((md = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL) | if ((md = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL) | ||||
return(EFTYPE); | return(EFTYPE); | ||||
ehdr = (Elf_Ehdr *)&(md->md_data); | ehdr = (Elf_Ehdr *)&(md->md_data); | ||||
entry = efi_translate(ehdr->e_entry); | entry = efi_translate(ehdr->e_entry); | ||||
Show All 30 Lines |
There is no BIOS on arm64 so the second sentence could be removed.