// SPDX-License-Identifier: GPL-2.0 /* * Support for extracting embedded firmware for peripherals from EFI code, * * Copyright (c) 2018 Hans de Goede <hdegoede@redhat.com>
*/
/* Exported for use by lib/test_firmware.c only */
LIST_HEAD(efi_embedded_fw_list);
EXPORT_SYMBOL_NS_GPL(efi_embedded_fw_list, "TEST_FIRMWARE"); bool efi_embedded_fw_checked;
EXPORT_SYMBOL_NS_GPL(efi_embedded_fw_checked, "TEST_FIRMWARE");
/* * Note the efi_check_for_embedded_firmwares() code currently makes the * following 2 assumptions. This may needs to be revisited if embedded firmware * is found where this is not true: * 1) The firmware is only found in EFI_BOOT_SERVICES_CODE memory segments * 2) The firmware always starts at an offset which is a multiple of 8 bytes
*/ staticint __init efi_check_md_for_embedded_firmware(
efi_memory_desc_t *md, conststruct efi_embedded_fw_desc *desc)
{ struct efi_embedded_fw *fw;
u8 hash[32];
u64 i, size;
u8 *map;
size = md->num_pages << EFI_PAGE_SHIFT;
map = memremap(md->phys_addr, size, MEMREMAP_WB); if (!map) {
pr_err("Error mapping EFI mem at %#llx\n", md->phys_addr); return -ENOMEM;
}
for (i = 0; (i + desc->length) <= size; i += 8) { if (memcmp(map + i, desc->prefix, EFI_EMBEDDED_FW_PREFIX_LEN)) continue;
sha256(map + i, desc->length, hash); if (memcmp(hash, desc->sha256, 32) == 0) break;
} if ((i + desc->length) > size) {
memunmap(map); return -ENOENT;
}
void __init efi_check_for_embedded_firmwares(void)
{ conststruct efi_embedded_fw_desc *fw_desc; conststruct dmi_system_id *dmi_id;
efi_memory_desc_t *md; int i, r;
for (i = 0; embedded_fw_table[i]; i++) {
dmi_id = dmi_first_match(embedded_fw_table[i]); if (!dmi_id) continue;
fw_desc = dmi_id->driver_data;
/* * In some drivers the struct driver_data contains may contain * other driver specific data after the fw_desc struct; and * the fw_desc struct itself may be empty, skip these.
*/ if (!fw_desc->name) continue;
for_each_efi_memory_desc(md) { if (md->type != EFI_BOOT_SERVICES_CODE) continue;
r = efi_check_md_for_embedded_firmware(md, fw_desc); if (r == 0) break;
}
}
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.