summaryrefslogtreecommitdiffstats
path: root/c/src/librdbg/src/m68k/excep_f.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--c/src/librdbg/src/m68k/excep_f.c172
1 files changed, 172 insertions, 0 deletions
diff --git a/c/src/librdbg/src/m68k/excep_f.c b/c/src/librdbg/src/m68k/excep_f.c
new file mode 100644
index 0000000000..aadf23387b
--- /dev/null
+++ b/c/src/librdbg/src/m68k/excep_f.c
@@ -0,0 +1,172 @@
+/*
+ **************************************************************************
+ *
+ * Component =
+ *
+ * Synopsis = rdbg/m68k/excep_f.c
+ *
+ * $Id$
+ *
+ **************************************************************************
+ */
+
+#include <rtems.h>
+#include <rtems/error.h>
+#include <assert.h>
+#include <errno.h>
+#include <rdbg/rdbg.h>
+#include <rdbg/servrpc.h>
+
+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;
+}
+
+
+/*----- Breakpoint Exception management -----*/
+
+ /*
+ * Handler for Breakpoint Exceptions :
+ * software breakpoints.
+ */
+
+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 */
+ PushSavedExceptCtx (_Thread_Executing->Object.id, ctx);
+ justSaveContext = 0;
+ }
+ else {
+ if (ctx->vecnum != 9) { /* trace */
+ 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->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);
+ 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->vecnum){
+ case 9 : /* trace */
+ DPRINTF((" TRACE EXCEPTION !!!\n"));
+ ctx->sr &= ~(1 << 15);
+ ExitForSingleStep-- ;
+ 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 );
+ 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);
+ }
+
+ connect_rdbg_exception(); /* monitor stub changes trace vector */
+}
+
+
+