summaryrefslogtreecommitdiff
path: root/src/memory/physalloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/memory/physalloc.c')
-rw-r--r--src/memory/physalloc.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/memory/physalloc.c b/src/memory/physalloc.c
index 1140258..bcbc66d 100644
--- a/src/memory/physalloc.c
+++ b/src/memory/physalloc.c
@@ -1,3 +1,4 @@
+#include "serial.h"
#include <memory.h>
#include <stdint.h>
#include <lib.h>
@@ -63,6 +64,10 @@ static inline bool bitmap_get(int i) {
}
static inline void bitmap_set(int i, bool v) {
+ if (v)
+ free_memory -= PAGE_SIZE;
+ else
+ free_memory += PAGE_SIZE;
int idx = i / 64;
bitmap[idx] &= ~(1 << i % 64);
bitmap[idx] |= (v << i % 64);
@@ -115,11 +120,11 @@ void free_phys_pages(void *ptr, int pages) {
}
static bool segment_invalid(const struct memory_segment *segment) {
- if (segment->type != 1) return false;
- if (segment->addr < kaddr(kernel_start)) return false;
- if (segment->addr + segment->len < memory_start) return false;
- if (segment->addr + segment->len < kaddr(kernel_start)) return false;
- return true;
+ if (segment->type != 1) return true;
+ if (segment->addr < kaddr(kernel_start)) return true;
+ if (segment->addr + segment->len < memory_start) return true;
+ if (segment->addr + segment->len < kaddr(kernel_start)) return true;
+ return false;
}
static struct memory_area segment_to_area(const struct memory_segment *segment) {
@@ -195,18 +200,28 @@ void memory_init(struct memory_map *map) {
struct memory_area *area = page_start;
+ kprintf("MEMORY MAP\n");
for(uint32_t i = 0; i < map->entry_count; i++) {
struct memory_segment *segment = &map->entries[i];
if (segment_invalid(segment))
continue;
+ kprintf("addr: 0x%16p\tlen: %ld\n", (void *)segment->addr, segment->len);
+
struct memory_area temp = segment_to_area(segment);
*area = temp;
area++;
}
+ total_memory = page_count * PAGE_SIZE;
page_count -= bitmap_pages;
+ free_memory = page_count * PAGE_SIZE;
+
+ kprintf("\nMEMORY USAGE\n");
+ kprintf("mem total: %ld\n", memory_total());
+ kprintf("mem free: %ld\n", memory_free());
+ kprintf("mem used: %ld\n\n", memory_used());
memory_unlock();