From c24a6014f7f2be1a7ec57f2abeb55303726e0db8 Mon Sep 17 00:00:00 2001 From: Thomas Oltmann Date: Sat, 5 Jul 2025 20:41:51 +0200 Subject: [PATCH] Set up a separate long-mode GDT --- lboot.S | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/lboot.S b/lboot.S index 641c4be..650a3be 100644 --- a/lboot.S +++ b/lboot.S @@ -43,7 +43,7 @@ _start: cli jmp hang -.set COM1, 0x3F8 + .set COM1, 0x3F8 .macro com1_write offset=0, byte mov $COM1+\offset, %dx mov $\byte, %al @@ -67,7 +67,7 @@ enable_a20: // TODO more thorough implementation // unreal: Enter unreal mode unreal: push %ds - lgdt gdt_ptr + lgdt gdt16_ptr mov %cr0, %eax or $0x01, %al @@ -244,7 +244,7 @@ long: mov %eax, %cr3 // Enable long mode -.set IA32_EFER, 0xC0000080 + .set IA32_EFER, 0xC0000080 mov $IA32_EFER, %ecx rdmsr or $0x100, %eax @@ -255,14 +255,16 @@ long: or $0x80000001, %eax mov %eax, %cr0 + lgdt gdt64_ptr + ret // hang: sleep indefinitely hang: hlt jmp hang - // gdt: Protected mode / Unreal mode 16-bit GDT -gdt: // entry 0: null descriptor + // gdt16: Protected mode / Unreal mode 16-bit GDT +gdt16: // entry 0: null descriptor .word 0 .word 0 .byte 0 @@ -283,9 +285,30 @@ gdt: // entry 0: null descriptor .byte 0b10010010 .byte 0x8F .byte 0 - .set gdt_size, .-gdt -gdt_ptr: .word gdt_size-1 - .long gdt + .set gdt16_size, .-gdt16 +gdt16_ptr: .word gdt16_size-1 + .long gdt16 + + // gdt64: Long mode 64-bit GDT +gdt64: // entry 0: null descriptor + .quad 0 + // entry 1: code segment + .word 0 + .word 0 + .byte 0 + .byte 0x98 + .byte 0x60 + .byte 0 + // entry 2: data segment + .word 0 + .word 0 + .byte 0 + .byte 0x90 + .byte 0x00 + .byte 0 + .set gdt64_size, .-gdt64 +gdt64_ptr: .word gdt64_size-1 + .quad gdt64 // Messages to print msg_start: .asciz "Netboot via fernlader v1 ...\r\n"