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. SYS_RAM_REBOOT 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 }