ZealOS/src/Kernel/KStart64.ZC

110 lines
2.3 KiB
HolyC
Executable file

asm {
USE64
BTS U32 [SYS_RUN_LEVEL], RLf_64BIT
//Set required bits for SSE instruction execution
MOV_RAX_CR4
BTS RAX, CR4f_OSFXSR
MOV_CR4_RAX
MOV_EAX_CR0
BTR RAX, CR0f_EM
BTR RAX, CR0f_MP
BTS RAX, CR0f_NE
MOV_CR0_EAX
FNINIT
MOV RAX, SYS_FIXED_AREA + CSysFixedArea.init_fpu_mmx
FXSAVE U64 [RAX]
//Init CPU0 Struct
PUSH SYS_FIXED_AREA + CSysFixedArea.system
PUSH SYS_FIXED_AREA + CSysFixedArea.boot_cpu
PUSH 0
CALL &CPUStructInit
CALL SET_GS_BASE
//Init System HeapCtrl
MOV EDI, U32 SYS_FIXED_AREA + CSysFixedArea.system_hc
MOV EAX, U32 SYS_FIXED_AREA + CSysFixedArea.sys_code_bp
MOV U64 CHeapCtrl.bp[RDI],RAX
MOV U32 CHeapCtrl.hc_signature[RDI], HEAP_CTRL_SIGNATURE_VAL
LEA RAX, U64 CHeapCtrl.next_um - CMemUsed.next[RDI]
MOV U64 CHeapCtrl.next_um[RDI], RAX
MOV U64 CHeapCtrl.last_um[RDI], RAX
MOV EAX, U32 SYS_FIXED_AREA + CSysFixedArea.system
MOV U64 CHeapCtrl.mem_task[RDI], RAX
MOV U64 CTask.code_heap[RAX], RDI
MOV U64 CTask.data_heap[RAX], RDI
MOV U32 CTask.task_signature[RAX], TASK_SIGNATURE_VAL
BTS U32 [SYS_RUN_LEVEL], RLf_16MEG_SYSTEM_HEAP_CTRL
PUSH MEM_SYSTEM_STACK
PUSH U32 SYS_FIXED_AREA + CSysFixedArea.system
CALL &TaskInit
CALL SET_FS_BASE
MOV RSP, U64 CTask.rsp[RAX]
JMP I32 &KMain
//************************************
USE32
SYS_ENTER_LONG_MODE:: //Switch to long 64-bit mode
MOV_EAX_CR4
OR EAX, CR4F_PAE | CR4F_PGE
MOV_CR4_EAX
MOV EAX, [MEM_PML4]
MOV_CR3_EAX
MOV ECX, IA32_EFER
XOR EDX, EDX
MOV EAX, IA32F_LME
WRMSR
MOV_EAX_CR0
BTS EAX, 31 //Enable paging (required for 64-bit mode)
MOV_CR0_EAX
DU8 0xEA; //JMP CGDT.cs64:@@05
DU32 @@05;
DU16 CGDT.cs64;
USE64
@@05: MOV AX, CGDT.ds
MOV DS, AX
MOV ES, AX
MOV SS, AX
MOV FS, AX
MOV GS, AX
RET
//************************************
SYS_RAM_REBOOT:: //This gets copied high. $LK,"SYS_RAM_REBOOT",A="FF:::/System/Boot/BootRAM.ZC,SYS_RAM_REBOOT:2"$
PUSH U32 CGDT.ds //stack seg
PUSH U32 [SYS_BOOT_STACK]//stack
PUSH U32 0 //flags
PUSH U32 CGDT.cs32
LEA RAX, [@@10]
PUSH RAX
IRET
USE32
@@10: WBINVD
//Disable paging
MOV_EAX_CR0
BTR EAX, 31
MOV_CR0_EAX
MOV ECX, IA32_EFER
XOR EDX, EDX
XOR EAX, EAX
WRMSR
MOV EBX, BOOT_SRC_RAM
MOV EAX, I32 CORE0_32BIT_INIT
JMP EAX
SYS_RAM_REBOOT_END::
USE64
}