diff options
Diffstat (limited to 'kernel/src/cpu')
| -rw-r--r-- | kernel/src/cpu/gdt.c | 12 | ||||
| -rw-r--r-- | kernel/src/cpu/irq_stub.S | 4 | ||||
| -rw-r--r-- | kernel/src/cpu/registers.c | 57 | ||||
| -rw-r--r-- | kernel/src/cpu/tss.c | 9 |
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); } |
