diff options
Diffstat (limited to 'mem/phys.c')
-rw-r--r-- | mem/phys.c | 34 |
1 files changed, 32 insertions, 2 deletions
@@ -1,9 +1,39 @@ #include "memory.h" #include "zone.h" +#include "lib/jove.h" + +void +mem_phys_reserve(physptr_t start, physptr_t end) +{ + size_t zone = mem_zone_for(start); + size_t limit = mem_zone_bound_upper(zone); + + if(end > limit) { + mem_phys_reserve(limit, end); + end = limit; + } + mem_zone_resv(MEM_ZONE_STANDARD, start, end); +} + +void +mem_phys_release(physptr_t start, physptr_t end) +{ + size_t zone = mem_zone_for(start); + size_t limit = mem_zone_bound_upper(zone); + + if(end > limit) { + mem_phys_release(limit, end); + end = limit; + } + mem_zone_free(MEM_ZONE_STANDARD, start, end); +} physptr_t mem_phys_alloc(size_t pages) { - physptr_t ptr = mem_zone_alloc(MEM_ZONE_STANDARD, pages); - return ptr; + if(mem_zone_pages_free(MEM_ZONE_HIGHER) >= pages) + return mem_zone_alloc(MEM_ZONE_HIGHER, pages); + if(mem_zone_pages_free(MEM_ZONE_STANDARD) >= pages) + return mem_zone_alloc(MEM_ZONE_STANDARD, pages); + kpanic("Kernel ran out of physical memory!\n"); } |