From 1daf8ed47bf4aee6cef1697e810a5afd861be29e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Thu, 21 Dec 2017 16:15:55 +0100 Subject: [PATCH] PMM - alloc two pages --- src/kernel/memory/pmm.c | 3 ++- src/kernel/memory/pmm.tt | 27 ++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/kernel/memory/pmm.c b/src/kernel/memory/pmm.c index 70a8ef8..cfaf7c1 100644 --- a/src/kernel/memory/pmm.c +++ b/src/kernel/memory/pmm.c @@ -4,12 +4,13 @@ uintptr_t *first = 0; void pmm_free(void *c) { + *(uintptr_t *)c = (uintptr_t)first; first = c; } void *pmm_alloc() { void *c = first; - first = 0; + first = (uintptr_t *)(c?*(uintptr_t *)c:0); return c; } diff --git a/src/kernel/memory/pmm.tt b/src/kernel/memory/pmm.tt index 7ddca08..d724e7e 100644 --- a/src/kernel/memory/pmm.tt +++ b/src/kernel/memory/pmm.tt @@ -5,7 +5,7 @@ struct { uint8_t data[PAGE_SIZE]; -}__attribute__((packed)) mem[4]; +}__attribute__((packed)) mem[2]; TEST(alloc_returns_freed_page) { @@ -25,3 +25,28 @@ TEST(alloc_zero_after_all_free_pages) void *a = pmm_alloc(); ASSERT_EQ_PTR(a, 0); } + +TEST(alloc_two_pages___first_page_is_not_zero) +{ + pmm_free(&mem[0]); + pmm_free(&mem[1]); + void *a = pmm_alloc(); + pmm_alloc(); + ASSERT_NEQ_PTR(a, 0); +} +TEST(alloc_two_pages___second_page_is_not_zero) +{ + pmm_free(&mem[0]); + pmm_free(&mem[1]); + pmm_alloc(); + void *a = pmm_alloc(); + ASSERT_NEQ_PTR(a, 0); +} +TEST(alloc_two_pages___doesnt_return_same_page_twice) +{ + pmm_free(&mem[0]); + pmm_free(&mem[1]); + void *a = pmm_alloc(); + void *b = pmm_alloc(); + ASSERT_NEQ_PTR(a, b); +}