Reinitialize paging in C
diff --git a/src/kernel/boot.s b/src/kernel/boot.s
index a65e2d8..d80261a 100644
--- a/src/kernel/boot.s
+++ b/src/kernel/boot.s
@@ -18,9 +18,9 @@
 
 	[section .data align = 0x1000]
 page_directory:	
-	dd 0b010000011		; Identity map first 4 megs
+	dd 0b010000011				; Identity map first 4 megs
 	times (KERNEL_PAGE_NUMBER - 1) dd 0
-	dd 0b010000011 ; Map kernel memory to zero page too 
+	dd 0b010000011 				; Map kernel memory to zero page too 
 	times (1024 - KERNEL_PAGE_NUMBER - 1) dd 0
 
 	[bits 32]
@@ -66,10 +66,14 @@
 
 	mov esp, (stack + STACK_SIZE)
 	
-	push ebx					; Holds multiboot header location, PHYSICAL addr
+	add ebx, 0xC0000000			; Translate to virtual address
+	push ebx					; Holds multiboot header location
 	call kmain
-	jmp $
 
+.end:
+	hlt
+	jmp .end
+	
 
 	[section .bss align = 32]
 stack:
diff --git a/src/kernel/main.c b/src/kernel/main.c
index eeef814..59fc65c 100644
--- a/src/kernel/main.c
+++ b/src/kernel/main.c
@@ -7,7 +7,7 @@
 
 int kmain(void *mboot)
 {
-//	initialize_paging();
+	init_paging();
 
 	vga_clear();
 	vga_set_color(LIGHT_BLUE, BLACK);
diff --git a/src/kernel/paging.c b/src/kernel/paging.c
index 1d50ce5..458de21 100644
--- a/src/kernel/paging.c
+++ b/src/kernel/paging.c
@@ -12,9 +12,7 @@
 static ulong num_frames;
 
 static uint first_page_table[1024] __attribute__((aligned(4096)));
-static uint *page_directory[1024] __attribute__((aligned(4096)));
-
-static uint ***current_directory;
+static uint page_directory[1024] __attribute__((aligned(4096)));
 
 void *_kmalloc(size_t size, bool align, void **phys)
 {
@@ -111,25 +109,27 @@
 	clear_frame(page / 0x1000);
 }
 
+void map_4mb(size_t virt_start, size_t phys_start, bool user, bool rw)
+{
+	uint page = virt_start / 0x1000;
+	uint table = virt_start >> 22;
+
+	for (uint i = 0; i < 1024 * 0x1000; i += 0x1000)
+	{
+		set_frame(page + i);
+	}
+
+	page_directory[table] = 0b10000011;
+}
+
 /* paging stuff */
 
-void initialize_paging()
+void init_paging()
 {
-	for (int i = 0; i < 1024; i++)
-	{
-		page_directory[i] = (uint *) 0b010; // kernel, rw, not present
-	}
+	memset(page_directory, 0, 1024 * 4);
+	page_directory[KERNEL_PAGE_NUMBER] = 0b10000011;
 
-	for (int i = 0; i < 1024; i++)
-	{
-		first_page_table[i] = (i * 0x1000) | 3;
-	}
-
-	page_directory[0] = (uint *) (((size_t) (uint *) first_page_table) | 3);
-
-	load_page_directory((uint) page_directory);
-	enable_paging();
-
+	load_page_directory((uint)page_directory - 0xC0000000);
 	add_interrupt_handler(14, page_fault);
 }
 
diff --git a/src/kernel/paging.h b/src/kernel/paging.h
index 7c5000e..921524f 100644
--- a/src/kernel/paging.h
+++ b/src/kernel/paging.h
@@ -3,6 +3,11 @@
 #include "kint.h"
 #include "registers.h"
 
+#define VIRT_TO_PHYS(virt) ((uint)(virt) - 0xC0000000)
+#define PHYS_TO_VIRT(phys) ((uint)(phys) + 0xC0000000)
+#define KERNEL_VIRTUAL_BASE 0xC0000000
+#define KERNEL_PAGE_NUMBER (KERNEL_VIRTUAL_BASE >> 22)
+
 /* defined in switch_table.s */
 extern uint load_page_directory(uint table_address);
 extern void enable_paging();
@@ -12,6 +17,6 @@
 void *kmalloc_a(size_t size);
 void *kmalloc_ap(size_t size, void **p);
 
-void initialize_paging();
+void init_paging();
 
 void page_fault(struct registers *regs);
diff --git a/src/kernel/switch_table.s b/src/kernel/switch_table.s
index d04629b..c8e6260 100644
--- a/src/kernel/switch_table.s
+++ b/src/kernel/switch_table.s
@@ -1,25 +1,15 @@
 	[section .text]
 	[bits 32]
 
-;;; TODO: remove useless frame pointer stuff
-	
 	[global load_page_directory]
 load_page_directory:
-	push ebp 					; Save frame pointer
-	mov ebp, esp
-	mov eax, [esp + 8]			; Pointer to directory
-	mov cr3, eax
-	mov esp, ebp
-	pop ebp
+	mov ecx, [esp + 4]			; Pointer to directory
+	mov cr3, ecx
 	ret
 
 	[global enable_paging]
 enable_paging:
-	push ebp
-	mov ebp, esp
-	mov eax, cr0
+	mov ecx, cr0
 	or eax, 0x80000000
-	mov cr0, eax
-	mov esp, ebp
-	pop ebp
+	mov cr0, ecx
 	ret