Set up a separate long-mode GDT
This commit is contained in:
parent
0bfcd7afd2
commit
c24a6014f7
1 changed files with 31 additions and 8 deletions
39
lboot.S
39
lboot.S
|
|
@ -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"
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue