summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/boot.s2
-rw-r--r--kernel/kmain.c1
-rw-r--r--kernel/page.s55
-rw-r--r--kernel/panic.s20
-rw-r--r--kernel/traps.s13
5 files changed, 90 insertions, 1 deletions
diff --git a/kernel/boot.s b/kernel/boot.s
index bc42a5d..80f8be9 100644
--- a/kernel/boot.s
+++ b/kernel/boot.s
@@ -4,6 +4,7 @@ global kboot
global register_isr
global tss
extern kmain
+extern paging_init
extern syscall_init
extern timer_init
extern traps_init
@@ -24,6 +25,7 @@ kboot:
mov esp, 0x80000
; setup descriptor tables
call flush_gdt
+ call paging_init
call flush_idt
; last minute setup, then transfer to kmain
call timer_init
diff --git a/kernel/kmain.c b/kernel/kmain.c
index 4bfd129..ece7012 100644
--- a/kernel/kmain.c
+++ b/kernel/kmain.c
@@ -3,7 +3,6 @@
#include <stdint.h>
#include <sys/types.h>
-
uint32_t ticks = 0;
extern void userspace_init(void);
diff --git a/kernel/page.s b/kernel/page.s
new file mode 100644
index 0000000..4e40822
--- /dev/null
+++ b/kernel/page.s
@@ -0,0 +1,55 @@
+global paging_init
+
+align 4096
+page_dir:
+ times 4096 db 0
+
+align 4096
+page_tables:
+ ; two page tables
+ times 4096 db 0
+ times 4096 db 0
+.end:
+
+; here, we initialize paging. since the IDT
+; has yet to be populated, we must take extra
+; care as we can't afford to trigger a page
+; fault.
+paging_init:
+ push ebp
+ mov ebp, esp
+ push ebx
+ ; populate the page directory
+ mov eax, page_tables
+ or eax, 0x007
+ mov [page_dir], eax
+ mov eax, (page_tables+4096)
+ or eax, 0x007
+ mov [page_dir+4], eax
+ ; populate the page tables
+ mov ebx, page_tables
+ mov ecx, ((page_tables.end-page_tables)/4)
+ mov edx, 0
+.loop:
+ mov eax, edx
+ or eax, 0x003
+ cmp edx, 0x100000
+ jb .skip
+ or eax, 0x004
+.skip:
+ mov [ebx], eax
+ dec ecx
+ jz .end
+ add ebx, 4
+ add edx, 4096
+ jmp .loop
+.end:
+ ; load the page directory and enable paging
+ mov eax, page_dir
+ mov cr3, eax
+ mov eax, cr0
+ or eax, 0x80000000
+ mov cr0, eax
+ pop ebx
+ pop ebp
+ ret
diff --git a/kernel/panic.s b/kernel/panic.s
new file mode 100644
index 0000000..f4e0f26
--- /dev/null
+++ b/kernel/panic.s
@@ -0,0 +1,20 @@
+;
+; panic.s - provides panic() which disables
+; interrupts and halts the system. currently used
+; mainly for debugging, will eventually be expanded
+; to display some useful information on the
+; console.
+;
+
+global panic
+extern printf
+
+panic:
+ push ebp
+ mov ebp, esp
+ push .msg
+ call printf
+ add esp, 4
+ cli
+ hlt
+.msg: db "Kernel panic!", 10, 0
diff --git a/kernel/traps.s b/kernel/traps.s
index ba9814c..0381ee8 100644
--- a/kernel/traps.s
+++ b/kernel/traps.s
@@ -7,6 +7,8 @@ global syscall_init
global traps_init
extern call_table
extern idt
+extern panic
+extern printf
extern register_isr
%macro SAVE 0
@@ -179,7 +181,18 @@ exc_gprot:
exc_pagef:
SAVE_ERR
+
+ push ebx
+ mov ebx, cr2
+ push ebx
+ push .fmt
+ call printf
+ add esp, 8
+ call panic
+
RESTORE_ERR
+.fmt:
+ db "Page Fault (illegal memory access: 0x%08x:0x%02x)", 10, 0
exc_mathf:
SAVE