svn commit: r243691 - head/sys/arm/arm
Oleksandr Tymoshenko
gonzo at FreeBSD.org
Fri Nov 30 03:11:03 UTC 2012
Author: gonzo
Date: Fri Nov 30 03:11:03 2012
New Revision: 243691
URL: http://svnweb.freebsd.org/changeset/base/243691
Log:
Get reserved memory regions and exclude them from available memory map
Modified:
head/sys/arm/arm/machdep.c
Modified: head/sys/arm/arm/machdep.c
==============================================================================
--- head/sys/arm/arm/machdep.c Fri Nov 30 03:08:49 2012 (r243690)
+++ head/sys/arm/arm/machdep.c Fri Nov 30 03:11:03 2012 (r243691)
@@ -1144,7 +1144,9 @@ physmap_init(struct mem_region *availmem
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();
More information about the svn-src-head
mailing list