From eb562f2c860061868e4ea1a821a84147b694dd07 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Fri, 21 Aug 1998 16:39:52 +0000 Subject: Patch from Eric Valette : Here is a patch that enables to catch exception and get message before crashing RTEMS :) It should be generic to any Intel port although enabled only for pc386 BSP... [Joel] I fixed the bug I introduced in irq_asm.s... --- cpukit/score/cpu/i386/cpu.c | 90 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) (limited to 'cpukit/score/cpu/i386') diff --git a/cpukit/score/cpu/i386/cpu.c b/cpukit/score/cpu/i386/cpu.c index 70d7fd3267..1f0900fceb 100644 --- a/cpukit/score/cpu/i386/cpu.c +++ b/cpukit/score/cpu/i386/cpu.c @@ -15,6 +15,9 @@ #include #include +#include +#include + /* _CPU_Initialize * @@ -82,3 +85,90 @@ void _CPU_Thread_Idle_body () asm volatile ("hlt"); } } + +void _defaultExcHandler (CPU_Exception_frame *ctx) +{ + printk("----------------------------------------------------------\n"); + printk("Exception %d caught at PC %x by thread %d\n", + ctx->idtIndex, + ctx->eip, + _Thread_Executing->Object.id); + printk("----------------------------------------------------------\n"); + printk("Processor execution context at time of the fault was :\n"); + printk("----------------------------------------------------------\n"); + printk(" EAX = %x EBX = %x ECX = %x EDX = %x\n", + ctx->eax, ctx->ebx, ctx->ecx, ctx->edx); + printk(" ESI = %x EDI = %x EBP = %x ESP = %x\n", + ctx->esi, ctx->edi, ctx->ebp, ctx->esp0); + printk("----------------------------------------------------------\n"); + printk("Error code pushed by processor itself (if not 0) = %x\n", + ctx->faultCode); + printk("----------------------------------------------------------\n\n"); + printk(" ************ FAULTY THREAD WILL BE DELETED **************\n"); + /* + * OK I could probably use a simplified version but at least this + * should work. + */ + rtems_task_delete(_Thread_Executing->Object.id); +} + +cpuExcHandlerType _currentExcHandler = _defaultExcHandler; + +extern void rtems_exception_prologue_0(); +extern void rtems_exception_prologue_1(); +extern void rtems_exception_prologue_2(); +extern void rtems_exception_prologue_3(); +extern void rtems_exception_prologue_4(); +extern void rtems_exception_prologue_5(); +extern void rtems_exception_prologue_6(); +extern void rtems_exception_prologue_7(); +extern void rtems_exception_prologue_8(); +extern void rtems_exception_prologue_9(); +extern void rtems_exception_prologue_10(); +extern void rtems_exception_prologue_11(); +extern void rtems_exception_prologue_12(); +extern void rtems_exception_prologue_13(); +extern void rtems_exception_prologue_14(); +extern void rtems_exception_prologue_16(); +extern void rtems_exception_prologue_17(); +extern void rtems_exception_prologue_18(); + +static rtems_raw_irq_hdl tbl[] = { + rtems_exception_prologue_0, + rtems_exception_prologue_1, + rtems_exception_prologue_2, + rtems_exception_prologue_3, + rtems_exception_prologue_4, + rtems_exception_prologue_5, + rtems_exception_prologue_6, + rtems_exception_prologue_7, + rtems_exception_prologue_8, + rtems_exception_prologue_9, + rtems_exception_prologue_10, + rtems_exception_prologue_11, + rtems_exception_prologue_12, + rtems_exception_prologue_13, + rtems_exception_prologue_14, + rtems_exception_prologue_16, + rtems_exception_prologue_17, + rtems_exception_prologue_18, +}; + +void rtems_exception_init_mngt() +{ + unsigned int i,j; + interrupt_gate_descriptor *currentIdtEntry; + unsigned limit; + unsigned level; + + i = sizeof(tbl) / sizeof (rtems_raw_irq_hdl); + + i386_get_info_from_IDTR (¤tIdtEntry, &limit); + + _CPU_ISR_Disable(level); + for (j = 0; j < i; j++) { + create_interrupt_gate_descriptor (¤tIdtEntry[j], tbl[j]); + } + _CPU_ISR_Enable(level); +} + -- cgit v1.2.3