TempleOSCDV3.12.ISO

This commit is contained in:
Terry A. Davis authored and minexew committed 2018-09-08 21:46:35 +02:00
1 parent ed64d7e3b8
commit 046e83368d
62 files changed
+2371 -2298

No files matched your search

+44 -68
View File
@@ -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.