From 7081fea36d0768fb52b006186b3bb09cc4b14d95 Mon Sep 17 00:00:00 2001 From: Mathieu Maret Date: Thu, 28 Oct 2021 23:49:58 +0200 Subject: [PATCH] Fix areaAlloc map failing and tests --- core/allocArea.c | 46 +++++++++++++++++++++++++++++++--------------- core/kthread.c | 2 ++ tests/test.c | 8 +++----- 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/core/allocArea.c b/core/allocArea.c index a733811..b8ccf94 100644 --- a/core/allocArea.c +++ b/core/allocArea.c @@ -1,8 +1,8 @@ #include "allocArea.h" #include "alloc.h" #include "assert.h" -#include "kernel.h" #include "irq.h" +#include "kernel.h" #include "list.h" #include "mem.h" #include "stdarg.h" @@ -25,10 +25,10 @@ void areaInit(vaddr_t firstMemUsed, vaddr_t lastUsed, vaddr_t stackBottom, vaddr if (areaAddr != descAddr && areaAddr != entryAddr) areaAdd(areaAddr, areaAddr + PAGE_SIZE, FALSE); - //kernel bootstrap part + // kernel bootstrap part areaAdd(ALIGN_DOWN(firstMemUsed, PAGE_SIZE), stackBottom, FALSE); - //Initial kernel stack + // Initial kernel stack areaAdd(stackBottom, stackTop, FALSE); // Rest of kernel code @@ -72,7 +72,8 @@ static void insertSorted(struct memArea **list, struct memArea *item) list_add_tail(*list, item); } -vaddr_t areaBook(unsigned int nbPages, uint32_t flags){ +vaddr_t areaBook(unsigned int nbPages, uint32_t flags) +{ struct memArea *area; vaddr_t allocated; @@ -81,7 +82,7 @@ vaddr_t areaBook(unsigned int nbPages, uint32_t flags){ disable_IRQs(irqFlags); area = areaFindFit(nbPages); - if (!area){ + if (!area) { printf("NULL<\n"); restore_IRQs(irqFlags); @@ -97,18 +98,25 @@ vaddr_t areaBook(unsigned int nbPages, uint32_t flags){ area->nbPages -= nbPages; area->startAddr += nbPages * PAGE_SIZE; - } if (flags & AREA_PHY_MAP) { for (uint i = 0; i < nbPages; i++) { paddr_t page = allocPhyPage(1); if (page) { - pageMap(allocated + i * PAGE_SIZE, page, PAGING_MEM_WRITE); - } else { + if (pageMap(allocated + i * PAGE_SIZE, page, PAGING_MEM_WRITE)) { + unrefPhyPage(page); + page = (paddr_t)NULL; + } else { + unrefPhyPage(page); + } + } + if (page == (paddr_t)NULL) { printf("Ooops\n"); // TODO - assert(0); + // assert(0); + restore_IRQs(irqFlags); + return (vaddr_t)NULL; } } } @@ -125,7 +133,7 @@ vaddr_t areaAlloc(unsigned int nbPages, uint32_t flags) disable_IRQs(irqFlags); area = areaFindFit(nbPages); - if (!area){ + if (!area) { restore_IRQs(irqFlags); return (vaddr_t)NULL; @@ -160,11 +168,18 @@ vaddr_t areaAlloc(unsigned int nbPages, uint32_t flags) for (uint i = 0; i < nbPages; i++) { paddr_t page = allocPhyPage(1); if (page) { - pageMap(allocated->startAddr + i * PAGE_SIZE, page, PAGING_MEM_WRITE); - } else { + if (pageMap(allocated->startAddr + i * PAGE_SIZE, page, PAGING_MEM_WRITE)) { + page = (paddr_t)NULL; + } else { + unrefPhyPage(page); + } + } + if (page == (paddr_t)NULL) { printf("Ooops\n"); // TODO - assert(0); + // assert(0); + restore_IRQs(irqFlags); + return (vaddr_t)NULL; } } } @@ -177,9 +192,10 @@ int areaAdd(vaddr_t start, vaddr_t end, int isFree) { struct memArea **area; - int nbPages = (end-start)/PAGE_SIZE; + int nbPages = (end - start) / PAGE_SIZE; + pr_devel("Add %s area 0x%x->0x%x (%d)\n", isFree ? "free" : "used", start, end, nbPages); - assert(nbPages >0); + assert(nbPages > 0); assert(IS_ALIGNED(start, PAGE_SIZE)); assert(IS_ALIGNED(end, PAGE_SIZE)); diff --git a/core/kthread.c b/core/kthread.c index 8fc1f55..9076793 100644 --- a/core/kthread.c +++ b/core/kthread.c @@ -55,6 +55,8 @@ struct kthread *kthreadCreate(const char *name, cpu_kstate_function_arg1_t func, return NULL; thread->stackAddr = (vaddr_t)malloc(KTHREAD_DEFAULT_STACK_SIZE); + if(!thread->stackAddr) + return NULL; #ifdef DEBUG printf("Alloc stack at 0x%x struct at 0x%x\n", thread->stackAddr, thread); #endif diff --git a/tests/test.c b/tests/test.c index 477c381..aa9cb60 100644 --- a/tests/test.c +++ b/tests/test.c @@ -154,9 +154,7 @@ static void testPaging(void) int allocCount = 0; int freeCount = 0; - while ((page = (struct phyMemDesc *)allocPhyPage(1)) != NULL) { - assertmsg(pageMap((vaddr_t)page, (paddr_t)page, PAGING_MEM_WRITE) == 0, - "Fail to map page %d\n", allocCount); + while ((page = (struct phyMemDesc *)areaAlloc(1, AREA_PHY_MAP)) != NULL) { memset(page, allocCount, PAGE_SIZE); allocCount++; list_add_tail(allocated_page_list, page); @@ -167,12 +165,12 @@ static void testPaging(void) (page = list_pop_head(allocated_page_list)) != NULL) { assertmsg((char)page->phy_addr == (char)freeCount, "page modified %d but is %d\n", freeCount, page->phy_addr); - assertmsg(unrefPhyPage((ulong)page) >= 0, "Failed to free page %d\n", (ulong)page); - pageUnmap((vaddr_t)page); + areaFree((vaddr_t)page); freeCount++; } printf("%d pages freed\n", freeCount); + assert(freeCount == allocCount); assertmsg((page = (struct phyMemDesc *)allocPhyPage(1)) != NULL, "Cannot allocate memory\n"); unrefPhyPage((ulong)page);