summaryrefslogtreecommitdiff
path: root/kernel/src/cpu
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/cpu')
-rw-r--r--kernel/src/cpu/gdt.c12
-rw-r--r--kernel/src/cpu/irq_stub.S4
-rw-r--r--kernel/src/cpu/registers.c57
-rw-r--r--kernel/src/cpu/tss.c9
4 files changed, 74 insertions, 8 deletions
diff --git a/kernel/src/cpu/gdt.c b/kernel/src/cpu/gdt.c
index b4f1ec0..7ce51f1 100644
--- a/kernel/src/cpu/gdt.c
+++ b/kernel/src/cpu/gdt.c
@@ -23,10 +23,13 @@ void add_gdt_tss(uint32_t num, uint64_t offset, uint32_t limit, uint8_t access,
void reload_gdt()
{
__asm__ volatile (
+ // reload segment registers
"mov $0x10, %ax;"
"mov %ax, %ds;"
"mov %ax, %es;"
"mov %ax, %ss;"
+ "mov %ax, %fs;"
+ "mov %ax, %gs;"
);
}
@@ -42,12 +45,11 @@ void init_gdt()
gdt_pointer.size = sizeof(gdt) - 1;
add_gdt_entry(0, 0, 0, 0, 0);
- add_gdt_entry(1, 0, 0xfffff, 0x9a, 0xa);
- add_gdt_entry(2, 0, 0xfffff, 0x92, 0xc);
- add_gdt_entry(3, 0, 0xfffff, 0xfa, 0xa);
- add_gdt_entry(4, 0, 0xfffff, 0xf2, 0xc);
+ add_gdt_entry(1, 0, 0xfffff, 0x9a, 0xa); // code ring0
+ add_gdt_entry(2, 0, 0xfffff, 0x92, 0xc); // data ring0
+ add_gdt_entry(3, 0, 0xfffff, 0xf2, 0xc); // data ring3
+ add_gdt_entry(4, 0, 0xfffff, 0xfa, 0xa); // code ring3
add_gdt_tss(5, (uint64_t)&tss, sizeof(tss_type), 0x89, 0);
load_gdt(&gdt_pointer);
- init_tss();
}
diff --git a/kernel/src/cpu/irq_stub.S b/kernel/src/cpu/irq_stub.S
index 9b2b2d8..5a8149c 100644
--- a/kernel/src/cpu/irq_stub.S
+++ b/kernel/src/cpu/irq_stub.S
@@ -24,7 +24,6 @@
pop %rax
.endm
-
.macro isr_no_error number
.global isr\number
isr\number:
@@ -38,11 +37,12 @@ isr\number:
.macro isr_error number
.global isr\number
isr\number:
- pop %rdi
pushall
+ mov 0x50(%rsp), %rdi
cld
call isr\number\()_handler
popall
+ add $8, %rsp
iretq
.endm
diff --git a/kernel/src/cpu/registers.c b/kernel/src/cpu/registers.c
new file mode 100644
index 0000000..7dc22d4
--- /dev/null
+++ b/kernel/src/cpu/registers.c
@@ -0,0 +1,57 @@
+#include <types.h>
+#include <libk/stdio.h>
+
+struct registers_t {
+ uint64_t rax;
+ uint64_t rbx;
+ uint64_t rcx;
+ uint64_t rdx;
+ uint64_t rsi;
+ uint64_t rdi;
+ uint64_t rsp;
+ uint64_t rbp;
+ uint64_t r8;
+ uint64_t r9;
+ uint64_t r10;
+ uint64_t r11;
+ uint64_t r12;
+ uint64_t r13;
+ uint64_t r14;
+ uint64_t r15;
+ uint64_t rip;
+ uint16_t cs;
+ uint16_t ds;
+ uint16_t ss;
+ uint16_t es;
+ uint16_t fs;
+ uint16_t gs;
+};
+typedef struct registers_t registers_t;
+
+void print_reg(registers_t* registers)
+{
+ printf("printing registers:");
+ printf("rax: %x", registers->rax);
+ printf("rbx: %x", registers->rbx);
+ printf("rcx: %x", registers->rcx);
+ printf("rdx: %x", registers->rdx);
+ printf("rsi: %x", registers->rsi);
+ printf("rdi: %x", registers->rdi);
+ printf("rsp: %x", registers->rsp);
+ printf("rbp: %x", registers->rbp);
+ printf("r8: %x", registers->r8);
+ printf("r9: %x", registers->r9);
+ printf("r10: %x", registers->r10);
+ printf("r11: %x", registers->r11);
+ printf("r12: %x", registers->r12);
+ printf("r13: %x", registers->r13);
+ printf("r14: %x", registers->r14);
+ printf("r15: %x", registers->r15);
+ printf("rip: %x", registers->rip);
+ printf("cs: %x", registers->cs);
+ printf("ds: %x", registers->ds);
+ printf("ss: %x", registers->ss);
+ printf("es: %x", registers->es);
+ printf("fs: %x", registers->fs);
+ printf("gs: %x", registers->gs);
+}
diff --git a/kernel/src/cpu/tss.c b/kernel/src/cpu/tss.c
index c7f9dc2..843c114 100644
--- a/kernel/src/cpu/tss.c
+++ b/kernel/src/cpu/tss.c
@@ -1,15 +1,22 @@
#include <tss.h>
+#include <heap.h>
+#include <libk/stdio.h>
tss_type tss;
void load_tss()
{
- __asm__ volatile ("mov $0x28, %ax; ltr %ax;");
+ __asm__ volatile ("push %rax; mov $0x28, %ax; ltr %ax; pop %rax;");
}
void init_tss()
{
tss.iopb = sizeof(tss_type);
+ uint64_t stack = (uint64_t)kalloc(4096*4);
+ stack = (uint64_t)kalloc(4096*4) + 8;
+ tss.rsp0_low = (uint32_t)stack;
+ tss.rsp0_high = (uint32_t)(stack >> 32);
load_tss();
+ printf("rsp0 addr in tss: 0x%x\n", stack);
}