From e86857dca4bfe9fac325cca79dddc5e55ba908d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Tue, 20 Mar 2018 10:20:27 +0100 Subject: [PATCH] PMM -- simplification of code --- src/kernel/memory/pmm.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/kernel/memory/pmm.c b/src/kernel/memory/pmm.c index e15c4bd..a222e25 100644 --- a/src/kernel/memory/pmm.c +++ b/src/kernel/memory/pmm.c @@ -1,25 +1,28 @@ #include -uint64_t first = 0; +// Virtual addres of next free page +uint64_t next = 0; void pmm_free(uint64_t page) { - page = (uint64_t)P2V(page); - *(uint64_t *)page = first; - first = page; + // Write previous free pointer to freed page + *(uint64_t *)P2V(page) = next; + // And update free pointer + next = (uint64_t)P2V(page); } uint64_t pmm_alloc() { - uint64_t page = first; - first = page?*(uint64_t *)page:0; - page = (uint64_t)(page?V2P(page):0); - return page; + if(!next) return 0; + uint64_t page = next; + // Read new free pointer from allocated page + next = *(uint64_t *)page; + return (uint64_t)V2P(page); } uint64_t pmm_calloc() { uint64_t page = pmm_alloc(); - memset(P2V(page), 0, 0x1000); + memset(P2V(page), 0, PAGE_SIZE); return page; }