
$PJ,"Project: OSMain","/LT/OSMain/OS.SPZ"$
IRQ_VECTORS::
DU4 IRQ00,IRQ01,IRQ02,IRQ03;
DU4 IRQ04,IRQ05,IRQ06,IRQ07;
DU4 IRQ08,IRQ09,IRQ0A,IRQ0B;
DU4 IRQ0C,IRQ0D,IRQ0E,IRQ0F;
DU4 IRQ10,IRQ11,IRQ12,IRQ13;
DU4 IRQ14,IRQ15,IRQ16,IRQ17;
DU4 IRQ18,IRQ19,IRQ1A,IRQ1B;
DU4 IRQ1C,IRQ1D,IRQ1E,IRQ1F;
DU4 IRQ20,IRQ21,IRQ22,IRQ23;
DU4 IRQ24,IRQ25,IRQ26,IRQ27;
DU4 IRQ28,IRQ29,IRQ2A,IRQ2B;
DU4 IRQ2C,IRQ2D,IRQ2E,IRQ2F;
DU4 IRQ30,IRQ31,IRQ32,IRQ33;
DU4 IRQ34,IRQ35,IRQ36,IRQ37;
DU4 IRQ38,IRQ39,IRQ3A,IRQ3B;
DU4 IRQ3C,IRQ3D,IRQ3E,IRQ3F;
//Set $LK,"MAX_INITIAL_IDT","MN:MAX_INITIAL_IDT"$ if you add more
////***************** INTERRUPT ROUTINES ***************
IRQ00:: PUSH RDX
XOR EDX,EDX
JMP I4 IRQFAULT
IRQ01: PUSH RDX
MOV RDX,1
JMP I4 IRQFAULT
HALT::
IRQ02: //Halt
XOR ESI,ESI
CALL HALT_CPU
IRQ03: PUSH RDX
MOV RDX,3
JMP I4 IRQFAULT
IRQ04: PUSH RDX
MOV RDX,4
JMP I4 IRQFAULT
IRQ05: PUSH RDX
MOV RDX,5
JMP I4 IRQFAULT
IRQ06: PUSH RDX
MOV RDX,6
JMP I4 IRQFAULT
IRQ07: PUSH RDX
MOV RDX,7
JMP I4 IRQFAULT
IRQ08: PUSH RDX
MOV RDX,8
JMP I4 IRQFAULT
IRQ09: PUSH RDX
MOV RDX,9
JMP I4 IRQFAULT
IRQ0A: PUSH RDX
MOV RDX,0x0A
JMP I4 IRQFAULT
IRQ0B: PUSH RDX
MOV RDX,0x0B
JMP I4 IRQFAULT
IRQ0C: PUSH RDX
MOV RDX,0x0C
JMP I4 IRQFAULT
IRQ0D: PUSH RDX
MOV RDX,0x0D
JMP I4 IRQFAULT
IRQ0E: PUSH RDX
MOV RDX,0x0E
JMP I4 IRQFAULT
IRQ0F: PUSH RDX
MOV RDX,0x0F
JMP I4 IRQFAULT
IRQ10: PUSH RDX
MOV RDX,0x10
JMP I4 IRQFAULT
IRQ11: PUSH RDX
MOV RDX,0x11
JMP I4 IRQFAULT
IRQ12: PUSH RDX
MOV RDX,0x12
JMP I4 IRQFAULT
IRQ13: PUSH RDX
MOV RDX,0x13
JMP I4 IRQFAULT
IRQ14: PUSH RDX
MOV RDX,0x14
JMP I4 IRQFAULT
IRQ15: PUSH RDX
MOV RDX,0x15
JMP I4 IRQFAULT
IRQ16: PUSH RDX
MOV RDX,0x16
JMP I4 IRQFAULT
IRQ17: PUSH RDX
MOV RDX,0x17
JMP I4 IRQFAULT
IRQ18: PUSH RDX
MOV RDX,0x18
JMP I4 IRQFAULT
IRQ19: PUSH RDX
MOV RDX,0x19
JMP I4 IRQFAULT
IRQ1A: PUSH RDX
MOV RDX,0x1A
JMP I4 IRQFAULT
IRQ1B: PUSH RDX
MOV RDX,0x1B
JMP I4 IRQFAULT
IRQ1C: PUSH RDX
MOV RDX,0x1C
JMP I4 IRQFAULT
IRQ1D: PUSH RDX
MOV RDX,0x1D
JMP I4 IRQFAULT
IRQ1E: PUSH RDX
MOV RDX,0x1E
JMP I4 IRQFAULT
IRQ1F: PUSH RDX
MOV RDX,0x1F
JMP I4 IRQFAULT
IRQ20: CALL SAVE_CONTEXT //PREEMPTIVE
XOR ESI,ESI
MOV RSI,FS:TSS_ADDRESS[RSI]
MOV RBP,RSP
MOV RBX,U8 [RBP]
MOV U8 TSS_RIP[RSI],RBX
MOV RAX,U8 16[RBP]
MOV U8 TSS_RFLAGS[RSI],RAX
MOV RAX,U8 24[RBP]
MOV U8 TSS_RSP[RSI],RAX
XOR EAX,EAX
MOV RCX,U8 GS:CPU_CACHED_ADDRESS[RAX]
MOV RDI,U8 CPU_UNCACHED_ADDRESS[RCX]
INC U8 CPU_TOTAL_JIFFIES[RDI]
BT U8 TSS_TASK_FLAGS[RSI],TSSf_IDLE
JC @@1a
CMP RBX,U4 IDLE_START
JB @@1
CMP RBX,U4 IDLE_END
JA @@1
@@1a: INC U8 CPU_IDLE_POINT_HITS[RDI]
@@1: MOV RAX,U8 CPU_NUM[RCX]
OR RAX,RAX
JZ @@3
XOR EAX,EAX
MOV EAX,U4 MP_EOI
MOV U4 [RAX],0
JMP @@5
@@3: MOV RAX,U8 [SYS_EXTERN_TABLE]
MOV RAX,U8 EXT_IRQ00*8[RAX]
OR RAX,RAX
JZ @@2
PUSH ESI
CALL RAX
ADD RSP,8
CLI
@@2: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT
OUT 0x20,AL
@@5: MOV RAX,SYS_SEMAS
BT U4 SYS_SEMA_SINGLE_USER*SEMA_STRUCT_SIZE[RAX],0
JC @@5C
BT U8 TSS_TASK_FLAGS[RSI],TSSf_PREEMPT
JC I4 RESTORE_NEXT_RSI_TASK
@@5C: BTR U8 TSS_TASK_FLAGS[RSI],TSSf_HAS_BEEN_SWAPPED
JC @@5B
INC U8 CPU_NO_PREEMPT_HITS[RDI]
@@5B: JMP I4 RESTORE_RSI_NO_PREEMPT_TASK
IRQ21: CLD
PUSH_C_REGS
MOV RAX,U8 [SYS_EXTERN_TABLE]
CALL U8 EXT_IRQ01*8[RAX]
POP_C_REGS
IRET
IRQ22: PUSH RDX
MOV RDX,0x22
JMP I4 IRQFAULT
IRQ23: CLD
PUSH_C_REGS
MOV RAX,U8 [SYS_EXTERN_TABLE]
MOV RAX,U8 EXT_IRQ03*8[RAX]
OR RAX,RAX
JZ @@231
CALL RAX
@@231: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT
OUT 0x20,AL
POP_C_REGS
IRET
IRQ24: CLD
PUSH_C_REGS
MOV RAX,U8 [SYS_EXTERN_TABLE]
MOV RAX,U8 EXT_IRQ04*8[RAX]
OR RAX,RAX
JZ @@241
CALL RAX
@@241: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT
OUT 0x20,AL
POP_C_REGS
IRET
IRQ25: CLD
PUSH_C_REGS
MOV RAX,U8 [SYS_EXTERN_TABLE]
MOV RAX,U8 EXT_IRQ05*8[RAX]
OR RAX,RAX
JZ @@251
CALL RAX
@@251: MOV AL,0x20
OUT 0x20,AL
POP_C_REGS
IRET
IRQ26: CLD
PUSH_C_REGS
MOV RAX,U8 [SYS_EXTERN_TABLE]
MOV RAX,U8 EXT_IRQ06*8[RAX]
OR RAX,RAX
JZ @@261
CALL RAX
@@261: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT
OUT 0x20,AL
POP_C_REGS
IRET
IRQ27: CLD
PUSH_C_REGS
MOV RAX,U8 [SYS_EXTERN_TABLE]
MOV RAX,U8 EXT_IRQ07*8[RAX]
OR RAX,RAX
JZ @@271
CALL RAX
@@271: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT
OUT 0x20,AL
POP_C_REGS
IRET
IRQ28: PUSH RDX
MOV RDX,0x28
JMP I4 IRQFAULT
IRQ29: PUSH RDX
MOV RDX,0x29
JMP I4 IRQFAULT
IRQ2A: PUSH RDX
MOV RDX,0x2A
JMP I4 IRQFAULT
IRQ2B: CLD
PUSH_C_REGS
MOV RAX,U8 [SYS_EXTERN_TABLE]
MOV RAX,U8 EXT_IRQ0B*8[RAX]
OR RAX,RAX
JZ @@2B1
CALL RAX
@@2B1: MOV AL,0x20
OUT 0xA0,AL
OUT 0x20,AL
POP_C_REGS
IRET
IRQ2C: CLD
PUSH_C_REGS
MOV RAX,U8 [SYS_EXTERN_TABLE]
CALL U8 EXT_IRQ0C*8[RAX]
POP_C_REGS
IRET
IRQ2D: CLD
PUSH_C_REGS
MOV RAX,U8 [SYS_EXTERN_TABLE]
MOV RAX,U8 EXT_IRQ0D*8[RAX]
OR RAX,RAX
JZ @@2D1
CALL RAX
@@2D1: MOV AL,0x20
OUT 0xA0,AL
OUT 0x20,AL
POP_C_REGS
IRET
IRQ2E: CLD
PUSH_C_REGS
MOV RAX,U8 [SYS_EXTERN_TABLE]
MOV RAX,U8 EXT_IRQ0E*8[RAX]
OR RAX,RAX
JZ @@2E1
CALL RAX
@@2E1: MOV AL,0x20
OUT 0xA0,AL
OUT 0x20,AL
POP_C_REGS
IRET
IRQ2F: CLD
PUSH_C_REGS
MOV RAX,U8 [SYS_EXTERN_TABLE]
MOV RAX,U8 EXT_IRQ0F*8[RAX]
OR RAX,RAX
JZ @@2F1
CALL RAX
@@2F1: MOV AL,0x20
OUT 0xA0,AL
OUT 0x20,AL
POP_C_REGS
IRET
/*************************************/
IRQ30: PUSH EAX //called from MPInt
WBINVD
XOR EAX,EAX
MOV EAX,U4 MP_EOI
MOV U4 [RAX],0
POP EAX
IRET
IRQ31: PUSH RDX
MOV RDX,0x31
JMP I4 IRQFAULT
IRQ32: PUSH RDX
MOV RDX,0x32
JMP I4 IRQFAULT
IRQ33: PUSH RDX
MOV RDX,0x33
JMP I4 IRQFAULT
COUT_PUT_DOUBLE:
PUSH_C_REGS
PUSH U8 8[RBP]
CALL CP_PUT_FLOAT
ADD RSP,8
POP_C_REGS
COUT_RETURN:
RET
COUT_PUT_STR:
PUSH ESI
MOV RSI,RAX
CALL PUT_STR
POP ESI
RET
COUT_JMP_TABLE:
DU8 PUT_HEX_U4;
DU8 PUT_HEX_U4;
DU8 PUT_CHAR;
DU8 PUT_HEX_U1;
DU8 PUT_HEX_U2;
DU8 PUT_HEX_U2;
DU8 PUT_HEX_U4;
DU8 PUT_HEX_U4;
DU8 PUT_HEX_U8;
DU8 PUT_HEX_U8;
DU8 COUT_PUT_DOUBLE;
DU8 PUT_HEX_U4;
//ptr types
DU8 PUT_HEX_U4;
DU8 PUT_HEX_U4;
DU8 COUT_PUT_STR;
COUT_JOIN::
OR RBX,RBX
JZ @@100
@@20: MOV RDX,U8 [RBP]
MOV RAX,U8 8[RBP]
CMP RDX,IT_I1+IT_NUM_IT
JBE @@21
XOR EDX,EDX
@@21: CALL U8 COUT_JMP_TABLE[RDX*8]
SUB RBP,16
DEC RBX
JNZ @@20
@@100: RET
//I_COUT
IRQ34:: PUSH EBP
MOV RBP,RSP
BT U8 24[RBP],9
JNC @@I34
STI
@@I34:
MOV RBP,U8 32[RBP]
MOV RBX,RAX //GET ARG CNT
ADD RBX,RBX
LEA RBP,-16[RBP+RBX*8]
MOV RBX,RAX //GET ARG CNT
CALL COUT_JOIN
POP EBP
IRET
//I_COUTLN
IRQ35:: PUSH EBP
MOV RBP,RSP
BT U8 24[RBP],9
JNC @@I35
STI
@@I35:
MOV RBP,U8 32[RBP]
MOV RBX,RAX //GET ARG CNT
ADD RBX,RBX
LEA RBP,-16[RBP+RBX*8]
MOV RBX,RAX //GET ARG CNT
CALL COUT_JOIN
CALL CRLF
POP EBP
IRET
IRQ36: PUSH RDX
MOV RDX,0x36
JMP IRQFAULT
IRQ37: PUSH RDX
MOV RDX,0x37
JMP IRQFAULT
IRQ38: PUSH RDX
MOV RDX,0x38
JMP IRQFAULT
IRQ39: PUSH RDX
MOV RDX,0x39
JMP IRQFAULT
IRQ3A: PUSH RDX
MOV RDX,0x3A
JMP IRQFAULT
IRQ3B: PUSH RDX
MOV RDX,0x3B
JMP IRQFAULT
IRQ3C: PUSH RDX
MOV RDX,0x3C
JMP IRQFAULT
IRQ3D: PUSH RDX
MOV RDX,0x3D
JMP IRQFAULT
IRQ3E: PUSH RDX
MOV RDX,0x3E
JMP IRQFAULT
IRQ3F: PUSH RDX
MOV RDX,0x3F
JMP IRQFAULT
//************************************ SOFTWARE INT'S ******************************
IRQFAULT::
PUSH EAX
XOR EAX,EAX
MOV FS:U4 TSS_FAULT_NUM[RAX],EDX
POP EAX
POP EDX
CALL SAVE_CONTEXT
XOR ESI,ESI
MOV RSI,FS:TSS_ADDRESS[RSI]
MOV RBP,RSP
MOV RAX,U8 [RBP]
MOV U8 TSS_RIP[RSI],RAX
MOV RAX,U8 16[RBP]
MOV U8 TSS_RFLAGS[RSI],RAX
MOV RAX,U8 24[RBP]
MOV U8 TSS_RSP[RSI],RAX
MOV RSP,RAX
MOV RAX,TSS_RAX[RSI]
MOV RBP,TSS_RBP[RSI]
MOV RSI,TSS_RSI[RSI]
CALL CP_FAULT2
JMP I4 RESTORE_FS_TASK_WITH_KEY_CHECK
Interrupt Handlers