summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/m68k/ods68302/startup/gdb-hooks.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/m68k/ods68302/startup/gdb-hooks.c')
-rw-r--r--c/src/lib/libbsp/m68k/ods68302/startup/gdb-hooks.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/m68k/ods68302/startup/gdb-hooks.c b/c/src/lib/libbsp/m68k/ods68302/startup/gdb-hooks.c
new file mode 100644
index 0000000000..64d220219f
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/ods68302/startup/gdb-hooks.c
@@ -0,0 +1,76 @@
+/*****************************************************************************/
+/*
+ $Id$
+
+ Hooks for GDB
+
+ */
+/*****************************************************************************/
+
+
+#include <bsp.h>
+#include <m68302.h>
+#include <m68302scc.h>
+
+static int initialised = 0;
+
+void putDebugChar(char ch)
+{
+ if (!initialised)
+ {
+ scc_initialise(DEBUG_PORT, DEBUG_BAUD, 0);
+ initialised = 1;
+ }
+
+ scc_out(DEBUG_PORT, ch);
+}
+
+char getDebugChar(void)
+{
+ if (!initialised)
+ {
+ scc_initialise(DEBUG_PORT, DEBUG_BAUD, 0);
+ initialised = 1;
+ }
+
+ while (!scc_status(DEBUG_PORT, 0));
+
+ return scc_in(DEBUG_PORT);
+}
+
+/*
+ * Need to create yet another jump table for gdb this time
+ */
+
+void (*exceptionHook)(unsigned int) = 0;
+
+typedef struct {
+ rtems_unsigned16 move_a7; /* move #FORMAT_ID,%a7@- */
+ rtems_unsigned16 format_id;
+ rtems_unsigned16 jmp; /* jmp _ISR_Handlers */
+ rtems_unsigned32 isr_handler;
+} GDB_HANDLER_ENTRY;
+
+#if !defined(M68K_MOVE_A7)
+#define M68K_MOVE_A7 0x3F3C
+#endif
+
+#if !defined(M68K_JMP)
+#define M68K_JMP 0x4EF9
+#endif
+
+/* points to jsr-exception-table in targets wo/ VBR register */
+static GDB_HANDLER_ENTRY gdb_jump_table[256];
+
+void exceptionHandler(unsigned int vector, void *handler)
+{
+ rtems_unsigned32 *interrupt_table = 0;
+
+ gdb_jump_table[vector].move_a7 = M68K_MOVE_A7;
+ gdb_jump_table[vector].format_id = vector;
+ gdb_jump_table[vector].jmp = M68K_JMP;
+ gdb_jump_table[vector].isr_handler = (rtems_unsigned32) handler;
+
+ interrupt_table[vector] = (rtems_unsigned32) &gdb_jump_table[vector];
+}
+