2008-08-10 07:23:24 +02:00
|
|
|
|
|
|
|
format MS COFF
|
|
|
|
|
|
|
|
include '../macros.inc'
|
|
|
|
|
|
|
|
$Revision: 849 $
|
|
|
|
|
|
|
|
include "../const.inc"
|
|
|
|
|
|
|
|
public __start
|
|
|
|
|
|
|
|
extrn _high_code
|
|
|
|
extrn __os_stack
|
|
|
|
extrn _boot_mbi
|
|
|
|
extrn _sys_pdbr
|
|
|
|
|
|
|
|
extrn _gdts
|
|
|
|
extrn __edata
|
|
|
|
|
2008-08-13 21:13:40 +02:00
|
|
|
section '.start' code readable align 16
|
2008-08-10 07:23:24 +02:00
|
|
|
|
|
|
|
use32
|
|
|
|
|
|
|
|
align 4
|
|
|
|
|
|
|
|
mboot:
|
|
|
|
dd 0x1BADB002
|
|
|
|
dd 0x00010003
|
|
|
|
dd -(0x1BADB002 + 0x00010003)
|
|
|
|
dd mboot
|
|
|
|
dd 0x100000
|
|
|
|
dd __edata; - OS_BASE
|
|
|
|
dd LAST_PAGE
|
|
|
|
dd __start
|
|
|
|
|
|
|
|
align 16
|
|
|
|
__start:
|
|
|
|
cld
|
|
|
|
|
|
|
|
mov esp, __os_stack +(0x100000000-OS_BASE)
|
|
|
|
push 0
|
|
|
|
popf
|
|
|
|
|
|
|
|
cmp eax, 0x2BADB002
|
|
|
|
mov ecx, sz_invboot
|
|
|
|
jne .fault
|
|
|
|
|
|
|
|
bt dword [ebx], 3
|
|
|
|
mov ecx, sz_nomods
|
|
|
|
jnc .fault
|
|
|
|
|
|
|
|
bt dword [ebx], 6
|
|
|
|
mov ecx, sz_nommap
|
|
|
|
jnc .fault
|
|
|
|
|
|
|
|
mov [_boot_mbi+(0x100000000-OS_BASE)], ebx
|
|
|
|
|
|
|
|
xor eax, eax
|
|
|
|
cpuid
|
|
|
|
cmp eax, 0
|
|
|
|
mov ecx, sz_nopse
|
|
|
|
jbe .fault
|
|
|
|
|
|
|
|
mov eax, 1
|
|
|
|
cpuid
|
|
|
|
bt edx, 3
|
|
|
|
mov ecx, sz_nopse
|
|
|
|
jnc .fault
|
|
|
|
|
|
|
|
; ENABLE PAGING
|
|
|
|
|
|
|
|
mov ecx, 32
|
|
|
|
mov edi, _sys_pdbr+(OS_BASE shr 20)+(0x100000000-OS_BASE)
|
|
|
|
mov eax, PG_LARGE+PG_SW
|
|
|
|
@@:
|
|
|
|
stosd
|
|
|
|
add eax, 4*1024*1024
|
|
|
|
loop @B
|
|
|
|
|
|
|
|
mov dword [_sys_pdbr+(0x100000000-OS_BASE)], PG_LARGE+PG_SW
|
|
|
|
mov dword [_sys_pdbr+(0x100000000-OS_BASE)+4], PG_LARGE+PG_SW+4*1024*1024
|
|
|
|
mov dword [_sys_pdbr+(0x100000000-OS_BASE)+(page_tabs shr 20)], _sys_pdbr+PG_SW+(0x100000000-OS_BASE)
|
|
|
|
|
|
|
|
mov ebx, cr4
|
|
|
|
or ebx, CR4_PSE
|
|
|
|
and ebx, not CR4_PAE
|
|
|
|
mov cr4, ebx
|
|
|
|
|
|
|
|
mov eax, _sys_pdbr+(0x100000000-OS_BASE)
|
|
|
|
mov ebx, cr0
|
|
|
|
or ebx,CR0_PG+CR0_WP
|
|
|
|
|
|
|
|
mov cr3, eax
|
|
|
|
mov cr0, ebx
|
|
|
|
|
|
|
|
mov ebx, [_boot_mbi+(0x100000000-OS_BASE)]
|
|
|
|
|
|
|
|
mov edx, [ebx+20]
|
|
|
|
mov esi, [ebx+24]
|
|
|
|
mov ecx, LAST_PAGE
|
|
|
|
test edx, edx
|
|
|
|
jz .no_mods
|
|
|
|
.scan_mod:
|
|
|
|
mov ecx, [esi+4]
|
|
|
|
add esi, 16
|
|
|
|
dec edx
|
|
|
|
jnz .scan_mod
|
|
|
|
|
|
|
|
.no_mods:
|
|
|
|
add ecx, 4095
|
|
|
|
and ecx, not 4095
|
|
|
|
|
|
|
|
lgdt [_gdts+(0x100000000-OS_BASE)]
|
|
|
|
jmp pword 0x08:_high_code
|
|
|
|
|
|
|
|
|
|
|
|
.fault:
|
|
|
|
; push ecx
|
|
|
|
; call _lcls
|
|
|
|
; call __bprintf
|
|
|
|
_hlt:
|
|
|
|
hlt
|
|
|
|
jmp _hlt
|
|
|
|
|
|
|
|
sz_invboot db 'Invalid multiboot loader magic value',0x0A
|
|
|
|
db 'Halted',0
|
|
|
|
|
|
|
|
sz_nomods db 'No modules loaded',0x0A
|
|
|
|
db 'Halted',0
|
|
|
|
|
|
|
|
sz_nommap db 'No memory table', 0x0A
|
|
|
|
db 'Halted',0
|
|
|
|
|
|
|
|
sz_nopse db 'Page size extensions not supported',0x0A
|
|
|
|
db 'Halted',0
|