return(ret_val);
}
+static void* _pg_dir_heap_start(pg_dir_t *pd)
+{
+ u32_t ret_val;
+ int i;
+
+ for(i = 0, ret_val = (u32_t)-1; i < CONFIG_PAGING_DIR_MAXREGIONS; i++) {
+ struct region *reg;
+ u32_t limit;
+
+ reg = pd->pd_regions[i];
+
+ switch(reg->reg_type) {
+ case REGION_HEAP:
+ ret_val = (u32_t)reg->reg_base;
+ i = CONFIG_PAGING_DIR_MAXREGIONS;
+
+ break;
+
+ case REGION_TEXT:
+ case REGION_BSS:
+ case REGION_DATA:
+ case REGION_RODATA:
+ limit = ALIGN((u32_t)reg->reg_base + reg->reg_size,
+ reg->reg_pgsize);
+
+ if(limit > ret_val) {
+ ret_val = limit;
+ }
+
+ break;
+
+ default:
+ case REGION_STACK:
+ case REGION_KSTACK:
+ break;
+ }
+ }
+
+ return((void*)ret_val);
+}
+
static int _pg_dir_heap_map(pg_dir_t *pd, u32_t heap_size)
{
/*
dir = (pg_dir_t*)data;
switch(reg->reg_type) {
+ case REGION_TEXT:
+ case REGION_BSS:
+ ret_val = pg_dir_map_region(dir, kdir, reg);
+ break;
+
+ default:
+ /* don't map anything else */
+ ret_val = 0;
+ break;
+
+#if 0
case REGION_DATA:
ret_val = pg_dir_clone_region(dir, kdir, reg);
break;
#endif /* 0 */
default:
break;
+#endif
}
return(ret_val);
}
}
+ /*
+ * If we're still here, we should return the address where
+ * the program break would have been if there was a heap.
+ */
+ ret_val = _pg_dir_heap_start(pd);
+
return(ret_val);
}