ZealOS/src/Kernel/KStart64.CC
xmm15 889d97383d 2 Spaces -> 1 Tab (4 spaced) for indentation
Fixed PCILookUpSingle code for this change
EdCodeTools reindent needs to be updated
2020-02-20 17:40:10 -06:00

110 lines
2.5 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.zenith
PUSH SYS_FIXED_AREA+CSysFixedArea.boot_cpu
PUSH 0
CALL &CPUStructInit
CALL SET_GS_BASE
//Init Zenith HeapCtrl
MOV EDI,U32 SYS_FIXED_AREA+CSysFixedArea.zenith_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.zenith
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_ZENITH_HEAP_CTRL
PUSH MEM_ZENITH_STACK
PUSH U32 SYS_FIXED_AREA+CSysFixedArea.zenith
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:::/Zenith/Boot/BootRAM.CC,SYS_RAM_REBOOT:2"$
PUSH U32 CGDT.ds //stack seg
PUSH U32 BOOT_RAM_LIMIT //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
}