Add threading, paging broken
diff --git a/src/kernel/paging.c b/src/kernel/paging.c
index 4d0aa94..809d12c 100644
--- a/src/kernel/paging.c
+++ b/src/kernel/paging.c
@@ -5,9 +5,9 @@
#include "log.h"
#include "pic.h"
+#define NUM_FRAMES 0xffffffff / 0x1000 / 32
/* frames bitset, 0 = free, 1 = used */
-static uint frames[0xffffffff / 0x1000 / 32];
-static ulong num_frames;
+static uint frames[NUM_FRAMES];
static uint first_page_table[1024] __attribute__((aligned(4096)));
uint kernel_page_directory[1024] __attribute__((aligned(4096)));
@@ -36,7 +36,7 @@
static uint first_free_frame()
{
- for (int i = 0; i < num_frames / BITS; i++)
+ for (int i = 0; i < NUM_FRAMES / BITS; i++)
{
/*
* If there are any zeroes, ~ will yield a non-zero result,
@@ -47,10 +47,13 @@
for (int j = 0; j < BITS; j++)
{
- if ((frames[i] & 1 << j) == 0)
+ if ((frames[i] & (1 << j)) == 0)
{
/* found unused frame */
- return i * BITS + j;
+ uint frame = i * BITS + j;
+ kprintf("first_free_frame returning %d\n", frame);
+// kpanic("asdf");
+ return frame;
}
}
}
@@ -61,7 +64,7 @@
void alloc_frame(uint *page_table_entry, bool user, bool writable)
{
- if (*page_table_entry >> 12)
+ if (*page_table_entry & 1)
return; /* frame already allocated */
uint frame = first_free_frame();
@@ -83,7 +86,7 @@
for (uint i = 0; i < 1024 * 0x1000; i += 0x1000)
{
- set_frame(page + i);
+ set_frame(i);
}
dir[table] = 0b10000011;
@@ -93,7 +96,7 @@
{
if (dir[table] >> 12)
{
- return (uint *)(size_t)(dir[table] ^ 0xfff);
+ return (uint *)(size_t)PHYS_TO_VIRT((dir[table] ^ 0xfff));
}
uint *page_table = kmalloc_a(sizeof(uint[1024]));
@@ -129,6 +132,9 @@
uint *table = get_or_create_table(dir, (size_t)virt >> 22, false, false);
alloc_frame(&table[page], false, false);
+
+ kprintf("alloc_page table[page] = %d (0x%x)\n", table[page], table[page]);
+ return;
}
void alloc_kernel_page_range(uint *from, uint *to)