Remove directory cloning, add spawn() based multitasking stub
diff --git a/src/kernel/paging.c b/src/kernel/paging.c
index 62636b3..4d0aa94 100644
--- a/src/kernel/paging.c
+++ b/src/kernel/paging.c
@@ -10,7 +10,7 @@
 static ulong num_frames;
 
 static uint first_page_table[1024] __attribute__((aligned(4096)));
-static uint kernel_page_directory[1024] __attribute__((aligned(4096)));
+uint kernel_page_directory[1024] __attribute__((aligned(4096)));
 
 /* frame utils */
 
@@ -101,20 +101,39 @@
 	return page_table;
 }
 
+void unmap_page(uint *dir, void *virt)
+{
+	uint page = ((size_t)virt / 0x1000) % 1024;
+	uint *table = get_or_create_table(dir, (size_t)virt >> 22, false, false);
+
+	table[page] = 0;
+}
+
+void map_page_to(uint *dir, void *virt, void *frame_p, bool writable, bool user)
+{
+	uint page = ((size_t)virt / 0x1000) % 1024;
+	uint *table = get_or_create_table(dir, (size_t)virt >> 22, false, false);
+
+	table[page] = (((uint)frame_p) ^ 0xfff) | 1 | writable << 1 | user << 2;
+}
+
 void alloc_kernel_page(uint *virt)
 {
+	alloc_page(kernel_page_directory, virt);
+}
+
+void alloc_page(uint *dir, uint *virt)
+{
 	// Page number % pages per table
 	uint page = ((size_t)virt / 0x1000) % 1024;
-	uint *table = get_or_create_table(kernel_page_directory, (size_t)virt >> 22,
-									  false, false);
+	uint *table = get_or_create_table(dir, (size_t)virt >> 22, false, false);
 
 	alloc_frame(&table[page], false, false);
 }
 
 void alloc_kernel_page_range(uint *from, uint *to)
 {
-	uint f = (size_t)from / 0x1000,
-		t = (size_t)to / 0x1000;
+	uint f = (size_t)from / 0x1000, t = (size_t)to / 0x1000;
 
 	do
 	{