summaryrefslogtreecommitdiffstats
path: root/mem/phys.c
diff options
context:
space:
mode:
Diffstat (limited to 'mem/phys.c')
-rw-r--r--mem/phys.c34
1 files changed, 32 insertions, 2 deletions
diff --git a/mem/phys.c b/mem/phys.c
index 00f3531..bf56b77 100644
--- a/mem/phys.c
+++ b/mem/phys.c
@@ -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");
}