79 lines
No EOL
1.9 KiB
HolyC
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 "; |