]> git.corax.cc Git - corax/commitdiff
Smaller fixes to the paging code:
authorMatthias Kruk <m@m10k.eu>
Thu, 12 Dec 2019 09:33:11 +0000 (18:33 +0900)
committerMatthias Kruk <m@m10k.eu>
Thu, 12 Dec 2019 09:33:11 +0000 (18:33 +0900)
 - 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

kernel/arch/paging.c

index fd6460787eee4bfb5159790ec87b6ae1deb048d5..23a36e666742d98b1c1567cf6a2ec221b3b442be 100644 (file)
@@ -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);
        }