diff --git a/sys/arm/arm/machdep.c b/sys/arm/arm/machdep.c --- a/sys/arm/arm/machdep.c +++ b/sys/arm/arm/machdep.c @@ -415,14 +415,26 @@ } #ifdef FDT +static void +fdt_physmem_hardware_region_cb(const struct mem_region *mr, void *arg __unused) +{ + physmem_hardware_region(mr->mr_start, mr->mr_size); +} + +static void +fdt_physmem_exclude_region_cb(const struct mem_region *mr, void *arg __unused) +{ + physmem_exclude_region(mr->mr_start, mr->mr_size, + EXFLAG_NODUMP | EXFLAG_NOALLOC); +} + void * initarm(struct arm_boot_params *abp) { - struct mem_region mem_regions[FDT_MEM_REGIONS]; vm_paddr_t lastaddr; vm_offset_t dtbp, kernelstack, dpcpu; char *env; - int err_devmap, mem_regions_sz; + int err_devmap; phandle_t root; char dts_version[255]; #ifdef EFI @@ -469,15 +481,13 @@ #endif { /* Grab physical memory regions information from device tree. */ - if (fdt_get_mem_regions(mem_regions, &mem_regions_sz,NULL) != 0) + if (fdt_foreach_mem_region(fdt_physmem_hardware_region_cb, + NULL) != 0) panic("Cannot get physical memory regions"); - physmem_hardware_regions(mem_regions, mem_regions_sz); - /* Grab reserved memory regions information from device tree. */ - if (fdt_get_reserved_regions(mem_regions, &mem_regions_sz) == 0) - physmem_exclude_regions(mem_regions, mem_regions_sz, - EXFLAG_NODUMP | EXFLAG_NOALLOC); + fdt_foreach_reserved_region(fdt_physmem_exclude_region_cb, + NULL); } /* diff --git a/sys/arm64/arm64/machdep.c b/sys/arm64/arm64/machdep.c --- a/sys/arm64/arm64/machdep.c +++ b/sys/arm64/arm64/machdep.c @@ -722,6 +722,21 @@ return (VM_MEMATTR_DEVICE); } +#ifdef FDT +static void +fdt_physmem_hardware_region_cb(const struct mem_region *mr, void *arg __unused) +{ + physmem_hardware_region(mr->mr_start, mr->mr_size); +} + +static void +fdt_physmem_exclude_region_cb(const struct mem_region *mr, void *arg __unused) +{ + physmem_exclude_region(mr->mr_start, mr->mr_size, + EXFLAG_NODUMP | EXFLAG_NOALLOC); +} +#endif + void initarm(struct arm64_bootparams *abp) { @@ -729,8 +744,6 @@ struct pcpu *pcpup; char *env; #ifdef FDT - struct mem_region mem_regions[FDT_MEM_REGIONS]; - int mem_regions_sz; phandle_t root; char dts_version[255]; #endif @@ -781,14 +794,11 @@ #ifdef FDT else { /* Grab physical memory regions information from device tree. */ - if (fdt_get_mem_regions(mem_regions, &mem_regions_sz, + if (fdt_foreach_mem_region(fdt_physmem_hardware_region_cb, NULL) != 0) panic("Cannot get physical memory regions"); - physmem_hardware_regions(mem_regions, mem_regions_sz); } - if (fdt_get_reserved_mem(mem_regions, &mem_regions_sz) == 0) - physmem_exclude_regions(mem_regions, mem_regions_sz, - EXFLAG_NODUMP | EXFLAG_NOALLOC); + fdt_foreach_reserved_mem(fdt_physmem_exclude_region_cb, NULL); #endif /* Exclude the EFI framebuffer from our view of physical memory. */ diff --git a/sys/riscv/riscv/machdep.c b/sys/riscv/riscv/machdep.c --- a/sys/riscv/riscv/machdep.c +++ b/sys/riscv/riscv/machdep.c @@ -506,13 +506,46 @@ return (lastaddr); } +#ifdef FDT +static void +fdt_physmem_hardware_region_cb(const struct mem_region *mr, void *arg) +{ + bool *first = arg; + + physmem_hardware_region(mr->mr_start, mr->mr_size); + + if (*first) { + /* + * XXX: Unconditionally exclude the lowest 2MB of physical + * memory, as this area is assumed to contain the SBI firmware, + * and this is not properly reserved in all cases (e.g. in + * older firmware like BBL). + * + * 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. + */ + physmem_exclude_region(mr->mr_start, L2_SIZE, + EXFLAG_NODUMP | EXFLAG_NOALLOC); + *first = false; + } +} + +static void +fdt_physmem_exclude_region_cb(const struct mem_region *mr, void *arg __unused) +{ + physmem_exclude_region(mr->mr_start, mr->mr_size, + EXFLAG_NODUMP | EXFLAG_NOALLOC); +} +#endif + void initriscv(struct riscv_bootparams *rvbp) { - struct mem_region mem_regions[FDT_MEM_REGIONS]; struct efi_map_header *efihdr; struct pcpu *pcpup; - int mem_regions_sz; vm_offset_t lastaddr; vm_size_t kernlen; char *env; @@ -547,31 +580,17 @@ } #ifdef FDT else { + bool first; + /* Exclude reserved memory specified by the device tree. */ - if (fdt_get_reserved_mem(mem_regions, &mem_regions_sz) == 0) { - physmem_exclude_regions(mem_regions, mem_regions_sz, - EXFLAG_NODUMP | EXFLAG_NOALLOC); - } + fdt_foreach_reserved_mem(fdt_physmem_exclude_region_cb, NULL); /* Grab physical memory regions information from device tree. */ - if (fdt_get_mem_regions(mem_regions, &mem_regions_sz, NULL) != 0) + first = true; + if (fdt_foreach_mem_region(fdt_physmem_hardware_region_cb, + &first) != 0) panic("Cannot get physical memory regions"); - physmem_hardware_regions(mem_regions, mem_regions_sz); - /* - * XXX: Unconditionally exclude the lowest 2MB of physical - * memory, as this area is assumed to contain the SBI firmware, - * and this is not properly reserved in all cases (e.g. in - * older firmware like BBL). - * - * 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. - */ - physmem_exclude_region(mem_regions[0].mr_start, L2_SIZE, - EXFLAG_NODUMP | EXFLAG_NOALLOC); } #endif