diff options
Diffstat (limited to 'c/src/librdbg/src/m68k/excep_f.c')
-rw-r--r-- | c/src/librdbg/src/m68k/excep_f.c | 265 |
1 files changed, 155 insertions, 110 deletions
diff --git a/c/src/librdbg/src/m68k/excep_f.c b/c/src/librdbg/src/m68k/excep_f.c index aadf23387b..5f75f6696f 100644 --- a/c/src/librdbg/src/m68k/excep_f.c +++ b/c/src/librdbg/src/m68k/excep_f.c @@ -17,54 +17,107 @@ #include <rdbg/rdbg.h> #include <rdbg/servrpc.h> -int -ExcepToSig (Exception_context *ctx) + int +ExcepToSig (Exception_context * ctx) { int excep = getExcNum (ctx); - + switch (excep) { - case 2 : return 10; break; /* bus error */ - case 3 : return 10; break; /* address error */ - case 4 : return 4; break; /* illegal instruction */ - case 5 : return 8; break; /* zero divide */ - case 6 : return 8; break; /* chk instruction */ - case 7 : return 8; break; /* trapv instruction */ - case 8 : return 11; break; /* privilege violation */ - case 9 : return 5; break; /* trace trap */ - case 10: return 4; break; /* line 1010 emulator */ - case 11: return 4; break; /* line 1111 emulator */ - - /* Coprocessor protocol violation. Using a standard MMU or FPU - this cannot be triggered by software. Call it a SIGBUS. */ - case 13: return 10; break; - - case 31: return 2; break; /* interrupt */ - case 33: return 5; break; /* monitor breakpoint */ - case 34: return 2; break; /* lets use this for SCC1 interrupt */ - case 35: return 5; break; /* rdbg breakpoint */ - case 36: return 2; break; /* enter RDBG */ - /* This is a trap #8 instruction. Apparently it is someone's software - convention for some sort of SIGFPE condition. Whose? How many - people are being screwed by having this code the way it is? - Is there a clean solution? */ - case 40: return 8; break; /* floating point err */ - - case 47: return 5; break; /* rdbg breakpoint */ - - case 48: return 8; break; /* floating point err */ - case 49: return 8; break; /* floating point err */ - case 50: return 8; break; /* zero divide */ - case 51: return 8; break; /* underflow */ - case 52: return 8; break; /* operand error */ - case 53: return 8; break; /* overflow */ - case 54: return 8; break; /* NAN */ - default: - return 7; /* "software generated"*/ - } - return SIGKILL; + case 2: + return 10; + break; /* bus error */ + case 3: + return 10; + break; /* address error */ + case 4: + return 4; + break; /* illegal instruction */ + case 5: + return 8; + break; /* zero divide */ + case 6: + return 8; + break; /* chk instruction */ + case 7: + return 8; + break; /* trapv instruction */ + case 8: + return 11; + break; /* privilege violation */ + case 9: + return 5; + break; /* trace trap */ + case 10: + return 4; + break; /* line 1010 emulator */ + case 11: + return 4; + break; /* line 1111 emulator */ + + /* + * Coprocessor protocol violation. Using a standard MMU or FPU + * this cannot be triggered by software. Call it a SIGBUS. + */ + case 13: + return 10; + break; + + case 31: + return 2; + break; /* interrupt */ + case 33: + return 5; + break; /* monitor breakpoint */ + case 34: + return 2; + break; /* lets use this for SCC1 interrupt */ + case 35: + return 5; + break; /* rdbg breakpoint */ + case 36: + return 2; + break; /* enter RDBG */ + /* + * This is a trap #8 instruction. Apparently it is someone's software + * convention for some sort of SIGFPE condition. Whose? How many + * people are being screwed by having this code the way it is? + * Is there a clean solution? + */ + case 40: + return 8; + break; /* floating point err */ + + case 47: + return 5; + break; /* rdbg breakpoint */ + + case 48: + return 8; + break; /* floating point err */ + case 49: + return 8; + break; /* floating point err */ + case 50: + return 8; + break; /* zero divide */ + case 51: + return 8; + break; /* underflow */ + case 52: + return 8; + break; /* operand error */ + case 53: + return 8; + break; /* overflow */ + case 54: + return 8; + break; /* NAN */ + default: + return 7; /* "software generated" */ + } + return SIGKILL; } - /*----- Breakpoint Exception management -----*/ /* @@ -72,101 +125,93 @@ ExcepToSig (Exception_context *ctx) * software breakpoints. */ -void -BreakPointExcHdl(CPU_Exception_frame *ctx) + void +BreakPointExcHdl (CPU_Exception_frame * ctx) { rtems_status_code status; rtems_id continueSemId; - connect_rdbg_exception(); /* monitor stub changes trace vector */ - if ( (justSaveContext) && (ctx->vecnum == 47) ) { /* break */ + connect_rdbg_exception (); /* monitor stub changes trace vector */ + if ((justSaveContext) && (ctx->vecnum == 47)) { /* break */ PushSavedExceptCtx (_Thread_Executing->Object.id, ctx); justSaveContext = 0; - } - else { - if (ctx->vecnum != 9) { /* trace */ + } else { + if (ctx->vecnum != 9) { /* trace */ NbSerializedCtx++; - rtems_semaphore_obtain(serializeSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + 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->vecnum, - ctx->pc, - _Thread_Executing->Object.id); - printk("----------------------------------------------------------\n"); - printk("Processor execution context at time of the fault was :\n"); - printk("----------------------------------------------------------\n"); - printk("\t A0 = %x\n", ctx->a0); - printk("\t A1 = %x\n", ctx->a1); - printk("\t A2 = %x\n", ctx->a2); - printk("\t A3 = %x\n", ctx->a3); - printk("\t A4 = %x\n", ctx->a4); - printk("\t A5 = %x\n", ctx->a5); - printk("\t A6 = %x\n", ctx->a6); - printk("\t A7 = %x\n", ctx->a7); - printk("\t D0 = %x\n", ctx->d0); - printk("\t D1 = %x\n", ctx->d1); - printk("\t D2 = %x\n", ctx->d2); - printk("\t D3 = %x\n", ctx->d3); - printk("\t D4 = %x\n", ctx->d4); - printk("\t D5 = %x\n", ctx->d5); - printk("\t D6 = %x\n", ctx->d6); - printk("\t D7 = %x\n", ctx->d7); - printk("\t SR = %x\n", ctx->sr); + printk ("----------------------------------------------------------\n"); + printk ("Exception %d caught at PC %x by thread %d\n", + ctx->vecnum, ctx->pc, _Thread_Executing->Object.id); + printk ("----------------------------------------------------------\n"); + printk ("Processor execution context at time of the fault was :\n"); + printk ("----------------------------------------------------------\n"); + printk ("\t A0 = %x\n", ctx->a0); + printk ("\t A1 = %x\n", ctx->a1); + printk ("\t A2 = %x\n", ctx->a2); + printk ("\t A3 = %x\n", ctx->a3); + printk ("\t A4 = %x\n", ctx->a4); + printk ("\t A5 = %x\n", ctx->a5); + printk ("\t A6 = %x\n", ctx->a6); + printk ("\t A7 = %x\n", ctx->a7); + printk ("\t D0 = %x\n", ctx->d0); + printk ("\t D1 = %x\n", ctx->d1); + printk ("\t D2 = %x\n", ctx->d2); + printk ("\t D3 = %x\n", ctx->d3); + printk ("\t D4 = %x\n", ctx->d4); + printk ("\t D5 = %x\n", ctx->d5); + printk ("\t D6 = %x\n", ctx->d6); + printk ("\t D7 = %x\n", ctx->d7); + printk ("\t SR = %x\n", ctx->sr); #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); + 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)); + rtems_status_text (status)); PushExceptCtx (_Thread_Executing->Object.id, continueSemId, ctx); - - switch (ctx->vecnum){ - case 9 : /* trace */ - DPRINTF((" TRACE EXCEPTION !!!\n")); + + switch (ctx->vecnum) { + case 9: /* trace */ + DPRINTF ((" TRACE EXCEPTION !!!\n")); ctx->sr &= ~(1 << 15); - ExitForSingleStep-- ; - rtems_semaphore_release( wakeupEventSemId ); - break; + ExitForSingleStep--; + rtems_semaphore_release (wakeupEventSemId); + break; - case 47 : /* trap #15 */ - DPRINTF((" BREAKPOINT EXCEPTION !!!\n")); - rtems_semaphore_release( wakeupEventSemId ); - break; + case 47: /* trap #15 */ + DPRINTF ((" BREAKPOINT EXCEPTION !!!\n")); + rtems_semaphore_release (wakeupEventSemId); + break; - case 36 : /* trap #4 */ - DPRINTF((" ENTER RDBG !!!\n")); - rtems_semaphore_release( wakeupEventSemId ); + case 36: /* trap #4 */ + DPRINTF ((" ENTER RDBG !!!\n")); + rtems_semaphore_release (wakeupEventSemId); break; default: - DPRINTF((" OTHER EXCEPTION !!!\n")); - rtems_semaphore_release( wakeupEventSemId ); + DPRINTF ((" OTHER EXCEPTION !!!\n")); + rtems_semaphore_release (wakeupEventSemId); break; } - rtems_semaphore_obtain(continueSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT); - + rtems_semaphore_obtain (continueSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT); + PopExceptCtx (_Thread_Executing->Object.id); - rtems_semaphore_delete(continueSemId); + rtems_semaphore_delete (continueSemId); } - connect_rdbg_exception(); /* monitor stub changes trace vector */ + connect_rdbg_exception (); /* monitor stub changes trace vector */ } - - - |