Set up a separate long-mode GDT

This commit is contained in:
Thomas Oltmann 2025-07-05 20:41:51 +02:00
parent 0bfcd7afd2
commit c24a6014f7

39
lboot.S
View file

@ -43,7 +43,7 @@ _start: cli
jmp hang jmp hang
.set COM1, 0x3F8 .set COM1, 0x3F8
.macro com1_write offset=0, byte .macro com1_write offset=0, byte
mov $COM1+\offset, %dx mov $COM1+\offset, %dx
mov $\byte, %al mov $\byte, %al
@ -67,7 +67,7 @@ enable_a20: // TODO more thorough implementation
// unreal: Enter unreal mode // unreal: Enter unreal mode
unreal: push %ds unreal: push %ds
lgdt gdt_ptr lgdt gdt16_ptr
mov %cr0, %eax mov %cr0, %eax
or $0x01, %al or $0x01, %al
@ -244,7 +244,7 @@ long:
mov %eax, %cr3 mov %eax, %cr3
// Enable long mode // Enable long mode
.set IA32_EFER, 0xC0000080 .set IA32_EFER, 0xC0000080
mov $IA32_EFER, %ecx mov $IA32_EFER, %ecx
rdmsr rdmsr
or $0x100, %eax or $0x100, %eax
@ -255,14 +255,16 @@ long:
or $0x80000001, %eax or $0x80000001, %eax
mov %eax, %cr0 mov %eax, %cr0
lgdt gdt64_ptr
ret ret
// hang: sleep indefinitely // hang: sleep indefinitely
hang: hlt hang: hlt
jmp hang jmp hang
// gdt: Protected mode / Unreal mode 16-bit GDT // gdt16: Protected mode / Unreal mode 16-bit GDT
gdt: // entry 0: null descriptor gdt16: // entry 0: null descriptor
.word 0 .word 0
.word 0 .word 0
.byte 0 .byte 0
@ -283,9 +285,30 @@ gdt: // entry 0: null descriptor
.byte 0b10010010 .byte 0b10010010
.byte 0x8F .byte 0x8F
.byte 0 .byte 0
.set gdt_size, .-gdt .set gdt16_size, .-gdt16
gdt_ptr: .word gdt_size-1 gdt16_ptr: .word gdt16_size-1
.long gdt .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 // Messages to print
msg_start: .asciz "Netboot via fernlader v1 ...\r\n" msg_start: .asciz "Netboot via fernlader v1 ...\r\n"