From b1873b4cff47aae8ada8cc303ea01b475cc7ccc8 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sat, 7 May 2011 21:20:34 +0800 Subject: [PATCH] Kernel - Instruction tracing support --- Kernel/arch/x86/desctab.asm | 20 ++++++++++++++++++-- Kernel/arch/x86/errors.c | 12 ++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/Kernel/arch/x86/desctab.asm b/Kernel/arch/x86/desctab.asm index f6cc14e1..dc064f57 100644 --- a/Kernel/arch/x86/desctab.asm +++ b/Kernel/arch/x86/desctab.asm @@ -210,7 +210,7 @@ DEF_SYSCALL 0xAC ; Acess System Call [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 @@ -227,7 +227,8 @@ Isr0xEF: [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 @@ -287,6 +288,18 @@ SyscallCommon: 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 @@ -300,6 +313,8 @@ SyscallCommon: ; ------------ [extern IRQ_Handler] [global IRQCommon] +[global IRQCommon_handled] +IRQCommon_handled equ IRQCommon.handled IRQCommon: pusha push ds @@ -315,6 +330,7 @@ IRQCommon: push esp call IRQ_Handler +.handled: add esp, 4 pop gs diff --git a/Kernel/arch/x86/errors.c b/Kernel/arch/x86/errors.c index 1e0278b6..22ad1a39 100644 --- a/Kernel/arch/x86/errors.c +++ b/Kernel/arch/x86/errors.c @@ -60,6 +60,18 @@ void ErrorHandler(tRegs *Regs) __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) { -- 2.20.1