diff --git a/src/kernel/cpu/cpu.c b/src/kernel/cpu/cpu.c index 9bcafe0..52f91b3 100644 --- a/src/kernel/cpu/cpu.c +++ b/src/kernel/cpu/cpu.c @@ -1,7 +1,11 @@ #include #include +uint64_t gdt[2]; +void gdt_init(uint64_t *); + void cpu_init() { interrupt_init(); + gdt_init(gdt); } diff --git a/src/kernel/cpu/gdt.c b/src/kernel/cpu/gdt.c index fa2b878..69f6c70 100644 --- a/src/kernel/cpu/gdt.c +++ b/src/kernel/cpu/gdt.c @@ -1,5 +1,6 @@ #include #include +#include #define GDT_CODE (3<<11) #define GDT_DPL(lvl) ((lvl)<<13) @@ -26,3 +27,15 @@ struct gdt BootGDT[] = { }; struct gdtp GDTp = {2*8-1, BootGDT}; + + +void gdt_init(uint64_t *_gdt) +{ + struct gdt *gdt = (struct gdt *)_gdt; + memcpy(gdt, BootGDT, sizeof(BootGDT)); + + GDTp.len = 2*8 - 1; + GDTp.gdt = gdt; + + load_gdt(&GDTp); +} diff --git a/src/kernel/cpu/registers.S b/src/kernel/cpu/registers.S index 09e1eec..5b6fc9b 100644 --- a/src/kernel/cpu/registers.S +++ b/src/kernel/cpu/registers.S @@ -5,6 +5,20 @@ load_idt: lidt [rdi] ret +.global load_gdt +load_gdt: + lgdt [rdi] + mov ax, 0x0 + mov ss, ax + mov ds, ax + mov es, ax + movabs rax, offset .load_gdt + pushq 0x8 + push rax + retfq +.load_gdt: + ret + .global read_cr0 read_cr0: mov rax, cr0 diff --git a/src/kernel/include/cpu.h b/src/kernel/include/cpu.h index 7b93617..9cf84a4 100644 --- a/src/kernel/include/cpu.h +++ b/src/kernel/include/cpu.h @@ -4,7 +4,9 @@ void cpu_init(); + void load_idt(void *); +void load_gdt(void *); uint64_t read_cr0(); uint64_t read_cr2();