BarryServer : Git

All the code for all my projects
// BarryServer : Git / Nucleus / commit / 08afe80d1ca157b9cddb31ee48ab0e6e1823f559 / memory

// Related

Nucleus

Barry Object manager and heap in kernel library 08afe80 (3 years, 2 months ago)
diff --git a/memory/fault.c b/memory/fault.c
index 80dc5e0..d8accb6 100644
--- a/memory/fault.c
+++ b/memory/fault.c
@@ -13,9 +13,10 @@
 #include <nucleus/lib.h>
 #include <nucleus/memory.h>
 #include <nucleus/task.h>
-#include "paging.h"
 #include "namespace.h"
 
+extern page_t zeroFrame;
+
 VMRegion *find_region(uintptr_t addr);
 void copy_page_frame(page_t src, page_t dest);
 
@@ -179,13 +180,15 @@ page_fault_handler(struct InterruptFrame *frame)
 	uint8_t write   = frame->err & (1 << 1);
 	uint8_t user    = frame->err & (1 << 2);
 
+	ASSERT(current && current->vm);
+
 	/* Iterate VM Regions */
 	VMRegion *region = find_region(addr);
 	/* Not in a region */
 	if (__builtin_expect(!region, 0)) {
 		page_t pg = get_page(addr);
-		panic("[CPU#%d] Page Fault [%d:%d] (%#.8x -> %#.8x [tbl:%d, pg:%d][%#.8x], %s, %s, %s)",
-		      cpu->id, current->tgid, current->tid, frame->eip,
+		panic("Page Fault [%d:%d] (%#.8x -> %#.8x [tbl:%d, pg:%d][%#.8x], %s, %s, %s)",
+		      current->tgid, current->tid, frame->eip,
 		      addr, (addr >> 12) / 1024, (addr >> 12) % 1024, pg,
 		      present ? "present" : "not present",
 		      write ? "write" : "read",
@@ -202,21 +205,3 @@ page_fault_handler(struct InterruptFrame *frame)
 	if (!present && !write)
 		return not_present_read(region, addr);
 }
-
-/* Early (pre-VFS/tasking) page fault handler */
-void
-early_page_fault_handler(struct InterruptFrame *frame)
-{
-	uintptr_t addr;
-	asm volatile("mov %%cr2, %0" : "=r" (addr));
-	uint8_t present = frame->err & (1 << 0);
-	uint8_t write   = frame->err & (1 << 1);
-	uint8_t user    = frame->err & (1 << 2);
-	if (!PAGE_ADDR(addr))
-		panic("Null dereference @ %#.8x -> %#.8x", frame->eip, addr);
-	ASSERT(!present);
-	kprintf("Allocating frame for %#.8x [%#.8x] CPU#%d",
-	        addr, frame->eip, cpu->id);
-	/* Allocate a page */
-	set_page(addr, alloc_frame() | PTE_PRESENT | PTE_WRITE | PTE_GLOBAL);
-}
diff --git a/memory/heap.c b/memory/heap.c
deleted file mode 100644
index a0e696a..0000000
--- a/memory/heap.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * This file contains the functions related to the kernel's heap.  It uses a
- * simple method of allocating and freeing blocks from a pool in the kernel's
- * memory space.  This heap will be present in every virtual address space, so
- * can be used to store any kernel data structures.
- */
-
-#include <stddef.h>
-#include <stdint.h>
-#include <nucleus/kernel.h>
-#include <nucleus/lib.h>
-
-#define KHEAP_START 0x200000 /* 2MB */
-#define KHEAP_END   0x800000 /* 2MB */
-#define BLOCK_SIZE  16
-
-/* Structure for a memory block header */
-struct Header {
-	struct Header *next, *prev;
-	size_t size;
-	char magic[4];
-};
-
-/* Allocate a region of the heap */
-void *
-kmalloc(size_t size)
-{
-	size_t blockSize, gapSize;
-	uintptr_t blockEnd;
-	struct Header *prev, *head, *next = NULL;
-	head = prev = (void *) KHEAP_START;
-
-	/* Minimum allocation */
-	if (size % BLOCK_SIZE)
-		size += BLOCK_SIZE - (size % BLOCK_SIZE);
-
-	/* Block does not exist, create heap */
-	if (head->prev != head) {
-		head->prev = head;
-		head->next = NULL;
-		goto found;
-	}
-
-	/* Find gap */
-	while (head) {
-		next = head->next;
-		blockSize = sizeof(struct Header) + head->size;
-		blockEnd = (uintptr_t) head + blockSize;
-		if (next)
-			gapSize = (size_t) next - blockEnd;
-		else
-			gapSize = (size_t) KHEAP_END - blockEnd;
-		prev = head;
-
-		/* Fit in gap */
-		if (gapSize >= size + sizeof(struct Header)) {
-			head = (void *) blockEnd;
-			head->next = next;
-			head->prev = prev;
-			prev->next = head;
-			if (next)
-				next->prev = head;
-			goto found;
-		}
-
-		head = head->next;
-	}
-
-	panic("Kernel heap exhausted");
-
-found:
-	/* Found block */
-	head->size = size;
-	memcpy(head->magic, "HEAP", 4);
-	memset(head + 1, 0, size);
-	return (void *) (head + 1);
-}
-
-/* Free an allocated region of the heap */
-void
-kfree(void *addr)
-{
-	struct Header *prev, *head, *next;
-	head = (struct Header *) addr - 1;
-
-	ASSERT(!memcmp(head->magic, "HEAP", 4));
-	prev = head->prev;
-	next = head->next;
-	memset(head, 0, sizeof(struct Header));
-
-	if (prev != head)
-		prev->next = next;
-	if (next)
-		next->prev = prev;
-}
diff --git a/memory/page.c b/memory/page.c
index 986b4d9..8c61aa6 100644
--- a/memory/page.c
+++ b/memory/page.c
@@ -6,9 +6,10 @@
 
 #include <nucleus/memory.h>
 #include <nucleus/object.h>
-#include "paging.h"
 #include "namespace.h"
 
+extern page_t zeroFrame;
+
 static void page_delete(Object *);
 
 /* Page object type */
diff --git a/memory/paging.c b/memory/paging.c
index c88eee1..e9a8a83 100644
--- a/memory/paging.c
+++ b/memory/paging.c
@@ -8,9 +8,9 @@
 #include <stdint.h>
 #include <nucleus/lib.h>
 #include <nucleus/memory.h>
-#include "paging.h"
 
 void copy_page_frame(uintptr_t src, uintptr_t dest);
+void page_fault_handler(struct InterruptFrame *frame);
 
 page_t zeroFrame;
 static page_dir_t kernelDir;
@@ -151,7 +151,7 @@ init_paging(void)
 	 */
 
 	/* Use kernel directory */
-	register_exception(14, early_page_fault_handler);
+	register_exception(14, page_fault_handler);
 	cpu_load_paging();
 
 	/* Allocate a kernel stack */
diff --git a/memory/paging.h b/memory/paging.h
deleted file mode 100644
index eb7c75f..0000000
--- a/memory/paging.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef MEMORY_PAGING_H
-#define MEMORY_PAGING_H
-
-#include <stdint.h>
-#include <nucleus/cpu.h>
-#include <nucleus/memory.h>
-
-extern page_t zeroFrame;
-
-void early_page_fault_handler(struct InterruptFrame *frame);
-
-#endif