////**************************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<