diff --git a/kernel-rs/src/arch/x86_64/boot.asm b/kernel-rs/src/arch/x86_64/boot.asm index f717b7dd..e4037e21 100644 --- a/kernel-rs/src/arch/x86_64/boot.asm +++ b/kernel-rs/src/arch/x86_64/boot.asm @@ -1,4 +1,5 @@ global start +extern long_mode_start section .text bits 32 @@ -12,6 +13,11 @@ start: call set_up_page_tables call enable_paging + ; load the 64-bit GDT + lgdt [gdt64.pointer] + + jmp gdt64.code:long_mode_start + ; print 'OK' to screen mov dword [0xb8000], 0x2f4b2f4f hlt @@ -138,3 +144,12 @@ p2_table: stack_bottom: resb 64 stack_top: + +section .rodata +gdt64: + dq 0 ; zero entry +.code: equ $ - gdt64 + dq (1<<43) | (1<<44) | (1<<47) | (1<<53) ; code segment +.pointer: + dw $ - gdt64 - 1 + dq gdt64 diff --git a/kernel-rs/src/arch/x86_64/long_mode_init.asm b/kernel-rs/src/arch/x86_64/long_mode_init.asm new file mode 100644 index 00000000..318764af --- /dev/null +++ b/kernel-rs/src/arch/x86_64/long_mode_init.asm @@ -0,0 +1,16 @@ +global long_mode_start + +section .text +bits 64 +long_mode_start: + ; load 0 into all data segment registers + mov ax, 0 + mov ss, ax + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + ;print 'OKAY' to screen + mov rax, 0x2f592f412f4b2f4f + mov qword [0xb8000], rax + hlt