/* * Install the SMBIOS table as a configuration table. * * @return status code */ efi_status_t efi_smbios_register(void) { /* Map within the low 32 bits, to allow for 32bit SMBIOS tables */ u64 dmi_addr = U32_MAX; efi_status_t ret; void *dmi; /* Reserve 4kiB page for SMBIOS */ ret = efi_allocate_pages(EFI_ALLOCATE_MAX_ADDRESS, EFI_RUNTIME_SERVICES_DATA, 1, &dmi_addr); if (ret != EFI_SUCCESS) { /* Could not find space in lowmem, use highmem instead */ ret = efi_allocate_pages(EFI_ALLOCATE_ANY_PAGES, EFI_RUNTIME_SERVICES_DATA, 1, &dmi_addr); if (ret != EFI_SUCCESS) return ret; } /* * Generate SMBIOS tables - we know that efi_allocate_pages() returns * a 4k-aligned address, so it is safe to assume that * write_smbios_table() will write the table at that address. * * Note that on sandbox, efi_allocate_pages() unfortunately returns a * pointer even though it uses a uint64_t type. Convert it. */ assert(!(dmi_addr & 0xf)); dmi = (void *)(uintptr_t)dmi_addr; write_smbios_table(map_to_sysmem(dmi)); /* And expose them to our EFI payload */ return efi_install_configuration_table(&smbios_guid, dmi); }
void efi_smbios_register(void) { /* Map within the low 32 bits, to allow for 32bit SMBIOS tables */ uint64_t dmi = 0xffffffff; /* Reserve 4kb for SMBIOS */ uint64_t pages = 1; int memtype = EFI_RUNTIME_SERVICES_DATA; if (efi_allocate_pages(1, memtype, pages, &dmi) != EFI_SUCCESS) return; /* Generate SMBIOS tables */ write_smbios_table(dmi); /* And expose them to our EFI payload */ efi_install_configuration_table(&smbios_guid, (void*)(uintptr_t)dmi); }
static void *copy_fdt(void *fdt) { u64 fdt_size = fdt_totalsize(fdt); unsigned long fdt_ram_start = -1L, fdt_pages; u64 new_fdt_addr; void *new_fdt; int i; for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) { u64 ram_start = gd->bd->bi_dram[i].start; u64 ram_size = gd->bd->bi_dram[i].size; if (!ram_size) continue; if (ram_start < fdt_ram_start) fdt_ram_start = ram_start; } /* Give us at least 4kb breathing room */ fdt_size = ALIGN(fdt_size + 4096, 4096); fdt_pages = fdt_size >> EFI_PAGE_SHIFT; /* Safe fdt location is at 128MB */ new_fdt_addr = fdt_ram_start + (128 * 1024 * 1024) + fdt_size; if (efi_allocate_pages(1, EFI_BOOT_SERVICES_DATA, fdt_pages, &new_fdt_addr) != EFI_SUCCESS) { /* If we can't put it there, put it somewhere */ new_fdt_addr = (ulong)memalign(4096, fdt_size); } new_fdt = (void*)(ulong)new_fdt_addr; memcpy(new_fdt, fdt, fdt_totalsize(fdt)); fdt_set_totalsize(new_fdt, fdt_size); return new_fdt; }