summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/Makefile2
-rw-r--r--kernel/include/keyboard.h6
-rw-r--r--kernel/include/paging.h6
-rw-r--r--kernel/src/boot/boot.S40
-rw-r--r--kernel/src/boot/boot64.S1
-rw-r--r--kernel/src/devices/keyboard.c9
-rw-r--r--kernel/src/main.c2
-rw-r--r--kernel/src/mem/paging.c35
-rw-r--r--kernel/src/mem/paging_asm.S12
9 files changed, 84 insertions, 29 deletions
diff --git a/kernel/Makefile b/kernel/Makefile
index 8bdb9f7..d7a9fd5 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -12,6 +12,8 @@ OBJS = \
src/cpu/pic.o \
src/devices/keyboard.o \
src/main.o \
+ src/mem/paging_asm.o \
+ src/mem/paging.o \
src/misc/debug.o \
src/misc/graphics.o \
diff --git a/kernel/include/keyboard.h b/kernel/include/keyboard.h
index 3a1b7f1..050507d 100644
--- a/kernel/include/keyboard.h
+++ b/kernel/include/keyboard.h
@@ -1,9 +1,15 @@
#ifndef KEYBOARD_H
#define KEYBOARD_H
+#include <stdint.h>
+
#define KEYBOARD_DATA_PORT 0x60
#define KEYBOARD_STATUS_PORT 0x64
+uint32_t stoi(const char *s);
+void itos(uint32_t num, char** s);
+void print_char(char c);
+void print_string(char* s);
void keyboard_handler(void);
#endif
diff --git a/kernel/include/paging.h b/kernel/include/paging.h
new file mode 100644
index 0000000..79d9dea
--- /dev/null
+++ b/kernel/include/paging.h
@@ -0,0 +1,6 @@
+#ifndef PAGING_H
+#define PAGING_H
+
+void init_paging(void);
+
+#endif
diff --git a/kernel/src/boot/boot.S b/kernel/src/boot/boot.S
index ee35eeb..bf5251b 100644
--- a/kernel/src/boot/boot.S
+++ b/kernel/src/boot/boot.S
@@ -59,37 +59,25 @@ check_long_mode:
ret
setup_page_tables:
- mov $page_table_lvl3, %eax
+ mov $pt_lvl3, %eax
or $0x3, %eax
- mov %eax, page_table_lvl4
+ mov %eax, pt_lvl4
- mov $page_table_lvl2, %eax
+ // 0x00000000 - 0x00200000 : 0x00000000
+ mov $pt_lvl2, %eax
or $0x3, %eax
- mov %eax, page_table_lvl3
-
- mov $page_table_lvl2 + 4096, %eax
- or $0x3, %eax
- mov %eax, page_table_lvl3+8
-
- mov $page_table_lvl2 + 8192, %eax
- or $0x3, %eax
- mov %eax, page_table_lvl3+16
-
- mov $page_table_lvl2 + 12288, %eax
- or $0x3, %eax
- mov %eax, page_table_lvl3+24
-
+ mov %eax, pt_lvl3
movl $0, %ecx
1:
- movl $0x200000, %eax
+ movl $0x00200000, %eax
mul %ecx
or $0b10000011, %eax
- movl $page_table_lvl2, %edx
+ movl $pt_lvl2, %edx
leal (%edx, %ecx, 8), %edx
movl %eax, (%edx)
inc %ecx
- cmp $512*4, %ecx
+ cmp $1, %ecx
jne 1b
ret
@@ -106,8 +94,8 @@ enable_paging:
or $1<<8, %eax
wrmsr
- // page_table_lvl4
- mov $page_table_lvl4, %eax
+ // pt_lvl4
+ mov $pt_lvl4, %eax
mov %eax, %cr3
// enable paging (+ protected mode if not already enabled)
@@ -136,13 +124,13 @@ stack_bottom:
stack_top:
// page tables
-page_table_lvl4:
+pt_lvl4:
.skip 4096
-page_table_lvl3:
+pt_lvl3:
.skip 4096
// map first 4GB
-page_table_lvl2:
- .skip 4096*4
+pt_lvl2:
+ .skip 4096
// Access bits
.section .rodata
diff --git a/kernel/src/boot/boot64.S b/kernel/src/boot/boot64.S
index be87412..50ee7cd 100644
--- a/kernel/src/boot/boot64.S
+++ b/kernel/src/boot/boot64.S
@@ -14,6 +14,5 @@ begin_long_mode:
popq %rdi
popq %rsi
-
call kernel_main
hlt
diff --git a/kernel/src/devices/keyboard.c b/kernel/src/devices/keyboard.c
index bf4948d..d4b06b9 100644
--- a/kernel/src/devices/keyboard.c
+++ b/kernel/src/devices/keyboard.c
@@ -39,6 +39,12 @@ void itos(uint32_t num, char** s)
void print_char(char c)
{
+
+ if (c == '\n') {
+ x = 0;
+ y++;
+ return;
+ }
if (x * 8 >= fb.width) {
x = 0;
y++;
@@ -76,8 +82,7 @@ void keyboard_handler(void)
print_char(' ');
x--;
} else if (keycode == KEY_ENTER) {
- x = 0;
- y++;
+ print_char(keymap[keycode]);
} else {
if (keymap[keycode] == ' ') return;
if (is_pressed[KEY_LSHIFT] || is_pressed[KEY_RSHIFT])
diff --git a/kernel/src/main.c b/kernel/src/main.c
index 2653b4d..bea4ed2 100644
--- a/kernel/src/main.c
+++ b/kernel/src/main.c
@@ -3,9 +3,11 @@
#include <graphics.h>
#include <idt.h>
#include <debug.h>
+#include <paging.h>
int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic)
{
+ init_paging();
init_idt();
init_fb(multiboot_bootinfo, multiboot_magic);
diff --git a/kernel/src/mem/paging.c b/kernel/src/mem/paging.c
new file mode 100644
index 0000000..aa7f91e
--- /dev/null
+++ b/kernel/src/mem/paging.c
@@ -0,0 +1,35 @@
+#include <stdint.h>
+#include <paging.h>
+
+void load_pt_lvl4(uint64_t*);
+
+__attribute__((aligned(4096))) uint64_t page_table_lvl4[512];
+__attribute__((aligned(4096))) uint64_t page_table_lvl3[512];
+__attribute__((aligned(4096))) uint64_t page_table_lvl2_kernel[512];
+__attribute__((aligned(4096))) uint64_t page_table_lvl2_fb[512];
+
+#define PAGE_SIZE 0x00200000
+#define FLAG_PRESENT 0x1
+#define FLAG_WRITABLE 0x2
+#define FLAG_HUGE 0x80
+
+void init_paging(void)
+{
+ page_table_lvl4[0] = (uint64_t)page_table_lvl3 + FLAG_PRESENT + FLAG_WRITABLE;
+ page_table_lvl3[0] = (uint64_t)page_table_lvl2_kernel + FLAG_PRESENT + FLAG_WRITABLE;
+ page_table_lvl3[3] = (uint64_t)page_table_lvl2_fb + FLAG_PRESENT + FLAG_WRITABLE;
+
+ // 0x00000000 - 0x00400000 : 0x00000000 - 0x00400000
+ for (uint64_t i = 0; i < 2; i++) {
+ page_table_lvl2_kernel[i] = i * PAGE_SIZE + FLAG_PRESENT + FLAG_WRITABLE + FLAG_HUGE;
+ }
+
+ // TODO: remove initial mapping for fb and instead page on demand
+
+ // 0xe0000000 - 0xffffffff : 0xe0000000 - 0xffffffff
+ for (uint64_t i = 0; i < 512; i++) {
+ page_table_lvl2_fb[i] = i * PAGE_SIZE + 0xc0000000 + FLAG_PRESENT + FLAG_WRITABLE + FLAG_HUGE;
+ }
+
+ load_pt_lvl4(page_table_lvl4);
+}
diff --git a/kernel/src/mem/paging_asm.S b/kernel/src/mem/paging_asm.S
new file mode 100644
index 0000000..5a1dcf7
--- /dev/null
+++ b/kernel/src/mem/paging_asm.S
@@ -0,0 +1,12 @@
+.section .text
+
+.global load_pt_lvl4
+load_pt_lvl4:
+ push %rbp
+ mov %rsp, %rbp
+
+ mov %rdi, %cr3
+
+ mov %rbp, %rsp
+ pop %rbp
+ ret