331 lines
6.5 KiB
Plaintext
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
|