diff --git a/lboot.S b/lboot.S index 91e1c30..641c4be 100644 --- a/lboot.S +++ b/lboot.S @@ -37,8 +37,9 @@ _start: cli call print call paging - mov $msg_fin, %si + mov $msg_long, %si call print + call long jmp hang @@ -231,6 +232,35 @@ _prnext: mov $COM1+5, %dx _prdone: ret + // long: Enter long mode +long: + // Enable PAE + mov %cr4, %eax + or $0b100000, %eax + mov %eax, %cr4 + + // Load page table + mov pml4_ptr, %eax + mov %eax, %cr3 + + // Enable long mode +.set IA32_EFER, 0xC0000080 + mov $IA32_EFER, %ecx + rdmsr + or $0x100, %eax + wrmsr + + // Enable protected mode + paging + mov %cr0, %eax + or $0x80000001, %eax + mov %eax, %cr0 + + ret + + // hang: sleep indefinitely +hang: hlt + jmp hang + // gdt: Protected mode / Unreal mode 16-bit GDT gdt: // entry 0: null descriptor .word 0 @@ -257,10 +287,6 @@ gdt: // entry 0: null descriptor gdt_ptr: .word gdt_size-1 .long gdt - // hang: sleep indefinitely -hang: hlt - jmp hang - // Messages to print msg_start: .asciz "Netboot via fernlader v1 ...\r\n" msg_a20: .asciz " * Enabling A20\r\n" @@ -268,7 +294,7 @@ msg_unreal: .asciz " * Unreal Mode\r\n" msg_getmap: .asciz " * Memory Map\r\n" msg_mkheap: .asciz " * Making Space\r\n" msg_paging: .asciz " * Paging\r\n" -msg_fin: .asciz "Finished.\r\n" +msg_long: .asciz " * Long Mode\r\n" msg_aerr: .asciz "panic: Out of heap space.\r\n" heap_start: .long 0