Index: sys/arm64/arm64/machdep.c =================================================================== --- sys/arm64/arm64/machdep.c (revision 292455) +++ sys/arm64/arm64/machdep.c (working copy) @@ -766,8 +766,19 @@ try_load_dtb(caddr_t kmdp) { vm_offset_t dtbp; + struct mem_region mem_regions[FDT_MEM_REGIONS]; + uint32_t memsize; /* XXX: fdt_get_mem_regions() can't handle 64-bit */ + int i, mem_regions_sz; dtbp = MD_FETCH(kmdp, MODINFOMD_DTBP, vm_offset_t); +#ifdef FDT_DTB_STATIC + /* + * If the device tree blob was not retrieved from metadata, + * try to use the statically embedded one. + */ + if (dtbp == (vm_offset_t)NULL) + dtbp = (vm_offset_t)&fdt_static_dtb; +#endif if (dtbp == (vm_offset_t)NULL) { printf("ERROR loading DTB\n"); return; @@ -778,6 +789,19 @@ if (OF_init((void *)dtbp) != 0) panic("OF_init failed with the found device tree"); + + /* Grab physical memory regions information from device tree. */ + if (fdt_get_mem_regions(mem_regions, &mem_regions_sz, &memsize) != 0) { + printf("No physical memory regions in DTB\n"); + return; + } + + for (i = 0; i < mem_regions_sz; i++) { + if (!add_physmap_entry(mem_regions[i].mr_start, + mem_regions[i].mr_size, physmap, + &physmap_idx)) + break; + } } #endif @@ -822,10 +846,6 @@ boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int); kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *); -#ifdef FDT - try_load_dtb(kmdp); -#endif - /* Find the address to start allocating from */ lastaddr = MD_FETCH(kmdp, MODINFOMD_KERNEND, vm_offset_t); @@ -833,8 +853,13 @@ physmap_idx = 0; efihdr = (struct efi_map_header *)preload_search_info(kmdp, MODINFO_METADATA | MODINFOMD_EFI_MAP); - add_efi_map_entries(efihdr, physmap, &physmap_idx); + if (efihdr != NULL) + add_efi_map_entries(efihdr, physmap, &physmap_idx); +#ifdef FDT + try_load_dtb(kmdp); +#endif + /* Print the memory map */ mem_len = 0; for (i = 0; i < physmap_idx; i += 2) {