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

258 lines
5.2 KiB
Plaintext

////**************************PROCEDURE*************************
ALIGN 8,0x90
SAVE_CONTEXT::
PUSHFD
POP U4 FS:[TSS_EFLAGS]
MOV U4 FS:[TSS_EAX],EAX
MOV U4 FS:[TSS_EBX],EBX
MOV U4 FS:[TSS_ECX],ECX
MOV U4 FS:[TSS_EDX],EDX
MOV U4 FS:[TSS_ESI],ESI
MOV U4 FS:[TSS_EDI],EDI
MOV U4 FS:[TSS_EBP],EBP
MOV ESI,U4 FS:[TSS_ABSOLUTE_ADDRESS]
FSAVE U4 TSS_FPU[ESI]
BT U4 [SYS_FLAGS],SYSf_PREEMPTIVE
JC @@1
BTR U4 FS:[TSS_TASK_FLAGS],TSSf_PREEMPT
JMP @@2
@@1: BTS U4 FS:[TSS_TASK_FLAGS],TSSf_PREEMPT
@@2: PUSH EAX
PUSH ESI
PUSH EDI
MOV ESI,U4 FS:[TSS_BPT_LIST]
@@3: OR ESI,ESI
JZ @@4
MOV EDI,U4 BPT_ADDRESS[ESI]
MOV AL,U1 BPT_U1[ESI]
MOV U1 [EDI],AL
MOV ESI,U4 BPT_NEXT[ESI]
JMP @@3
@@4: POP EDI
POP ESI
POP EAX
RET
////**************************PROCEDURE*************************
ALIGN 8,0x90
RESTORE_CONTEXT::
INC U4 [SYS_SWAPS_CNTER]
MOV ESI,U4 FS:[TSS_BPT_LIST]
@@3: OR ESI,ESI
JZ @@4
MOV EDI,U4 BPT_ADDRESS[ESI]
CMP EDI,U4 FS:[TSS_EIP]
JNE @@5
BTR U4 BPT_FLAGS[ESI],SBPTf_DISABLE
JC @@6
@@5: MOV AL,U1 [EDI]
MOV U1 BPT_U1[ESI],AL
MOV AL,0xCC
MOV U1 [EDI],AL
@@6: MOV ESI,U4 BPT_NEXT[ESI]
JMP @@3
@@4:
MOV ESI,U4 FS:[TSS_ABSOLUTE_ADDRESS]
FRSTOR U4 TSS_FPU[ESI]
MOV EBX,U4 FS:[TSS_EBX]
MOV ECX,U4 FS:[TSS_ECX]
MOV EDX,U4 FS:[TSS_EDX]
MOV ESI,U4 FS:[TSS_ESI]
MOV EDI,U4 FS:[TSS_EDI]
MOV EBP,U4 FS:[TSS_EBP]
MOV ESP,U4 FS:[TSS_ESP]
MOV EAX,U4 FS:[TSS_EAX]
BT U4 FS:[TSS_TASK_FLAGS],TSSf_PREEMPT
JC @@1
BTR U4 [SYS_FLAGS],SYSf_PREEMPTIVE
JMP @@2
@@1: BTS U4 [SYS_FLAGS],SYSf_PREEMPTIVE
@@2: PUSH U4 FS:[TSS_EFLAGS]
PUSH U4 FS:[TSS_CS]
PUSH U4 FS:[TSS_EIP]
IRET
////**************************PROCEDURE*************************
//IN EDI=TASK
ALIGN 8,0x90
REMQUE_TASK:
PUSH ESI
PUSHFD
CLI
PUSH EDI
MOV ESI,U4 TSS_NEXT_TSS[EDI]
MOV EDI,U4 TSS_LAST_TSS[EDI]
MOV U4 TSS_NEXT_TSS[EDI],ESI
MOV U4 TSS_LAST_TSS[ESI],EDI
BTS U4 [SYS_FLAGS],SYSf_TASK_LINKS_ALTERED
POP EDI
POPFD
POP ESI
RET
////**************************PROCEDURE*************************
ALIGN 8,0x90
SWAP_IN_NEXT::
PUSHFD
CLI
CALL SAVE_CONTEXT
MOV EAX,SIN_RET
MOV U4 FS:[TSS_EIP],EAX
POP U4 FS:[TSS_EFLAGS]
MOV U4 FS:[TSS_ESP],ESP
SIN_NEXT:
MOV ESI,U4 FS:[TSS_NEXT_TSS]
MOV AX,U2 TSS_FS[ESI]
MOV FS,AX
SWAP_IN_NEXT_PART2::
BTR U4 [SYS_FLAGS],SYSf_CTRL_ALT_DEL
JC U4 CP_REBOOT
BTR U4 [SYS_FLAGS],SYSf_CTRL_ALT_ESC
JNC @@2
CALL SPAWN_USER_AND_ACTIVATE
JMP SWAP_IN_NEXT_PART3
@@2: BTR U4 [SYS_FLAGS],SYSf_CTRL_ALT_TAB
JNC @@3
CALL CP_ACTIVATE_NEXT_USER
JMP SWAP_IN_NEXT_PART3
@@3: BTR U4 [SYS_FLAGS],SYSf_CTRL_ALT_X
JC END_ACTIVE_USER
BTR U4 [SYS_FLAGS],SYSf_CTRL_ALT_C
JC BREAK_ACTIVE_USER
SWAP_IN_NEXT_PART3::
BT U4 FS:[TSS_TASK_FLAGS],TSSf_KILL_TASK
JNC @@1
CALL END_TASK+4
MOV FS,AX
JMP SWAP_IN_NEXT_PART2
@@1: BT U4 FS:[TSS_TASK_FLAGS],TSSf_SUSPENDED
JC SIN_NEXT
JMP U4 RESTORE_CONTEXT
SIN_RET: RET
BREAK_ACTIVE_USER::
MOV ESI,U4 [SYS_CUR_FOCUS_TASK]
OR ESI,ESI
JZ SWAP_IN_NEXT_PART3
BT U4 TSS_TASK_FLAGS[ESI],TSSf_LOCAL_USER
JNC SWAP_IN_NEXT_PART3
MOV EAX,CP_BREAK+4
MOV U4 TSS_EIP[ESI],EAX
JMP SWAP_IN_NEXT_PART3
END_ACTIVE_USER::
CALL DEACTIVATE_USER
PUSH ESI
CALL ACTIVATE_NEXT_USER
POP ESI
OR ESI,ESI
JZ SWAP_IN_NEXT_PART3
BT U4 TSS_TASK_FLAGS[ESI],TSSf_LOCAL_USER
JNC SWAP_IN_NEXT_PART3
BTS U4 TSS_TASK_FLAGS[ESI],TSSf_KILL_TASK
JMP SWAP_IN_NEXT_PART3
////**************************PROCEDURE*************************
MSG_USER_CMD_DESC: DU1 "USER CMD",0;
ALIGN 8,0x90
SPAWN_USER_AND_ACTIVATE::
PUSHFD
CLI
PUSHAD
MOV U4 [SYS_CUR_FOCUS_TASK],0
PUSH 0
PUSH U4 DEFAULT_STACK
PUSH 0
PUSH 0 ///use adam account
PUSH 0
PUSH 0 //ADAM is parent
PUSH 0
PUSH U4 MSG_USER_CMD_DESC
PUSH 0
PUSH U4 CP_USER_CMD_LINE+4
CALL CP_SPAWN_TASK+4
ADD ESP,40
PUSH EDX
PUSH EAX
MOV EAX,U4 [SYS_EXTERN_TABLE]
MOV EAX,U4 EXT_WINDOW_TO_TOP*4[EAX]
OR EAX,EAX
JZ @@1
CALL EAX
@@1: ADD ESP,8
POPAD
POPFD
RET
////**************************PROCEDURE*************************
//IN: ESI=CUR USER TSS
ALIGN 8,0x90
ACTIVATE_NEXT_USER:
PUSHFD
CLI
PUSH EDI
OR ESI,ESI
JNZ @@11
MOV ESI,ADAM_TSS
@@11: MOV EDI,ESI
MOV ESI,U4 TSS_NEXT_TSS[ESI]
@@14: BT U4 TSS_TASK_FLAGS[ESI],TSSf_LOCAL_USER
JNC @@19
CMP U4 [SYS_CUR_FOCUS_TASK],ESI
JE @@19
MOV U4 [SYS_CUR_FOCUS_TASK],ESI
MOV EAX,U4 [SYS_EXTERN_TABLE]
MOV EAX,U4 EXT_WINDOW_TO_TOP*4[EAX]
OR EAX,EAX
JZ @@19B
PUSHAD
PUSH 0
PUSH ESI
CALL EAX
ADD ESP,8
POPAD
JMP @@19B
@@19: MOV ESI,U4 TSS_NEXT_TSS[ESI]
CMP ESI,EDI
JNE @@14
@@19B: POP EDI
POPFD
RET
////**************************PROCEDURE*************************
//OUT: ESI=TSS OF USER
ALIGN 8,0x90
DEACTIVATE_USER:
MOV ESI,U4 [SYS_CUR_FOCUS_TASK]
MOV U4 [SYS_CUR_FOCUS_TASK],0
RET
////**************************PROCEDURE*************************
//IN: ESI=CUR USER TSS
ALIGN 8,0x90
CP_ACTIVATE_NEXT_USER::
PUSH ESI
CALL DEACTIVATE_USER
CALL ACTIVATE_NEXT_USER
POP ESI
RET
////**************************PROCEDURE*************************
ALIGN 8,0x90
CP_DEACTIVATE_USER::
PUSH ESI
CALL DEACTIVATE_USER
MOV EAX,ESI
XOR EDX,EDX
POP ESI
RET