#include "memory.h" #include "zone.h" #include "jove.h" void pm_reserve(physptr_t start, physptr_t end) { size_t zone = pm_zone_for(start); size_t limit = pm_zone_bound_upper(zone); if(end > limit) { pm_reserve(limit, end); end = limit; } pm_zone_resv(MEM_ZONE_STANDARD, start, end); } void pm_release(physptr_t start, physptr_t end) { size_t zone = pm_zone_for(start); size_t limit = pm_zone_bound_upper(zone); if(end > limit) { pm_release(limit, end); end = limit; } pm_zone_free(MEM_ZONE_STANDARD, start, end); } physptr_t pm_alloc(size_t pages) { if(pm_zone_pages_free(MEM_ZONE_HIGHER) >= pages) return pm_zone_alloc(MEM_ZONE_HIGHER, pages); if(pm_zone_pages_free(MEM_ZONE_STANDARD) >= pages) return pm_zone_alloc(MEM_ZONE_STANDARD, pages); kpanic("Kernel ran out of physical memory!\n"); }