[extern SchedulerBase]
; AP's Timer Interrupt
Isr0xEE:
- push 0
+ push 0 ; Line up with interrupt number
xchg bx, bx ; MAGIC BREAK
jmp SchedulerBase
; Spurious Interrupt
[extern SchedulerBase]
[extern SetAPICTimerCount]
Isr240:
- push 0
+ push 0 ; Line up with Argument in errors
+ push 0 ; CPU Number
;xchg bx, bx ; MAGIC BREAK
Isr240.jmp:
%if USE_MP
call SyscallHandler
add esp, 4
+ ; Pass changes to TF on to the user
+ ; EFLAGS is stored at ESP[4+8+2+2]
+ ; 4 Segment Registers
+ ; 8 GPRs
+ ; 2 Error Code / Interrupt ID
+ ; 2 CS/EIP
+ pushf
+ pop eax
+ and eax, 0x100 ; 0x100 = Trace Flag
+ and WORD [esp+(4+8+2+2)*4], ~0x100 ; Clear
+ or DWORD [esp+(4+8+2+2)*4], eax ; Set for user
+
pop gs
pop fs
pop es
; ------------
[extern IRQ_Handler]
[global IRQCommon]
+[global IRQCommon_handled]
+IRQCommon_handled equ IRQCommon.handled
IRQCommon:
pusha
push ds
push esp
call IRQ_Handler
+.handled:
add esp, 4
pop gs
__asm__ __volatile__ ("cli");
+ // Debug exception (used for single-stepping)
+ if(Regs->int_num == 1)
+ {
+ static Uint32 lastEIP = 0;
+ tThread *thread = Proc_GetCurThread();
+ if( Regs->eip == lastEIP )
+ return;
+ Log("%p(%i %s) IP=%08x", thread, thread->TID, thread->ThreadName, Regs->eip);
+ lastEIP = Regs->eip;
+ return ;
+ }
+
// Page Fault
if(Regs->int_num == 14)
{