Get reserved memory regions and exclude them from available memory map
This commit is contained in:
parent
1d1ffd9efb
commit
c5a5698ccd
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=243691
@ -1144,7 +1144,9 @@ physmap_init(struct mem_region *availmem_regions, int availmem_regions_sz)
|
||||
void *
|
||||
initarm(struct arm_boot_params *abp)
|
||||
{
|
||||
struct mem_region memory_regions[FDT_MEM_REGIONS];
|
||||
struct mem_region availmem_regions[FDT_MEM_REGIONS];
|
||||
struct mem_region reserved_regions[FDT_MEM_REGIONS];
|
||||
struct pv_addr kernel_l1pt;
|
||||
struct pv_addr dpcpu;
|
||||
vm_offset_t dtbp, freemempos, l2_start, lastaddr;
|
||||
@ -1154,7 +1156,12 @@ initarm(struct arm_boot_params *abp)
|
||||
void *kmdp;
|
||||
u_int l1pagetable;
|
||||
int i = 0, j = 0, err_devmap = 0;
|
||||
int memory_regions_sz;
|
||||
int availmem_regions_sz;
|
||||
int reserved_regions_sz;
|
||||
vm_offset_t start, end;
|
||||
vm_offset_t rstart, rend;
|
||||
int curr;
|
||||
|
||||
lastaddr = parse_boot_param(abp);
|
||||
memsize = 0;
|
||||
@ -1185,10 +1192,73 @@ initarm(struct arm_boot_params *abp)
|
||||
while (1);
|
||||
|
||||
/* Grab physical memory regions information from device tree. */
|
||||
if (fdt_get_mem_regions(availmem_regions, &availmem_regions_sz,
|
||||
if (fdt_get_mem_regions(memory_regions, &memory_regions_sz,
|
||||
&memsize) != 0)
|
||||
while(1);
|
||||
|
||||
/* Grab physical memory regions information from device tree. */
|
||||
if (fdt_get_reserved_regions(reserved_regions, &reserved_regions_sz) != 0)
|
||||
reserved_regions_sz = 0;
|
||||
|
||||
/*
|
||||
* Now exclude all the reserved regions
|
||||
*/
|
||||
curr = 0;
|
||||
for (i = 0; i < memory_regions_sz; i++) {
|
||||
start = memory_regions[i].mr_start;
|
||||
end = start + memory_regions[i].mr_size;
|
||||
for (j = 0; j < reserved_regions_sz; j++) {
|
||||
rstart = reserved_regions[j].mr_start;
|
||||
rend = rstart + reserved_regions[j].mr_size;
|
||||
/*
|
||||
* Restricted region is before available
|
||||
* Skip restricted region
|
||||
*/
|
||||
if (rend <= start)
|
||||
continue;
|
||||
/*
|
||||
* Restricted region is behind available
|
||||
* No further processing required
|
||||
*/
|
||||
if (rstart >= end)
|
||||
break;
|
||||
/*
|
||||
* Restricted region includes memory region
|
||||
* skip availble region
|
||||
*/
|
||||
if ((start >= rstart) && (rend >= end)) {
|
||||
start = rend;
|
||||
end = rend;
|
||||
break;
|
||||
}
|
||||
/*
|
||||
* Memory region includes restricted region
|
||||
*/
|
||||
if ((rstart > start) && (end > rend)) {
|
||||
availmem_regions[curr].mr_start = start;
|
||||
availmem_regions[curr++].mr_size = rstart - start;
|
||||
start = rend;
|
||||
break;
|
||||
}
|
||||
/*
|
||||
* Memory region partially overlaps with restricted
|
||||
*/
|
||||
if ((rstart >= start) && (rstart <= end)) {
|
||||
end = rstart;
|
||||
}
|
||||
else if ((rend >= start) && (rend <= end)) {
|
||||
start = rend;
|
||||
}
|
||||
}
|
||||
|
||||
if (end > start) {
|
||||
availmem_regions[curr].mr_start = start;
|
||||
availmem_regions[curr++].mr_size = end - start;
|
||||
}
|
||||
}
|
||||
|
||||
availmem_regions_sz = curr;
|
||||
|
||||
/* Platform-specific initialisation */
|
||||
pmap_bootstrap_lastaddr = initarm_lastaddr();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user