Index: sys/riscv/riscv/machdep.c =================================================================== --- sys/riscv/riscv/machdep.c +++ sys/riscv/riscv/machdep.c @@ -84,6 +84,7 @@ #include #include #include +#include #include #include #include @@ -827,9 +828,19 @@ #ifdef FDT try_load_dtb(kmdp); + /* + * Exclude reserved memory specified by the device tree. Typically, + * this contains an entry for memory used by the runtime SBI firmware. + */ + if (fdt_get_reserved_mem(mem_regions, &mem_regions_sz) == 0) { + physmem_exclude_regions(mem_regions, mem_regions_sz, + EXFLAG_NODUMP | EXFLAG_NOALLOC); + } + /* Grab physical memory regions information from device tree. */ - if (fdt_get_mem_regions(mem_regions, &mem_regions_sz, NULL) != 0) + if (fdt_get_mem_regions(mem_regions, &mem_regions_sz, NULL) != 0) { panic("Cannot get physical memory regions"); + } physmem_hardware_regions(mem_regions, mem_regions_sz); #endif @@ -844,6 +855,22 @@ physmem_init_kernel_globals(); +#ifdef FDT + /* + * XXX: Exclude the lowest 2MB of physical memory, if it hasn't been + * already, as this area is assumed to contain the SBI firmware. This + * is a little fragile, but it is consistent with the platforms we + * support so far. + * + * TODO: remove this when the all regular booting methods properly + * report their reserved memory in the device tree. + */ + if (mem_regions[0].mr_start == physmap[0]) { + physmem_exclude_region(mem_regions[0].mr_start, L2_SIZE, + EXFLAG_NODUMP | EXFLAG_NOALLOC); + } +#endif + /* Establish static device mappings */ devmap_bootstrap(0, NULL);