summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/mips/genmongoosev/startup/gdb-support.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/mips/genmongoosev/startup/gdb-support.c')
-rw-r--r--c/src/lib/libbsp/mips/genmongoosev/startup/gdb-support.c93
1 files changed, 90 insertions, 3 deletions
diff --git a/c/src/lib/libbsp/mips/genmongoosev/startup/gdb-support.c b/c/src/lib/libbsp/mips/genmongoosev/startup/gdb-support.c
index b27c0ab99e..5aebbb936a 100644
--- a/c/src/lib/libbsp/mips/genmongoosev/startup/gdb-support.c
+++ b/c/src/lib/libbsp/mips/genmongoosev/startup/gdb-support.c
@@ -13,16 +13,103 @@
#include <rtems.h>
#include <rtems/bspIo.h>
+#include <libcpu/mongoose-v.h>
+
+#include <rtems/libio.h>
+
+
+
+/*
+
+We're going to call right down into the uart driver because we're
+operating within an exception. if things are broken because something
+bad happened, this may be our last chance to debug before RTEMS goes
+mad, so we won't rely on the I/O subsystem to be operating. This is a
+little messy, but at least we're not talking right to the hardware.
+
+*/
+
+extern int mg5uart_set_attributes(int minor,const struct termios *t);
+extern int mg5uart_open(int major,int minor, void *arg);
+extern int mg5uart_close(int major,int minor, void *arg);
+extern void mg5uart_write_polled(int minor, char c );
+extern int mg5uart_inbyte_nonblocking_polled(int minor);
+
+
+extern void mips_gdb_stub_install(void);
+
+
+static int debugUartEnabled = 0;
+
+
+
+int mg5rdbgOpenGDBuart(int breakoninit)
+{
+ struct termios t;
+ memset(&t,0,sizeof(struct termios));
+
+ if( mg5uart_open(0,1,NULL) != RTEMS_SUCCESSFUL )
+ {
+ printf("gdbstub: Failed to open UART port 2\n");
+ return -1;
+ }
+
+ t.c_cflag |= B19200;
+ t.c_cflag |= CS8;
+ if( mg5uart_set_attributes(1,&t) != 0 )
+ {
+ printf("gdbstub: Failed to configure UART 2 for 19200N82\n");
+ return -1;
+ }
+
+ debugUartEnabled = -1;
+
+ /* set up vectoring for gdb */
+ mips_gdb_stub_install();
+
+ printf("gdbstub: Remote GDB stub listening on UART 2 at 19200N82\n");
+
+ if( breakoninit )
+ {
+ /*
+ break to gdb. We'll wait there for the operator to get their gdb
+ going, then they can 'continue' or do whatever.
+ */
+ mips_break(0);
+ }
+
+ printf("gdbstub: User code running\n");
+
+ return RTEMS_SUCCESSFUL;
+}
+
+
+void mg5rdbgCloseGDBuart(void)
+{
+ mg5uart_close(0,1,NULL);
+ debugUartEnabled = 0;
+}
+
+
char getDebugChar (void)
{
- return 0;
+ if( debugUartEnabled )
+ {
+ int rv;
+
+ while( (rv = mg5uart_inbyte_nonblocking_polled(1)) < 0 );
+ return (char)rv;
+ }
+
+ return 0;
}
+
void putDebugChar (char c)
{
- /* big hack */
- printk( "%c" );
+ if( debugUartEnabled )
+ return mg5uart_write_polled(1,c);
}