From 981b99faf208e2c7f6e2b83d73e1b89b669112ee Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Tue, 10 Aug 1999 16:41:44 +0000 Subject: Patch from Eric Valette and Emmanuel Raguet : - the dec21140 driver code has been hardened (various bug fixed) Emmanuel, - bug in the mcp750 init code have been fixed (interrupt stack/initial stack initialization), BSS correctly cleared (Eric V) - remote debugging over TCP/IP is nearly complete (berakpoints, backtrace, variables,...) (Eric V), - exception handling code has also been improved in order to fully support RDBG requirements (Eric V), --- c/src/librdbg/src/i386/any/Makefile.in | 6 +- c/src/librdbg/src/i386/any/remdeb_f.x | 1 + c/src/librdbg/src/i386/excep.c | 233 ------------------------------- c/src/librdbg/src/i386/excep_f.c | 153 ++++++++++++++++++++ c/src/librdbg/src/i386/pc386/Makefile.in | 6 +- c/src/librdbg/src/i386/pc386/remdeb_f.x | 1 + c/src/librdbg/src/i386/rdbg_cpu_asm.S | 4 +- c/src/librdbg/src/i386/rdbg_f.c | 25 ++++ 8 files changed, 191 insertions(+), 238 deletions(-) create mode 100644 c/src/librdbg/src/i386/excep_f.c (limited to 'c/src/librdbg/src/i386') diff --git a/c/src/librdbg/src/i386/any/Makefile.in b/c/src/librdbg/src/i386/any/Makefile.in index 9663082c39..aeaab6cb8a 100644 --- a/c/src/librdbg/src/i386/any/Makefile.in +++ b/c/src/librdbg/src/i386/any/Makefile.in @@ -17,8 +17,10 @@ LIBNAME = librdbg.a LIB = ${ARCH}/${LIBNAME} # C and C++ source names, if any, go here -- minus the .c or .cc -C_PIECES = rdbg servcon servbkpt servrpc excep servtgt servtsp servutil \ - _servtgt rdbg_f ptrace +C_PIECES = rdbg servcon servbkpt servrpc excep excep_f \ + servtgt servtsp servutil _servtgt rdbg_f \ + ptrace + C_FILES = $(C_PIECES:%=%.c) C_O_FILES = $(C_PIECES:%=${ARCH}/%.o) diff --git a/c/src/librdbg/src/i386/any/remdeb_f.x b/c/src/librdbg/src/i386/any/remdeb_f.x index 0ff52d1307..01d899fe54 100644 --- a/c/src/librdbg/src/i386/any/remdeb_f.x +++ b/c/src/librdbg/src/i386/any/remdeb_f.x @@ -5,6 +5,7 @@ * * Synopsis = remdeb_f.x * + * $Id$ * ************************************************************************** */ diff --git a/c/src/librdbg/src/i386/excep.c b/c/src/librdbg/src/i386/excep.c index 497c804e70..e69de29bb2 100644 --- a/c/src/librdbg/src/i386/excep.c +++ b/c/src/librdbg/src/i386/excep.c @@ -1,233 +0,0 @@ -/* - ************************************************************************** - * - * Component = - * - * Synopsis = rdbg/i386/excep.c - * - ************************************************************************** - */ - -#include -#include -#include -#include -#include -#include -#include - - -extern rtems_id serializeSemId; -extern rtems_id wakeupEventSemId; - - -unsigned int NbExceptCtx; -volatile unsigned int NbSerializedCtx; -Exception_context *FirstCtx = NULL; -Exception_context *LastCtx = NULL; - -CPU_Exception_frame SavedContext; - - -/********* Save an exception context at the end of a list *****/ - -int PushExceptCtx ( Objects_Id Id, Objects_Id semId, CPU_Exception_frame *ctx ) { - - Exception_context *SaveCtx; - - SaveCtx = (Exception_context *)malloc(sizeof(Exception_context)); - if (SaveCtx == NULL) - rtems_panic("Can't allocate memory to save Exception context"); - - SaveCtx->id = Id; - SaveCtx->ctx = ctx; - SaveCtx->semaphoreId = semId; - SaveCtx->previous = NULL; - SaveCtx->next = NULL; - - if (FirstCtx == NULL){ /* initialization */ - FirstCtx = SaveCtx; - LastCtx = SaveCtx; - NbExceptCtx = 1; - } - else { - NbExceptCtx ++; - LastCtx->next = SaveCtx; - SaveCtx->previous = LastCtx; - LastCtx = SaveCtx; - } - return 0; -} - -/********* Save an temporary exception context in a ******/ -/********* global variable ******/ - -int PushSavedExceptCtx ( Objects_Id Id, CPU_Exception_frame *ctx ) { - - memcpy (&(SavedContext), ctx, sizeof(CPU_Exception_frame)); - return 0; -} - - -/****** Remove the context of the specified Id thread *********/ -/****** If Id = -1, then return the first context *********/ - - -int PopExceptCtx ( Objects_Id Id ) { - - Exception_context *ExtractCtx; - - if (FirstCtx == NULL) return -1; - - if (Id == -1) { - ExtractCtx = LastCtx; - LastCtx = LastCtx->previous; - free(ExtractCtx); - NbExceptCtx --; - return 0; - } - - ExtractCtx = LastCtx; - - while (ExtractCtx->id != Id && ExtractCtx != NULL) { - ExtractCtx = ExtractCtx->previous; - } - - if (ExtractCtx == NULL) - return -1; - - if ( ExtractCtx->previous != NULL) - (ExtractCtx->previous)->next = ExtractCtx->next; - - if ( ExtractCtx->next != NULL) - (ExtractCtx->next)->previous = ExtractCtx->previous; - - if (ExtractCtx == FirstCtx) - FirstCtx = FirstCtx->next; - else - if (ExtractCtx == LastCtx) - LastCtx = LastCtx->previous; - - free(ExtractCtx); - NbExceptCtx --; - return 0; -} - -/****** Return the context of the specified Id thread *********/ -/****** If Id = -1, then return the first context *********/ - - -Exception_context *GetExceptCtx ( Objects_Id Id ) { - - Exception_context *ExtractCtx; - - if (FirstCtx == NULL) return NULL; - - if (Id == -1) { - return LastCtx; - } - - ExtractCtx = LastCtx; - - while (ExtractCtx->id != Id && ExtractCtx != NULL) { - ExtractCtx = ExtractCtx->previous; - } - - if (ExtractCtx == NULL) - return NULL; - - return ExtractCtx; -} - -/*----- Breakpoint Exception management -----*/ - - /* - * Handler for Breakpoint Exceptions : - * software breakpoints. - */ - -void -BreakPointExcHdl(CPU_Exception_frame *ctx) -{ - rtems_status_code status; - rtems_id continueSemId; - - if ( (justSaveContext) && (ctx->idtIndex == I386_EXCEPTION_ENTER_RDBG) ) { - PushSavedExceptCtx (_Thread_Executing->Object.id, ctx); - justSaveContext = 0; - } - else { - if (ctx->idtIndex != I386_EXCEPTION_DEBUG){ - NbSerializedCtx++; - rtems_semaphore_obtain(serializeSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT); - NbSerializedCtx--; - } - - currentTargetThread = _Thread_Executing->Object.id; - -#ifdef DDEBUG - 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"); -#endif - - status = rtems_semaphore_create (rtems_build_name('D', 'B', 'G', 'c'), - 0, - RTEMS_FIFO | - RTEMS_COUNTING_SEMAPHORE | - RTEMS_NO_INHERIT_PRIORITY | - RTEMS_NO_PRIORITY_CEILING | - RTEMS_LOCAL, - 0, - &continueSemId); - if (status != RTEMS_SUCCESSFUL) - rtems_panic ("Can't create continue semaphore: `%s'\n",rtems_status_text(status)); - - PushExceptCtx (_Thread_Executing->Object.id, continueSemId, ctx); - - switch (ctx->idtIndex){ - case I386_EXCEPTION_DEBUG: - DPRINTF((" DEBUG EXCEPTION !!!\n")); - ctx->eflags &= ~EFLAGS_TF; - ExitForSingleStep-- ; - rtems_semaphore_release( wakeupEventSemId ); - break; - - case I386_EXCEPTION_BREAKPOINT: - DPRINTF((" BREAKPOINT EXCEPTION !!!\n")); - rtems_semaphore_release( wakeupEventSemId ); - break; - - case I386_EXCEPTION_ENTER_RDBG: - DPRINTF((" ENTER RDBG !!!\n")); - rtems_semaphore_release( wakeupEventSemId ); - break; - - default: - DPRINTF((" OTHER EXCEPTION !!!\n")); - rtems_semaphore_release( wakeupEventSemId ); - break; - } - - rtems_semaphore_obtain(continueSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT); - - PopExceptCtx (_Thread_Executing->Object.id); - rtems_semaphore_delete(continueSemId); - } -} - - - diff --git a/c/src/librdbg/src/i386/excep_f.c b/c/src/librdbg/src/i386/excep_f.c new file mode 100644 index 0000000000..100b0d79d6 --- /dev/null +++ b/c/src/librdbg/src/i386/excep_f.c @@ -0,0 +1,153 @@ +/* + ************************************************************************** + * + * Component = + * + * Synopsis = rdbg/i386/excep.c + * + * $Id$ + * + ************************************************************************** + */ + +#include +#include +#include +#include +#include +#include + +/* ----------------------------------------------------------------- + Maping of hardware exceptions into Unix-like signal numbers. + It is identical to the one used by the PM and the AM. + ----------------------------------------------------------------- */ + + int +ExcepToSig (Exception_context *ctx) +{ + int excep = getExcNum (ctx); + + + switch (excep) { + + case I386_EXCEPTION_MATH_COPROC_UNAVAIL: + case I386_EXCEPTION_I386_COPROC_SEG_ERR: + case I386_EXCEPTION_FLOAT_ERROR: + case I386_EXCEPTION_BOUND: + return SIGFPE; + + case I386_EXCEPTION_DEBUG: + case I386_EXCEPTION_BREAKPOINT: + case I386_EXCEPTION_ENTER_RDBG: + return SIGTRAP; + + case I386_EXCEPTION_OVERFLOW: + case I386_EXCEPTION_DIVIDE_BY_ZERO: + case I386_EXCEPTION_ILLEGAL_INSTR: + return SIGILL; + + case I386_EXCEPTION_SEGMENT_NOT_PRESENT: + case I386_EXCEPTION_STACK_SEGMENT_FAULT: + case I386_EXCEPTION_GENERAL_PROT_ERR: + case I386_EXCEPTION_PAGE_FAULT: + return SIGSEGV; + + default: + break; + } + return SIGKILL; +} + + +/*----- Breakpoint Exception management -----*/ + + /* + * Handler for Breakpoint Exceptions : + * software breakpoints. + */ + +void +BreakPointExcHdl(CPU_Exception_frame *ctx) +{ + rtems_status_code status; + rtems_id continueSemId; + + if ( (justSaveContext) && (ctx->idtIndex == I386_EXCEPTION_ENTER_RDBG) ) { + PushSavedExceptCtx (_Thread_Executing->Object.id, ctx); + justSaveContext = 0; + } + else { + if (ctx->idtIndex != I386_EXCEPTION_DEBUG){ + NbSerializedCtx++; + rtems_semaphore_obtain(serializeSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + NbSerializedCtx--; + } + + currentTargetThread = _Thread_Executing->Object.id; + +#ifdef DDEBUG + 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"); +#endif + + status = rtems_semaphore_create (rtems_build_name('D', 'B', 'G', 'c'), + 0, + RTEMS_FIFO | + RTEMS_COUNTING_SEMAPHORE | + RTEMS_NO_INHERIT_PRIORITY | + RTEMS_NO_PRIORITY_CEILING | + RTEMS_LOCAL, + 0, + &continueSemId); + if (status != RTEMS_SUCCESSFUL) + rtems_panic ("Can't create continue semaphore: `%s'\n",rtems_status_text(status)); + + PushExceptCtx (_Thread_Executing->Object.id, continueSemId, ctx); + + switch (ctx->idtIndex){ + case I386_EXCEPTION_DEBUG: + DPRINTF((" DEBUG EXCEPTION !!!\n")); + ctx->eflags &= ~EFLAGS_TF; + ExitForSingleStep-- ; + rtems_semaphore_release( wakeupEventSemId ); + break; + + case I386_EXCEPTION_BREAKPOINT: + DPRINTF((" BREAKPOINT EXCEPTION !!!\n")); + rtems_semaphore_release( wakeupEventSemId ); + break; + + case I386_EXCEPTION_ENTER_RDBG: + DPRINTF((" ENTER RDBG !!!\n")); + rtems_semaphore_release( wakeupEventSemId ); + break; + + default: + DPRINTF((" OTHER EXCEPTION !!!\n")); + rtems_semaphore_release( wakeupEventSemId ); + break; + } + + rtems_semaphore_obtain(continueSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + + PopExceptCtx (_Thread_Executing->Object.id); + rtems_semaphore_delete(continueSemId); + } +} + + + diff --git a/c/src/librdbg/src/i386/pc386/Makefile.in b/c/src/librdbg/src/i386/pc386/Makefile.in index 9663082c39..aeaab6cb8a 100644 --- a/c/src/librdbg/src/i386/pc386/Makefile.in +++ b/c/src/librdbg/src/i386/pc386/Makefile.in @@ -17,8 +17,10 @@ LIBNAME = librdbg.a LIB = ${ARCH}/${LIBNAME} # C and C++ source names, if any, go here -- minus the .c or .cc -C_PIECES = rdbg servcon servbkpt servrpc excep servtgt servtsp servutil \ - _servtgt rdbg_f ptrace +C_PIECES = rdbg servcon servbkpt servrpc excep excep_f \ + servtgt servtsp servutil _servtgt rdbg_f \ + ptrace + C_FILES = $(C_PIECES:%=%.c) C_O_FILES = $(C_PIECES:%=${ARCH}/%.o) diff --git a/c/src/librdbg/src/i386/pc386/remdeb_f.x b/c/src/librdbg/src/i386/pc386/remdeb_f.x index 0ff52d1307..01d899fe54 100644 --- a/c/src/librdbg/src/i386/pc386/remdeb_f.x +++ b/c/src/librdbg/src/i386/pc386/remdeb_f.x @@ -5,6 +5,7 @@ * * Synopsis = remdeb_f.x * + * $Id$ * ************************************************************************** */ diff --git a/c/src/librdbg/src/i386/rdbg_cpu_asm.S b/c/src/librdbg/src/i386/rdbg_cpu_asm.S index f0942310ce..073262f864 100644 --- a/c/src/librdbg/src/i386/rdbg_cpu_asm.S +++ b/c/src/librdbg/src/i386/rdbg_cpu_asm.S @@ -3,6 +3,8 @@ * This file contains all assembly code for the Intel i386 implementation * of RDBG. * + * $Id$ + * */ #include @@ -10,7 +12,7 @@ BEGIN_CODE /* - * void copyback_data_cache_and_invalidate_instr_cache() + * void copyback_data_cache_and_invalidate_instr_cache(addr, size) * * This routine performs a copy of the data cache * and invalidate the instruction cache diff --git a/c/src/librdbg/src/i386/rdbg_f.c b/c/src/librdbg/src/i386/rdbg_f.c index aeb07fcbe8..b339256e70 100644 --- a/c/src/librdbg/src/i386/rdbg_f.c +++ b/c/src/librdbg/src/i386/rdbg_f.c @@ -5,6 +5,8 @@ * * Synopsis = rdbg/i386/rdbg_f.c * + * $Id$ + * ************************************************************************** */ @@ -128,3 +130,26 @@ CancelSingleStep (CPU_Exception_frame* ctx) ctx->eflags &= ~EFLAGS_TF; ExitForSingleStep-- ; } + +cpuExcHandlerType old_currentExcHandler; +extern void rtems_exception_prologue_50(); + +void connect_rdbg_exception() +{ + interrupt_gate_descriptor *currentIdtEntry; + unsigned limit; + unsigned level; + + /* + * Connect the Exception used to debug + */ + i386_get_info_from_IDTR (¤tIdtEntry, &limit); + + _CPU_ISR_Disable(level); + create_interrupt_gate_descriptor (¤tIdtEntry[50], rtems_exception_prologue_50); + _CPU_ISR_Enable(level); + + old_currentExcHandler = _currentExcHandler; + _currentExcHandler = BreakPointExcHdl ; + +} -- cgit v1.2.3