Some simplification and commenting

This commit is contained in:
Thomas Lovén 2017-11-15 20:37:22 +01:00
parent 93d60294ba
commit 4f9a4292e5
2 changed files with 45 additions and 40 deletions

View File

@ -12,19 +12,32 @@ BootStack:
.code32 .code32
error: error:
// Print "ERR!" in upper left corner // Print "ERR!" in upper left corner
mov [0xb8000], dword ptr 0x4f524f45 mov [0xb8000], dword ptr 0x4f004f00
mov [0xb8004], dword ptr 0x4f214f52 mov [0xb8004], dword ptr 0x4f004f00
mov [0xb8000], byte ptr 'E'
mov [0xb8002], byte ptr 'R'
mov [0xb8004], byte ptr 'R'
mov [0xb8006], byte ptr '!'
jmp $ jmp $
check_cpuid: check_cpuid:
// Save EFLAGS
pushfd pushfd
// Try to modify EFLAGS.ID
pushfd pushfd
xor dword ptr[esp], 1<<21 xor dword ptr [esp], 1<<21
popfd popfd
//Read EFLAGS into eax
pushfd pushfd
pop eax pop eax
xor eax, [esp]
// Restore original EFLAGS
popfd popfd
// Check if EFLAGS.ID was modified
xor eax, [esp+4]
and eax, 1<<21 and eax, 1<<21
jz error jz error
ret ret
@ -47,43 +60,41 @@ check_longmode:
.global _start .global _start
_start: _start:
cli cli
mov esp, offset BootStack mov esp, offset BootStack
call check_cpuid call check_cpuid
call check_longmode call check_longmode
mov eax, cr4 mov eax, cr4
or eax, 1<<5 or eax, 1<<5
mov cr4, eax mov cr4, eax
mov eax, offset BootP4 mov eax, offset BootP4
mov cr3, eax mov cr3, eax
mov ecx, 0x0C0000080 mov ecx, 0x0C0000080
rdmsr rdmsr
or eax, 1<<8 or eax, 1<<8
wrmsr wrmsr
mov eax, cr0 mov eax, cr0
or eax, 1<<31 or eax, 1<<31
mov cr0, eax mov cr0, eax
lgdt [BootGDTp] lgdt [BootGDTp]
.extern long_mode_start
jmp 0x8:long_mode_start jmp 0x8:long_mode_start
.code64 .code64
long_mode_start: long_mode_start:
mov eax, 0x0 mov eax, 0x0
mov ss, eax mov ss, eax
mov ds, eax mov ds, eax
mov es, eax mov es, eax
mov fs, eax mov fs, eax
mov gs, eax mov gs, eax
jmp $ jmp $

View File

@ -7,16 +7,10 @@
BootP4: BootP4:
.quad offset BootP3 + (PAGE_PRESENT | PAGE_WRITE) .quad offset BootP3 + (PAGE_PRESENT | PAGE_WRITE)
.rept ENTRIES_PER_PT - 1 .rept ENTRIES_PER_PT - 1
.quad 0x0 .quad 0
.endr .endr
BootP3: BootP3:
.quad offset BootP2 + (PAGE_PRESENT | PAGE_WRITE) .quad 0 + (PAGE_PRESENT | PAGE_WRITE | PAGE_HUGE)
.rept ENTRIES_PER_PT - 1 .rept ENTRIES_PER_PT - 1
.quad 0x0 .quad 0
.endr
BootP2:
.set i, 0
.rept ENTRIES_PER_PT
.quad (i << 21 ) + (PAGE_PRESENT | PAGE_WRITE | PAGE_HUGE)
.set i, (i+1)
.endr .endr