TempleOSCDV3.12.ISO
This commit is contained in:
1 parent
ed64d7e3b8
commit
046e83368d
62 files changed
+2371
-2298
No files matched your search
+44
-68
@@ -32,11 +32,26 @@ The scheduler checks for a few keys:
|
||||
Each core has its own circular task queue.
|
||||
For AP processors, they have a "Seth" task
|
||||
which stays in a loop waiting for jobs or
|
||||
requests to spawn tasks. See $LK,"APSethTask",A="MN:APSethTask"$().
|
||||
requests to spawn tasks. See $LK,"CoreAPSethTask",A="MN:CoreAPSethTask"$().
|
||||
$HL,1$*/
|
||||
|
||||
U0 TaskFocusNext()
|
||||
{
|
||||
CTask *task,*_task=sys_focus_task;
|
||||
sys_focus_task=NULL;
|
||||
if (!_task) _task=adam_task;
|
||||
task=_task->next_task;
|
||||
do {
|
||||
if (!Bt(&task->win_inhibit,WIf_SELF_FOCUS)) {
|
||||
sys_focus_task=task;
|
||||
CallExtNum(EXT_WIN_TO_TOP,task,TRUE);
|
||||
return;
|
||||
}
|
||||
task=task->next_task;
|
||||
} while (task!=_task);
|
||||
}
|
||||
|
||||
asm {
|
||||
//************************************
|
||||
TASK_CONTEXT_SAVE::
|
||||
//OUT: RSI=FS
|
||||
PUSH RSI
|
||||
@@ -147,15 +162,7 @@ _TASK_END_NOW::
|
||||
CALL &TaskEnd
|
||||
MOV RSI,RAX
|
||||
CALL SET_FS_BASE
|
||||
JMP I8 RESTORE_RSI_TASK_WITH_KEY_CHECK
|
||||
|
||||
RESTORE_RSI_TASK:
|
||||
BT U32 [SYS_CTRL_ALT_FLAGS],SYSf_CTRL_ALT_DEL
|
||||
JC I32 HANDLE_SWAP_KEY_EVENT
|
||||
XOR RAX,RAX
|
||||
CMP U64 GS:CCPU.idle_task[RAX],RSI
|
||||
JNE RESTORE_RSI_TASK_NO_KEY_CHECK
|
||||
JMP I32 SWAP_IN_SETH_TASK_IF_READY
|
||||
JMP I8 RESTORE_RSI_TASK
|
||||
|
||||
_YIELD::
|
||||
PUSHFD
|
||||
@@ -189,12 +196,12 @@ _YIELD::
|
||||
MOV U64 CTask.rsp[RSI],RSP
|
||||
MOV RSI,U64 CTask.next_task[RSI]
|
||||
|
||||
RESTORE_RSI_TASK_WITH_KEY_CHECK:
|
||||
RESTORE_RSI_TASK:
|
||||
TEST U64 [SYS_CTRL_ALT_FLAGS],1<<SYSf_CTRL_ALT_DEL|
|
||||
1<<SYSf_CTRL_ALT_TAB|1<<SYSf_CTRL_ALT_X|1<<SYSf_CTRL_ALT_C
|
||||
JNZ HANDLE_SWAP_KEY_EVENT
|
||||
JNZ HANDLE_SYSF_KEY_EVENT
|
||||
|
||||
RESTORE_RSI_TASK_NO_KEY_CHECK:
|
||||
RESTORE_RSI_TASK2:
|
||||
@@20: BT U64 CTask.task_flags[RSI],TASKf_KILL_TASK
|
||||
JC I32 END_RSI_TASK
|
||||
TEST U64 CTask.task_flags[RSI],
|
||||
@@ -219,117 +226,86 @@ RESTORE_RSI_TASK_NO_KEY_CHECK:
|
||||
MOV RSP,U64 CTask.stk[RAX]
|
||||
ADD RSP,DFT_STK+CTaskStk.stk_base //Rst to top
|
||||
CALL SET_FS_BASE
|
||||
STI //Swap-in idle task so we can unmask IRQs.
|
||||
STI //Restore idle task so we can unmask IRQs.
|
||||
HLT
|
||||
SYS_IDLE_PT::
|
||||
CLI
|
||||
|
||||
SWAP_IN_SETH_TASK_IF_READY:
|
||||
RESTORE_SETH_TASK_IF_READY:
|
||||
XOR RAX,RAX
|
||||
MOV RSI,GS:CCPU.seth_task[RAX]
|
||||
JMP RESTORE_RSI_TASK_WITH_KEY_CHECK
|
||||
JMP RESTORE_RSI_TASK
|
||||
|
||||
HANDLE_SWAP_KEY_EVENT:
|
||||
HANDLE_SYSF_KEY_EVENT:
|
||||
MOV RAX,RSI
|
||||
CALL SET_FS_BASE
|
||||
XOR RAX,RAX
|
||||
MOV RAX,GS:CCPU.num[RAX]
|
||||
XOR RBX,RBX
|
||||
MOV RAX,GS:CCPU.num[RBX]
|
||||
TEST RAX,RAX
|
||||
JNZ I32 RESTORE_RSI_TASK_NO_KEY_CHECK
|
||||
JNZ I32 RESTORE_RSI_TASK2
|
||||
|
||||
MOV EAX,U32 SYS_CTRL_ALT_FLAGS
|
||||
LOCK
|
||||
BTR U32 [RAX],SYSf_CTRL_ALT_DEL
|
||||
JC I32 &Reboot
|
||||
|
||||
CMP U64 GS:CCPU.idle_task[RBX],RSI
|
||||
JE RESTORE_SETH_TASK_IF_READY
|
||||
|
||||
LOCK
|
||||
BTR U32 [RAX],SYSf_CTRL_ALT_TAB
|
||||
JNC @@05
|
||||
PUSH RSI
|
||||
MOV RSI,U64 [SYS_FOCUS_TASK]
|
||||
MOV U64 [SYS_FOCUS_TASK],0
|
||||
CALL FOCUS_RSI_NEXT_USER
|
||||
POP RSI
|
||||
JMP I32 RESTORE_FS_TASK_WITH_KEY_CHECK
|
||||
CALL &TaskFocusNext
|
||||
JMP I32 RESTORE_FS_TASK
|
||||
|
||||
@@05: LOCK
|
||||
BTR U32 [RAX],SYSf_CTRL_ALT_X
|
||||
JC END_FOCUS_USER
|
||||
LOCK
|
||||
BTR U32 [RAX],SYSf_CTRL_ALT_C
|
||||
JNC I32 RESTORE_RSI_TASK_WITH_KEY_CHECK
|
||||
JNC I32 RESTORE_RSI_TASK
|
||||
|
||||
BREAK_FOCUS_USER:
|
||||
MOV RSI,U64 [SYS_FOCUS_TASK]
|
||||
TEST RSI,RSI
|
||||
JZ SWAP_IN_SETH_TASK_IF_READY
|
||||
JZ RESTORE_SETH_TASK_IF_READY
|
||||
BT U64 CTask.win_inhibit[RSI],WIf_SELF_FOCUS
|
||||
JC I32 RESTORE_RSI_TASK_NO_KEY_CHECK
|
||||
JC I32 RESTORE_RSI_TASK
|
||||
LOCK
|
||||
BTR U64 CTask.task_flags[RSI],TASKf_BREAK_LOCKED
|
||||
JNC @@10
|
||||
LOCK
|
||||
BTS U64 CTask.task_flags[RSI],TASKf_PENDING_BREAK
|
||||
JMP I32 RESTORE_RSI_TASK_NO_KEY_CHECK
|
||||
JMP I32 RESTORE_RSI_TASK
|
||||
|
||||
@@10: MOV RAX,&SysThrowBreak
|
||||
MOV U64 CTask.rip[RSI],RAX
|
||||
BT U64 CTask.task_flags[RSI],TASKf_BREAK_TO_SHIFT_ESC
|
||||
JC @@15
|
||||
JC I32 RESTORE_RSI_TASK
|
||||
|
||||
//Do these now, in case interrupt happens.
|
||||
MOV U64 CTask.wake_jiffy[RSI],0
|
||||
PUSH RSI
|
||||
CALL &TaskRstAwaitingMsg
|
||||
|
||||
@@15: JMP I32 RESTORE_RSI_TASK_NO_KEY_CHECK
|
||||
JMP I32 RESTORE_RSI_TASK
|
||||
|
||||
END_FOCUS_USER:
|
||||
MOV RSI,U64 [SYS_FOCUS_TASK]
|
||||
MOV U64 [SYS_FOCUS_TASK],0
|
||||
PUSH RSI
|
||||
CALL FOCUS_RSI_NEXT_USER
|
||||
POP RSI
|
||||
CALL &TaskFocusNext
|
||||
TEST RSI,RSI
|
||||
JZ I32 SWAP_IN_SETH_TASK_IF_READY
|
||||
JZ I32 RESTORE_SETH_TASK_IF_READY
|
||||
MOV RAX,RSI
|
||||
CALL SET_FS_BASE
|
||||
BT U64 CTask.win_inhibit[RSI],WIf_SELF_FOCUS
|
||||
JC I32 RESTORE_RSI_TASK_WITH_KEY_CHECK
|
||||
JC I32 RESTORE_RSI_TASK
|
||||
LOCK
|
||||
BTS U64 CTask.task_flags[RSI],TASKf_KILL_TASK
|
||||
JMP I32 END_RSI_TASK
|
||||
|
||||
RESTORE_FS_TASK_WITH_KEY_CHECK:
|
||||
RESTORE_FS_TASK:
|
||||
XOR RSI,RSI
|
||||
MOV RSI,FS:CTask.addr[RSI]
|
||||
JMP I32 RESTORE_RSI_TASK_WITH_KEY_CHECK
|
||||
|
||||
FOCUS_RSI_NEXT_USER:
|
||||
TEST RSI,RSI
|
||||
JNZ @@20
|
||||
MOV ESI,U32 SYS_FIXED_AREA+CSysFixedArea.adam
|
||||
@@20: MOV RDI,RSI
|
||||
MOV RSI,U64 CTask.next_task[RSI]
|
||||
@@25: BT U64 CTask.win_inhibit[RSI],WIf_SELF_FOCUS
|
||||
JC @@30
|
||||
CMP U64 [SYS_FOCUS_TASK],RSI
|
||||
JE @@30
|
||||
MOV U64 [SYS_FOCUS_TASK],RSI
|
||||
MOV RAX,U64 [SYS_EXTERN_TABLE]
|
||||
MOV RAX,U64 EXT_WIN_TO_TOP*8[RAX]
|
||||
TEST RAX,RAX
|
||||
JZ @@35
|
||||
PUSH TRUE
|
||||
PUSH RSI
|
||||
CALL RAX
|
||||
JMP @@35
|
||||
@@30: MOV RSI,U64 CTask.next_task[RSI]
|
||||
CMP RSI,RDI
|
||||
JNE @@25
|
||||
MOV U64 [SYS_FOCUS_TASK],0
|
||||
@@35: RET
|
||||
|
||||
JMP I32 RESTORE_RSI_TASK
|
||||
}
|
||||
|
||||
_extern _TASK_CONTEXT_RESTORE U0 TaskContextRestore(); //Restore a task context.
|
||||
|
||||
Reference in new issue
Block a user