The code is below:
Code: Select all
[BITS 32]
pMode:
; Setup Stack Pointer
mov ax, 0x10
mov ds, ax
mov ss, ax
mov esp, 0x090000
; Setup Registers
mov eax, 0x10
xor ecx, ecx
mov ds, ax
mov es, ax
mov ss, ax
mov fs, cx
mov gs, cx
; Clear Page Tables
xor eax, eax
mov edi, 0x200000
mov ecx, 512*8
rep stosd
; Setup Temp Page Tables
mov dword [0x200000], 0x201000 | 111b ; PML4
mov dword [0x201000], 0x202000 | 111b ; PDP (Entry 1)
mov dword [0x202000], 0x0 | 010000111b ;1st PD Entry points to 0-2MB
mov dword [0x203000], 0x200000 | 010000111b ;2st PD Entry points to 2-4MB
mov dword [0x204000], 0x400000 | 010000111b ;3st PD Entry points to 4-6MB
mov dword [0x205000], 0x600000 | 010000111b ;4st PD Entry points to 6-8MB
mov dword [0x206000], 0x800000 | 010000111b ;5st PD Entry points to 8-10MB
; Setup CR3
mov eax, 0x200000
mov cr3, eax
; Enable CR4.PAE=1
mov eax, cr4
bts eax, 5
mov cr4, eax
; Enable EFER.LME=1
mov ecx, 0C0000080h
rdmsr
bts eax, 8
wrmsr
; Enable Paging
mov eax, cr0
bts eax, 31
mov cr0, eax
mov dword [0x1000], 0x4 ; This doesn't triple fault
mov dword [0x10000], 0x3 ; This doesn't triple fault
mov dword [0x100000], 0x6 ; This doesn't triple fault
mov dword [0x20C000], 0x6 ; This does triple fault
Bochs gets this error and restarts:
interrupt(long mode): gate descriptor is not valid sys seg
How can I fix this?
Thanks in advance.