erythros/System/Core/Scheduler.HC

79 lines
No EOL
1.9 KiB
HolyC

/* clang-format off */
U0 @scheduler_restore_page_table(U64 i) {
U64 reg R15 _pt = i.u32[1];
if (_pt) { // Use CTask's page table entries
asm {
MOV RAX, R15
MOV_CR3_RAX
}
} else { // Use identity mapping
asm {
MOV EAX, [MEM_PML4]
MOV_CR3_RAX
}
}
}
asm {
ERYTHROS_TASK_CONTEXT_RESTORE_START::
XOR RAX,RAX
INC U64 GS:CCPU.swap_cnter[RAX]
MOV RSI,FS:CTask.addr[RAX]
BT U32 CTask.rflags[RSI],RFLAGf_INT
JNC @@05
BTS U32 GS:CCPU.cpu_flags[RAX],CPUf_RAN_A_TASK
@@05: BT U64 CTask.task_flags[RSI],TASKf_DISABLE_BPTS
JC @@15
MOV RDX,U64 CTask.bpt_lst[RSI]
@@10: TEST RDX,RDX
JZ @@15
MOV RDI,U64 CBpt.addr[RDX]
MOV U8 [RDI],OC_BPT
MOV RDX,U64 CBpt.next[RDX]
JMP @@10
@@15: INC U64 CTask.swap_cnter[RSI]
MOV RAX, U64 CTask.user_data[RSI]
PUSH RAX
CALL I32 &@scheduler_restore_page_table
MOV RAX,U64 CTask.fpu_mmx[RSI]
FXRSTOR U64 [RAX]
MOV RAX,RSP
LEA RSP,U64 CTask.rcx[RSI]
POP RCX
POP RDX
POP RBX
POP RBP
POP RDI
POP R8
POP R9
POP R10
POP R11
POP R12
POP R13
POP R14
POP R15
MOV RSP,RAX
MOV RAX,U64 CTask.rax[RSI]
PUSH CGDT.ds
PUSH U64 CTask.rsp[RSI]
PUSH U64 CTask.rflags[RSI]
PUSH CGDT.cs64
PUSH U64 CTask.rip[RSI]
MOV RSI,U64 CTask.rsi[RSI]
IRET
ERYTHROS_TASK_CONTEXT_RESTORE_END::
NOP
//************************************
}
/* clang-format on */
Function.Patch(_TASK_CONTEXT_RESTORE, ERYTHROS_TASK_CONTEXT_RESTORE_START);
"scheduler ";