mirror of
https://github.com/Zeal-Operating-System/ZealOS.git
synced 2025-03-14 20:15:05 +00:00
110 lines
2.3 KiB
HolyC
Executable file
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
|
|
}
|