From: Matthias Kruk Date: Thu, 12 Dec 2019 09:33:11 +0000 (+0900) Subject: Smaller fixes to the paging code: X-Git-Url: https://git.corax.cc/?a=commitdiff_plain;h=9caa512fd4c77ecaeb0c1191bf3cb843929bc1ef;p=corax Smaller fixes to the paging code: - Make pg_dir_sbrk() return the address where the heap would start, if there is no heap - Don't map any segments but the kernel BSS and TEXT segments into process page directories --- diff --git a/kernel/arch/paging.c b/kernel/arch/paging.c index fd64607..23a36e6 100644 --- a/kernel/arch/paging.c +++ b/kernel/arch/paging.c @@ -770,6 +770,47 @@ cleanup: 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) { /* @@ -887,6 +928,17 @@ int _clone_kernel_region(pg_dir_t *kdir, region_t *reg, void *data) 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; @@ -966,6 +1018,7 @@ int _clone_kernel_region(pg_dir_t *kdir, region_t *reg, void *data) #endif /* 0 */ default: break; +#endif } return(ret_val); @@ -1454,6 +1507,12 @@ void* pg_dir_sbrk(pg_dir_t *pd, i32_t increment) } } + /* + * 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); }