
STRUC 0
BPT_NEXT: DU8 ?;
BPT_ADDRESS: DU8 ?;
BPT_FLAGS: DU4 ?;
BPT_U1: DU1 ?;
ENDS
STRUC 0 $LK+BK,"Redundent C+ Struct","FF:/LT/OSMain/AdamK.HPZ,class TssStruct"$
TSS_ADDRESS: DU8 ?;
TSS_TASK_FLAGS: DU8 ?;
TSS_DISPLAY_FLAGS: DU8 ?;
TSS_WAKE_TIME: DU8 ?;
TSS_CODE_HEAP: DU8 ?;
TSS_DATA_HEAP: DU8 ?;
TSS_CUR_LTF: DU8 ?;
TSS_AUX_LTF: DU8 ?;
TSS_WIN_LEFT: DU8 ?;
TSS_WIN_RIGHT: DU8 ?;
TSS_WIN_TOP: DU8 ?;
TSS_WIN_BOTTOM: DU8 ?;
TSS_CUR_PARTITION: DU8 ?;
TSS_CUR_DIR: DU8 ?;
TSS_PARENT_TSS: DU8 ?;
TSS_NEXT_TSS: DU8 ?; //ABSOLUTE ADDRESS OF NEXT TSS
TSS_LAST_TSS: DU8 ?; //ABSOLUTE ADDRESS OF LAST TSS
TSS_NEXT_INPUT_FILTER_TSS: DU8 ?;
TSS_LAST_INPUT_FILTER_TSS: DU8 ?;
TSS_NEXT_SIBLING_TSS: DU8 ?;
TSS_LAST_SIBLING_TSS: DU8 ?;
TSS_NEXT_CHILD_TSS: DU8 ?;
TSS_LAST_CHILD_TSS: DU8 ?;
//These are derived
TSS_WIN_WIDTH: DU8 ?;
TSS_WIN_HEIGHT: DU8 ?;
TSS_WIN_PIXEL_LEFT: DU8 ?;
TSS_WIN_PIXEL_RIGHT: DU8 ?;
TSS_WIN_PIXEL_WIDTH: DU8 ?;
TSS_WIN_PIXEL_TOP: DU8 ?;
TSS_WIN_PIXEL_BOTTOM: DU8 ?;
TSS_WIN_PIXEL_HEIGHT: DU8 ?;
TSS_WIN_BORDER_PIXEL_LEFT: DU8 ?; //These are derived
TSS_WIN_BORDER_PIXEL_RIGHT: DU8 ?;
TSS_WIN_BORDER_PIXEL_TOP: DU8 ?;
TSS_WIN_BORDER_PIXEL_BOTTOM: DU8 ?;
TSS_RIP: DU8 ?;
TSS_RFLAGS: DU8 ?;
TSS_RAX: DU8 ?;
TSS_RCX: DU8 ?;
TSS_RDX: DU8 ?;
TSS_RBX: DU8 ?;
TSS_RSP: DU8 ?;
TSS_RBP: DU8 ?;
TSS_RSI: DU8 ?;
TSS_RDI: DU8 ?;
TSS_R8: DU8 ?;
TSS_R9: DU8 ?;
TSS_R10: DU8 ?;
TSS_R11: DU8 ?;
TSS_R12: DU8 ?;
TSS_R13: DU8 ?;
TSS_R14: DU8 ?;
TSS_R15: DU8 ?;
TSS_GS: DU8 ?;
TSS_FPU: DU1 112 DUP(?);
TSS_TIME_SLICE_START: DU8 ?;
TSS_TOTAL_TIME: DU8 ?;
TSS_SWAP_CNTER: DU8 ?;
TSS_UPDATE_WIN: DU8 ?;
TSS_DRAW_IT: DU8 ?;
TSS_TASK_DESCRIPTOR: DU1 TSS_DESC_LENGTH+1 DUP (?);
TSS_TASK_DESCRIPTOR2: DU1 TSS_DESC_LENGTH+1 DUP (?);
TSS_WALLPAPER_DATA: DU1 TSS_WALLPAPER_DATA_SIZE DUP (?);
TSS_DOUBLE_BUF_CUR_LTF: DU8 ?;
TSS_DOUBLE_BUF_AUX_LTF: DU8 ?;
TSS_SCROLL_SPEED: DU4 ?;
TSS_TEXT_ATTR: DU1 ?;
TSS_BORDER_ATTR: DU1 ?;
DU2 ?; //Unused
TSS_STACK_BASE: DU8 ?;
TSS_STACK_SIZE: DU8 ?;
TSS_NEXT_EXCEPT: DU8 ?;
TSS_LAST_EXCEPT: DU8 ?;
TSS_EXCEPT_RBP: DU8 ?;
TSS_EXCEPT_ARGC: DU8 ?;
TSS_EXCEPT_ARGV: DU8 ?;
TSS_CATCH_EXCEPT: DU1 ?;
TSS_IGNORE_EXCEPT: DU1 ?;
DU1 6 DUP(?);
TSS_BPT_LIST: DU8 ?;
TSS_NEXT_CTRL: DU8 ?;
TSS_LAST_CTRL: DU8 ?;
TSS_NEXT_ODE: DU8 ?;
TSS_LAST_ODE: DU8 ?;
TSS_LAST_ODE_TIME: DU8 ?;
TSS_HASH_TABLE: DU8 ?;
TSS_ACCT: DU8 ?;
TSS_NEXT_SERVANT_CMD: DU8 ?;
TSS_LAST_SERVANT_CMD: DU8 ?;
TSS_NEXT_MASTER_CMD: DU8 ?;
TSS_LAST_MASTER_CMD: DU8 ?;
TSS_NEXT_LEX: DU8 ?;
TSS_LAST_LEX: DU8 ?;
TSS_WIN_OLD_LEFT: DU8 ?;
TSS_WIN_OLD_RIGHT: DU8 ?;
TSS_WIN_OLD_TOP: DU8 ?;
TSS_WIN_OLD_BOTTOM: DU8 ?;
TSS_END_TASK_CB: DU8 ?;
TSS_USER_NUM: DU4 ?;
TSS_FAULT_NUM: DU4 ?;
TSS_ANSWERS: DU8 8 DUP(?);
TSS_DOUBLE_ANSWERS: DU8 8 DUP(?);
TSS_ANSWERS_TYPES: DU4 8 DUP(?);
TSS_ANSWERS_DISPLAYED: DU4 ?;
TSS_IN_QUEUE_SIGNATURE: DU4 ?;
TSS_DBG: DU8 ?;
TSS_POPUP: DU8 ?;
TSS_LOCALCHNL: DU8 ?;
TSS_RMTCHNL: DU8 ?;
TSS_HORZ_SCROLL: DU1 32 DUP(?);
TSS_VERT_SCROLL: DU1 32 DUP(?);
TSS_MP: DU8 ?;
TSS_SLAVE_TASK_DATA0: DU8 ?;
TSS_SLAVE_TASK_DATA1: DU8 ?;
TSS_SLAVE_TASK_DATA2: DU8 ?;
TSS_SLAVE_TASK_DATA3: DU8 ?;
TSS_USER_DATA0: DU8 ?;
TSS_USER_DATA1: DU8 ?;
TSS_USER_DATA2: DU8 ?;
TSS_USER_DATA3: DU8 ?;
TSS_STRUCT_SIZE:
ENDS
$PJ,"Project: OSMain","/LT/OSMain/OS.SPZ"$
////**************************PROCEDURE*************************
IDLE_START::
SAVE_CONTEXT::
PUSH EAX
PUSHFD
XOR EAX,EAX
MOV RAX,FS:TSS_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
SUB RBX,U8 TSS_TIME_SLICE_START[RSI]
ADD U8 TSS_TOTAL_TIME[RSI],RBX
FSAVE U4 TSS_FPU[RSI]
MOV RDX,U8 TSS_BPT_LIST[RSI]
@@3: OR RDX,RDX
JZ @@4
MOV RDI,U8 BPT_ADDRESS[RDX]
MOV AL,U1 BPT_U1[RDX]
MOV U1 [RDI],AL
MOV RDX,U8 BPT_NEXT[RDX]
JMP @@3
@@4: BTR U8 TSS_TASK_FLAGS[RSI],TSSf_CURRENTLY_RUNNING
BTS U8 TSS_TASK_FLAGS[RSI],TSSf_HAS_BEEN_SWAPPED
RET
////**************************PROCEDURE*************************
RESTORE_CONTEXT::
XOR EAX,EAX
INC U8 GS:CPU_SWAP_CNTER[RAX]
XOR EAX,EAX
MOV RSI,FS:TSS_ADDRESS[RAX]
BTS U8 TSS_TASK_FLAGS[RSI],TSSf_CURRENTLY_RUNNING
BT U8 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]
BTR U8 BPT_FLAGS[RDX],SBPTf_DISABLE
JC @@6
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*************************
END_RSI_TASK:
MOV RAX,RSI
CALL SET_FS_BASE
END_TASK_NOW::
CALL END_TASK
MOV RSI,RAX
CALL SET_FS_BASE
JMP RESTORE_RSI_TASK_WITH_KEY_CHECK
RESTORE_RSI_NO_PREEMPT_TASK:
BT U8 [SYS_FLAGS],SYSf_CTRL_ALT_DEL
JC I4 HANDLE_SWAP_KEY_EVENT
JMP RESTORE_RSI_TASK_NO_KEY_CHECK
SAVE_CONTEXT_SWAP_IN_NEXT::
PUSHFD
PUSH EAX
MOV RAX,SYS_SEMAS
BT U4 SYS_SEMA_SINGLE_USER*SEMA_STRUCT_SIZE[RAX],0
JC @@4
POP EAX
CLI
PUSH ESI
XOR ESI,ESI
MOV RSI,FS:TSS_ADDRESS[RSI]
CMP U8 TSS_NEXT_TSS[RSI],RSI
JNE @@0
PUSH EAX
PUSH EDX
XOR EAX,EAX
RDTSC
SHL RDX,32
ADD RAX,RDX
CMP U8 TSS_WAKE_TIME[RSI],RAX
JA @@0A
POP EDX
POP EAX
POP ESI
POPFD
RET
@@4: POP EAX
POPFD
RET
@@0A: POP EDX
POP EAX
@@0: POP ESI
CALL SAVE_CONTEXT
XOR ESI,ESI
MOV RSI,FS:TSS_ADDRESS[RSI]
MOV RBX,U4 IDLE_POINT
MOV U8 TSS_RIP[RSI],RBX
POP U8 TSS_RFLAGS[RSI]
MOV U8 TSS_RSP[RSI],RSP
RESTORE_NEXT_RSI_TASK:
MOV RSI,U8 TSS_NEXT_TSS[RSI]
RESTORE_RSI_TASK_WITH_KEY_CHECK:
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 HANDLE_SWAP_KEY_EVENT
RESTORE_RSI_TASK_NO_KEY_CHECK:
XOR EAX,EAX
MOV U8 GS:CPU_SWAP_LOOP_TSS[RAX],RSI
@@1: BT U8 TSS_TASK_FLAGS[RSI],TSSf_KILL_TASK
JC I4 END_RSI_TASK
TEST U8
TSS_TASK_FLAGS[RSI],1<<TSSf_AWAITING_MSG|1<<TSSf_SUSPENDED|1<<TSSf_PAUSED
JNZ @@2
XOR EAX,EAX
RDTSC
SHL RDX,32
ADD RAX,RDX
CMP U8 TSS_WAKE_TIME[RSI],RAX
JA @@2
CMP U4 TSS_IN_QUEUE_SIGNATURE[RSI],TSSS_IN_QUEUE_SIGNATURE
JNE SWAP_IN_SETH_TASK
MOV RAX,RSI
CALL SET_FS_BASE
JMP I4 RESTORE_CONTEXT
@@2: MOV RSI,U8 TSS_NEXT_TSS[RSI]
XOR EAX,EAX
CMP U8 GS:CPU_SWAP_LOOP_TSS[RAX],RSI
JNE @@1
MOV RAX,U8 GS:CPU_IDLE_TSS[RAX]
CALL SET_FS_BASE
STI
NOP
CLI
JMP RESTORE_RSI_TASK_WITH_KEY_CHECK
SWAP_IN_SETH_TASK:
XOR EAX,EAX
MOV RSI,GS:CPU_SETH_TSS[RAX]
JMP RESTORE_RSI_TASK_WITH_KEY_CHECK
IDLE_POINT::
RET
IDLE_END::
HANDLE_SWAP_KEY_EVENT:
MOV RAX,RSI
CALL SET_FS_BASE
XOR EAX,EAX
MOV RAX,GS:CPU_NUM[RAX]
OR RAX,RAX
JNZ I4 RESTORE_RSI_TASK_NO_KEY_CHECK
MOV RAX,U4 SYS_FLAGS
BTR U4 [RAX],SYSf_CTRL_ALT_DEL
JC I4 CP_REBOOT
BTR U4 [RAX],SYSf_CTRL_ALT_ESC
JNC @@2
CALL SPAWN_USER_AND_FOCUS
JMP I4 RESTORE_FS_TASK_WITH_KEY_CHECK
@@2: BTR U4 [RAX],SYSf_CTRL_ALT_TAB
JNC @@3
PUSH ESI
MOV RSI,U8 [SYS_CUR_FOCUS_TASK]
MOV U8 [SYS_CUR_FOCUS_TASK],0
CALL FOCUS_RSI_NEXT_USER
POP ESI
JMP I4 RESTORE_FS_TASK_WITH_KEY_CHECK
@@3: BTR U4 [RAX],SYSf_CTRL_ALT_X
JC END_FOCUS_USER
BTR U4 [RAX],SYSf_CTRL_ALT_C
JNC I4 RESTORE_RSI_TASK_WITH_KEY_CHECK
BREAK_FOCUS_USER:
MOV RSI,U8 [SYS_CUR_FOCUS_TASK]
OR RSI,RSI
JZ I4 SWAP_IN_SETH_TASK
BT U8 TSS_TASK_FLAGS[RSI],TSSf_LOCAL_USER
JNC I4 RESTORE_RSI_TASK_NO_KEY_CHECK
BTR U8 TSS_TASK_FLAGS[RSI],TSSf_BREAK_LOCKED
JNC @@1
BTS U8 TSS_TASK_FLAGS[RSI],TSSf_PENDING_BREAK
JMP I4 RESTORE_RSI_TASK_NO_KEY_CHECK
@@1: MOV RAX,CP_BREAK
MOV U8 TSS_RIP[RSI],RAX
BT U8 TSS_TASK_FLAGS[RSI],TSSf_BREAK_TO_CTRLQ
JC @@4
//We do these two now, in case interrupt happens
MOV U8 TSS_WAKE_TIME[RSI],0
BTR U8 TSS_TASK_FLAGS[RSI],TSSf_AWAITING_MSG
@@4: JMP I4 RESTORE_RSI_TASK_NO_KEY_CHECK
END_FOCUS_USER:
MOV RSI,U8 [SYS_CUR_FOCUS_TASK]
MOV U8 [SYS_CUR_FOCUS_TASK],0
PUSH ESI
CALL FOCUS_RSI_NEXT_USER
POP ESI
OR RSI,RSI
JZ I4 SWAP_IN_SETH_TASK
MOV RAX,RSI
CALL SET_FS_BASE
BT U8 TSS_TASK_FLAGS[RSI],TSSf_LOCAL_USER
JNC I4 RESTORE_RSI_TASK_WITH_KEY_CHECK
BTS U8 TSS_TASK_FLAGS[RSI],TSSf_KILL_TASK
JMP I4 END_RSI_TASK
RESTORE_FS_TASK_WITH_KEY_CHECK:
XOR ESI,ESI
MOV RSI,FS:TSS_ADDRESS[RSI]
JMP I4 RESTORE_RSI_TASK_WITH_KEY_CHECK
SPAWN_USER_AND_FOCUS:
MOV U8 [SYS_CUR_FOCUS_TASK],0
PUSH TRUE //add to queue
PUSH DEFAULT_STACK
PUSH 0 ///use adam acct
PUSH 0 //Adam is parent
PUSH NULL //desc
PUSH 0
PUSH U4 CP_USER_CMD_LINE
CALL CP_SPAWN_TASK
ADD RSP,56
PUSH EAX
MOV RAX,U8 [SYS_EXTERN_TABLE]
MOV RAX,U8 EXT_WIN_TO_TOP*8[RAX]
OR RAX,RAX
JZ @@10
CALL RAX
@@10: ADD RSP,8
RET
FOCUS_RSI_NEXT_USER:
OR RSI,RSI
JNZ @@11
MOV RSI,U4 SYS_ADAM_TSS
@@11: MOV RDI,RSI
MOV RSI,U8 TSS_NEXT_TSS[RSI]
@@14: BT U8 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 ESI
CALL RAX
ADD RSP,8
JMP @@19B
@@19: MOV RSI,U8 TSS_NEXT_TSS[RSI]
CMP RSI,RDI
JNE @@14
MOV U8 [SYS_CUR_FOCUS_TASK],0
@@19B: RET
Scheduler