142 lines
2.5 KiB
NASM
142 lines
2.5 KiB
NASM
SECTION .text
|
|
USE16
|
|
|
|
stage2.entry:
|
|
mov si, stage_msg
|
|
call print
|
|
mov al, '3'
|
|
call print_char
|
|
call print_line
|
|
|
|
|
|
; check for required features
|
|
call cpuid_check
|
|
|
|
; enable A20-Line via IO-Port 92, might not work on all motherboards
|
|
in al, 0x92
|
|
or al, 2
|
|
out 0x92, al
|
|
|
|
mov dword [protected_mode.func], stage3.entry
|
|
jmp protected_mode.entry
|
|
|
|
%include "cpuid.asm"
|
|
%include "gdt.asm"
|
|
%include "long_mode.asm"
|
|
%include "protected_mode.asm"
|
|
%include "thunk.asm"
|
|
|
|
USE32
|
|
|
|
stage3.entry:
|
|
; stage3 stack at 448 KiB (512KiB minus 64KiB disk buffer)
|
|
mov esp, 0x70000
|
|
|
|
; push arguments
|
|
mov eax, thunk.int16
|
|
push eax
|
|
mov eax, thunk.int15
|
|
push eax
|
|
mov eax, thunk.int13
|
|
push eax
|
|
mov eax, thunk.int10
|
|
push eax
|
|
xor eax, eax
|
|
mov al, [disk]
|
|
push eax
|
|
mov eax, kernel.entry
|
|
push eax
|
|
mov eax, [stage3 + 0x18]
|
|
call eax
|
|
.halt:
|
|
cli
|
|
hlt
|
|
jmp .halt
|
|
|
|
kernel:
|
|
.stack: dq 0
|
|
.func: dq 0
|
|
.args: dq 0
|
|
|
|
.entry:
|
|
; page_table: usize
|
|
mov eax, [esp + 4]
|
|
mov [long_mode.page_table], eax
|
|
|
|
; stack: u64
|
|
mov eax, [esp + 8]
|
|
mov [.stack], eax
|
|
mov eax, [esp + 12]
|
|
mov [.stack + 4], eax
|
|
|
|
; func: u64
|
|
mov eax, [esp + 16]
|
|
mov [.func], eax
|
|
mov eax, [esp + 20]
|
|
mov [.func + 4], eax
|
|
|
|
; args: *const KernelArgs
|
|
mov eax, [esp + 24]
|
|
mov [.args], eax
|
|
|
|
; long_mode: usize
|
|
mov eax, [esp + 28]
|
|
test eax, eax
|
|
jz .inner32
|
|
|
|
mov eax, .inner64
|
|
mov [long_mode.func], eax
|
|
jmp long_mode.entry
|
|
|
|
.inner32:
|
|
; disable paging
|
|
mov eax, cr0
|
|
and eax, 0x7FFFFFFF
|
|
mov cr0, eax
|
|
|
|
;TODO: PAE (1 << 5)
|
|
; enable FXSAVE/FXRSTOR, Page Global, and Page Size Extension
|
|
mov eax, cr4
|
|
or eax, 1 << 9 | 1 << 7 | 1 << 4
|
|
mov cr4, eax
|
|
|
|
; set page table
|
|
mov eax, [long_mode.page_table]
|
|
mov cr3, eax
|
|
|
|
; enabling paging and protection simultaneously
|
|
mov eax, cr0
|
|
; Bit 31: Paging, Bit 16: write protect kernel, Bit 0: Protected Mode
|
|
or eax, 1 << 31 | 1 << 16 | 1
|
|
mov cr0, eax
|
|
|
|
; enable FPU
|
|
;TODO: move to Rust
|
|
mov eax, cr0
|
|
and al, 11110011b ; Clear task switched (3) and emulation (2)
|
|
or al, 00100010b ; Set numeric error (5) monitor co-processor (1)
|
|
mov cr0, eax
|
|
fninit
|
|
|
|
mov esp, [.stack]
|
|
mov eax, [.args]
|
|
push eax
|
|
mov eax, [.func]
|
|
call eax
|
|
.halt32:
|
|
cli
|
|
hlt
|
|
jmp .halt32
|
|
|
|
USE64
|
|
|
|
.inner64:
|
|
mov rsp, [.stack]
|
|
mov rax, [.func]
|
|
mov rdi, [.args]
|
|
call rax
|
|
.halt64:
|
|
cli
|
|
hlt
|
|
jmp .halt64
|