Files
TempleOS-Rijn/LT/OSMain/Scheduler.ASZ
T
2018-09-08 21:45:20 +02:00

331 lines
6.5 KiB
Plaintext

////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
IDLE_START::
SAVE_CONTEXT::
PUSH RAX
PUSHFD
XOR EAX,EAX
MOV RAX,FS:TSS_ABSOLUTE_ADDRESS[RAX]
POP U8 TSS_RFLAGS[RAX]
MOV U8 TSS_RBX[RAX],RBX
MOV U8 TSS_RCX[RAX],RCX
MOV U8 TSS_RDX[RAX],RDX
MOV U8 TSS_RSI[RAX],RSI
MOV U8 TSS_RDI[RAX],RDI
MOV U8 TSS_RBP[RAX],RBP
MOV U8 TSS_R8[RAX],R8
MOV U8 TSS_R9[RAX],R9
MOV U8 TSS_R10[RAX],R10
MOV U8 TSS_R11[RAX],R11
MOV U8 TSS_R12[RAX],R12
MOV U8 TSS_R13[RAX],R13
MOV U8 TSS_R14[RAX],R14
MOV U8 TSS_R15[RAX],R15
POP U8 TSS_RAX[RAX]
MOV RSI,RAX
XOR EAX,EAX
RDTSC
SHL RDX,32
ADD RAX,RDX
MOV RBX,RAX
@@31: LOCK
BTS U4 [SYS_SEMAS+SYS_SEMA_TIMESTAMP*SEMA_STRUCT_SIZE],0
JC @@31
SUB RBX,U8 TSS_TIME_SLICE_START[RSI]
ADD U8 TSS_TOTAL_TIME[RSI],RBX
LOCK
BTR U4 [SYS_SEMAS+SYS_SEMA_TIMESTAMP*SEMA_STRUCT_SIZE],0
FSAVE U4 TSS_FPU[RSI]
BT U4 TSS_TASK_FLAGS[RSI],TSSf_DISABLE_BPTS
JC @@4
MOV RSI,U8 TSS_BPT_LIST[RSI]
@@3: OR RSI,RSI
JZ @@4
MOV RDI,U8 BPT_ADDRESS[RSI]
MOV AL,U1 BPT_U1[RSI]
MOV U1 [RDI],AL
MOV RSI,U8 BPT_NEXT[RSI]
JMP @@3
@@4: RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
RESTORE_CONTEXT::
XOR EAX,EAX
MOV RAX,GS:CPU_ABSOLUTE_ADDRESS[RAX]
LOCK
INC U8 CPU_SWAP_CNTER[RAX]
XOR EAX,EAX
MOV RSI,FS:TSS_ABSOLUTE_ADDRESS[RAX]
BT U4 TSS_TASK_FLAGS[RSI],TSSf_DISABLE_BPTS
JC @@4
MOV RDX,U8 TSS_BPT_LIST[RSI]
@@3: OR RDX,RDX
JZ @@4
MOV RDI,U8 BPT_ADDRESS[RDX]
CMP RDI,U8 TSS_RIP[RSI]
JNE @@5
BTR U8 BPT_FLAGS[RDX],SBPTf_DISABLE
JC @@6
@@5: MOV AL,U1 [RDI]
MOV U1 BPT_U1[RDX],AL
MOV U1 [RDI],0xCC
@@6: MOV RDX,U8 BPT_NEXT[RDX]
JMP @@3
@@4: INC U8 TSS_SWAP_CNTER[RSI]
FRSTOR U4 TSS_FPU[RSI]
XOR EAX,EAX
RDTSC
SHL RDX,32
ADD RAX,RDX
MOV RBX,RAX
MOV U8 TSS_TIME_SLICE_START[RSI],RBX
MOV RBX,U8 TSS_RBX[RSI]
MOV RCX,U8 TSS_RCX[RSI]
MOV RDX,U8 TSS_RDX[RSI]
MOV RDI,U8 TSS_RDI[RSI]
MOV RBP,U8 TSS_RBP[RSI]
MOV R8,U8 TSS_R8[RSI]
MOV R9,U8 TSS_R9[RSI]
MOV R10,U8 TSS_R10[RSI]
MOV R11,U8 TSS_R11[RSI]
MOV R12,U8 TSS_R12[RSI]
MOV R13,U8 TSS_R13[RSI]
MOV R14,U8 TSS_R14[RSI]
MOV R15,U8 TSS_R15[RSI]
MOV RAX,U8 TSS_RAX[RSI]
PUSH ZERO_DS_SEL
PUSH U8 TSS_RSP[RSI]
PUSH U8 TSS_RFLAGS[RSI]
PUSH SYS_CS64_SEL
PUSH U8 TSS_RIP[RSI]
MOV RSI,U8 TSS_RSI[RSI]
IRET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
END_TASK_EVT::
MOV RAX,RSI
CALL PUT_FS_BASE
CALL END_TASK
MOV RSI,RAX
CALL PUT_FS_BASE
JMP SIN_PART2
ALIGN 8,OC_NOP
SWAP_IN_NEXT::
PUSHFD
CLI
CALL SAVE_CONTEXT
XOR ESI,ESI
MOV RSI,FS:TSS_ABSOLUTE_ADDRESS[RSI]
MOV RBX,U4 IDLE_POINT
MOV U8 TSS_RIP[RSI],RBX
POP U8 TSS_RFLAGS[RSI]
MOV U8 TSS_RSP[RSI],RSP
SIN_PART1::
MOV RSI,U8 TSS_NEXT_TSS[RSI]
SIN_PART2::
TEST U4 [SYS_FLAGS],1<<SYSf_CTRL_ALT_DEL|1<<SYSf_CTRL_ALT_ESC|
1<<SYSf_CTRL_ALT_TAB|1<<SYSf_CTRL_ALT_X|1<<SYSf_CTRL_ALT_C
JNZ SWAP_EVT
SIN_PART3::
BT U4 TSS_TASK_FLAGS[RSI],TSSf_KILL_TASK
JC END_TASK_EVT
@@1: TEST U4 TSS_TASK_FLAGS[RSI],1<<TSSf_AWAITING_MSG|1<<TSSf_SUSPENDED
JNZ SIN_PART1
CMP U4 TSS_IN_QUEUE_SIGNATURE[RSI],TSSS_IN_QUEUE_SIGNATURE
JNE RECOVER_FROM_BAD_TASK
MOV RAX,RSI
CALL PUT_FS_BASE
JMP U4 RESTORE_CONTEXT
RECOVER_FROM_BAD_TASK::
XOR EAX,EAX
MOV RAX,GS:CPU_ABSOLUTE_ADDRESS[RAX]
MOV RSI,U8 CPU_CAIN_TSS[RAX]
JMP SIN_PART2
ALIGN 8,OC_NOP
IDLE_POINT::
RET
ALIGN 8,OC_NOP
SWAP_EVT::
MOV RAX,RSI
CALL PUT_FS_BASE
XOR EAX,EAX
MOV RAX,GS:CPU_ABSOLUTE_ADDRESS[RAX]
MOV RAX,U8 CPU_NUM[RAX]
OR RAX,RAX
JNZ SIN_PART3
MOV RAX,U4 SYS_FLAGS
BTR U4 [RAX],SYSf_CTRL_ALT_DEL
JC U4 CP_REBOOT
BTR U4 [RAX],SYSf_CTRL_ALT_ESC
JNC @@2
CALL SPAWN_USER_AND_ACTIVATE
JMP CONT_SWAP2
@@2: BTR U4 [RAX],SYSf_CTRL_ALT_TAB
JNC @@3
CALL CP_ACTIVATE_NEXT_USER
JMP CONT_SWAP2
@@3: BTR U4 [RAX],SYSf_CTRL_ALT_X
JC END_ACTIVE_USER
BTR U4 [RAX],SYSf_CTRL_ALT_C
JNC U4 SIN_PART2
BREAK_ACTIVE_USER::
MOV RSI,U8 [SYS_CUR_FOCUS_TASK]
OR RSI,RSI
JZ RECOVER_FROM_BAD_TASK
BT U4 TSS_TASK_FLAGS[RSI],TSSf_LOCAL_USER
JNC U4 SIN_PART3
MOV RAX,CP_BREAK
MOV U8 TSS_RIP[RSI],RAX
JMP U4 SIN_PART3
END_ACTIVE_USER::
CALL DEACTIVATE_USER
PUSH RSI
CALL ACTIVATE_NEXT_USER
POP RSI
OR RSI,RSI
JZ U4 RECOVER_FROM_BAD_TASK
MOV RAX,RSI
CALL PUT_FS_BASE
BT U4 TSS_TASK_FLAGS[RSI],TSSf_LOCAL_USER
JNC U4 SIN_PART2
BTS U4 TSS_TASK_FLAGS[RSI],TSSf_KILL_TASK
CONT_SWAP2::
XOR ESI,ESI
MOV RSI,FS:TSS_ABSOLUTE_ADDRESS[RSI]
JMP U4 SIN_PART2
IDLE_END::
////**************************PROCEDURE*************************
MSG_USER_CMD_DESC: DU1 "User CMD",0;
ALIGN 8,OC_NOP
SPAWN_USER_AND_ACTIVATE::
PUSHFD
CLI
PUSH RAX
PUSH RCX
PUSH RDX
PUSH RBX
PUSH RBP
PUSH RSI
PUSH RDI
MOV U8 [SYS_CUR_FOCUS_TASK],0
PUSH TRUE //add to queue
PUSH DEFAULT_STACK
PUSH 0 ///use adam account
PUSH 0 //Adam is parent
PUSH U4 MSG_USER_CMD_DESC
PUSH U4 CP_USER_CMD_LINE
CALL CP_SPAWN_TASK
ADD RSP,48
PUSH RAX
MOV RAX,U8 [SYS_EXTERN_TABLE]
MOV RAX,U8 EXT_WIN_TO_TOP*8[RAX]
OR RAX,RAX
JZ @@1
CALL RAX
@@1: ADD RSP,8
POP RDI
POP RSI
POP RBP
POP RBX
POP RDX
POP RCX
POP RAX
POPFD
RET
////**************************PROCEDURE*************************
//IN: RSI=CUR User TSS
ALIGN 8,OC_NOP
ACTIVATE_NEXT_USER:
PUSHFD
CLI
PUSH RDI
OR RSI,RSI
JNZ @@11
MOV RSI,U4 SYS_ADAM_TSS
@@11: MOV RDI,RSI
MOV RSI,U8 TSS_NEXT_TSS[RSI]
@@14: BT U4 TSS_TASK_FLAGS[ESI],TSSf_LOCAL_USER
JNC @@19
CMP U8 [SYS_CUR_FOCUS_TASK],RSI
JE @@19
MOV U8 [SYS_CUR_FOCUS_TASK],RSI
MOV RAX,U8 [SYS_EXTERN_TABLE]
MOV RAX,U8 EXT_WIN_TO_TOP*8[RAX]
OR RAX,RAX
JZ @@19B
PUSH RAX
PUSH RCX
PUSH RDX
PUSH RBX
PUSH RBP
PUSH RSI
PUSH RDI
PUSH RSI
CALL RAX
ADD RSP,8
POP RDI
POP RSI
POP RBP
POP RBX
POP RDX
POP RCX
POP RAX
JMP @@19B
@@19: MOV RSI,U8 TSS_NEXT_TSS[RSI]
CMP RSI,RDI
JNE @@14
@@19B: POP RDI
POPFD
RET
////**************************PROCEDURE*************************
//OUT: ESI=TSS OF User
ALIGN 8,OC_NOP
DEACTIVATE_USER:
MOV RSI,U8 [SYS_CUR_FOCUS_TASK]
MOV U8 [SYS_CUR_FOCUS_TASK],0
RET
////**************************PROCEDURE*************************
//IN: ESI=CUR User TSS
ALIGN 8,OC_NOP
CP_ACTIVATE_NEXT_USER::
PUSH RSI
CALL DEACTIVATE_USER
CALL ACTIVATE_NEXT_USER
POP RSI
RET
////**************************PROCEDURE*************************
ALIGN 8,OC_NOP
CP_DEACTIVATE_USER::
PUSH RSI
CALL DEACTIVATE_USER
MOV RAX,RSI
POP RSI
RET