⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 excep_f.c

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 C
字号:
/* ************************************************************************** * * Component =    *  * Synopsis  =   rdbg/i386/excep.c * * $Id: excep_f.c,v 1.2 2002/02/01 17:00:01 joel Exp $ * ************************************************************************** */#include <rtems.h>#include <rtems/error.h>#include <assert.h>#include <errno.h>#include <rdbg/rdbg.h>#include <rdbg/servrpc.h>/* -----------------------------------------------------------------   Maping of hardware exceptions into Unix-like signal numbers.   It is identical to the one used by the PM and the AM.   ----------------------------------------------------------------- */  intExcepToSig (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.     */  voidBreakPointExcHdl (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);  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -