load my own fking GDT woop

This commit is contained in:
Quinten Kock 2020-12-08 01:37:33 +01:00
parent eb42be6dc4
commit 026e6d0e1a
2 changed files with 24 additions and 3 deletions

View File

@ -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);

View File

@ -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]
; 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