if (!efi_enabled(EFI_MEMMAP) && !efi_enabled(EFI_PARAVIRT)) return;
pr_debug("esrt-init: loading.\n"); if (!esrt_table_exists()) return;
rc = efi_mem_desc_lookup(efi.esrt, &md); if (rc < 0 ||
(!(md.attribute & EFI_MEMORY_RUNTIME) &&
md.type != EFI_BOOT_SERVICES_DATA &&
md.type != EFI_RUNTIME_SERVICES_DATA &&
md.type != EFI_ACPI_RECLAIM_MEMORY &&
md.type != EFI_ACPI_MEMORY_NVS)) {
pr_warn("ESRT header is not in the memory map.\n"); return;
}
max = efi_mem_desc_end(&md) - efi.esrt;
size = sizeof(*esrt);
if (max < size) {
pr_err("ESRT header doesn't fit on single memory map entry. (size: %zu max: %zu)\n",
size, max); return;
}
va = early_memremap(efi.esrt, size); if (!va) {
pr_err("early_memremap(%p, %zu) failed.\n", (void *)efi.esrt,
size); return;
}
memcpy(&tmpesrt, va, sizeof(tmpesrt));
early_memunmap(va, size);
if (tmpesrt.fw_resource_version != 1) {
pr_err("Unsupported ESRT version %lld.\n",
tmpesrt.fw_resource_version); return;
}
entry_size = sizeof(struct efi_system_resource_entry_v1); if (tmpesrt.fw_resource_count > 0 && max - size < entry_size) {
pr_err("ESRT memory map entry can only hold the header. (max: %zu size: %zu)\n",
max - size, entry_size); return;
}
/* *Theformatdoesn'treallygiveusanyboundarytotesthere, *soI'mmakingup128asthemaxnumberofindividuallyupdatable *componentswesupport. *128shouldbeprettyexcessive,butthere'sstillsomechance *somebodywilldothatsomedayandwe'llneedtoraisethis.
*/ if (tmpesrt.fw_resource_count > 128) {
pr_err("ESRT says fw_resource_count has very large value %d.\n",
tmpesrt.fw_resource_count); return;
}
/* *Weknowitcan'tbelargerthanN*sizeof()here,andNislimited *bytheprevioustesttoasmallnumber,sothere'snooverflow.
*/
entries_size = tmpesrt.fw_resource_count * entry_size; if (max < size + entries_size) {
pr_err("ESRT does not fit on single memory map entry (size: %zu max: %zu)\n",
size, max); return;
}
end = esrt_data + size;
pr_info("Reserving ESRT space from %pa to %pa.\n", &esrt_data, &end); if (md.type == EFI_BOOT_SERVICES_DATA)
efi_mem_reserve(esrt_data, esrt_data_size);
pr_debug("esrt-init: loaded.\n");
}
staticint __init register_entries(void)
{ struct efi_system_resource_entry_v1 *v1_entries = (void *)esrt->entries; int i, rc;
if (!esrt_table_exists()) return0;
for (i = 0; i < le32_to_cpu(esrt->fw_resource_count); i++) { void *esre = NULL; if (esrt->fw_resource_version == 1) {
esre = &v1_entries[i];
} else {
pr_err("Unsupported ESRT version %lld.\n",
esrt->fw_resource_version); return -EINVAL;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.