diff --git a/kernel/src/arch/x86_64/entry-stivale2.c b/kernel/src/arch/x86_64/entry-stivale2.c index c609aad..c8c174e 100644 --- a/kernel/src/arch/x86_64/entry-stivale2.c +++ b/kernel/src/arch/x86_64/entry-stivale2.c @@ -42,6 +42,8 @@ void stivale2_main(struct stivale2_struct *info) { ); printf("PAGE TABLE AT: %x\n", cr3); + loadgdt(); + struct gdt_ptr pGDT; __asm__ __volatile__("sgdt %0" : : "m"(pGDT) : "memory"); printf("GDT: %x (%d)\n", pGDT.base, pGDT.limit); diff --git a/kernel/src/arch/x86_64/gdt.nasm b/kernel/src/arch/x86_64/gdt.nasm index 475e779..0f7a300 100644 --- a/kernel/src/arch/x86_64/gdt.nasm +++ b/kernel/src/arch/x86_64/gdt.nasm @@ -1,10 +1,15 @@ section .rodata +align 8 gdt64: dq 0 -.code: equ $-gdt64 +.codesys: equ $-gdt64 dq (1<<44) | (1<<47) | (1<<41) | (1<<43) | (1<<53) -.data: equ $ - gdt64 +.datasys: equ $-gdt64 dq (1<<44) | (1<<47) | (1<<41) +.codeusr: equ $-gdt64 + dq (1<<44) | (1<<47) | (1<<41) | (1<<43) | (1<<53) | (3<<45) +.datausr: equ $-gdt64 + dq (1<<44) | (1<<47) | (1<<41) | (3<<45) .pointer: dw .pointer - gdt64 - 1 dq gdt64 @@ -13,4 +18,18 @@ section .text global loadgdt loadgdt: lgdt [gdt64.pointer] - \ No newline at end of file + ; now what I tried unsuccessfully: + + mov rax, gdt64.codesys; + push rax + mov rax, loadgdtdone + push rax ; function to execute next + retfq ; far return (pops address and code segment) +loadgdtdone: + mov ax, gdt64.datasys + mov ss, ax + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + ret \ No newline at end of file