aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2015-06-29 16:43:39 +0100
committerMichael Brown <mcb30@ipxe.org>2015-06-29 16:44:16 +0100
commita0f60d26f5780196f75f4b14444dfa8d020a5e00 (patch)
tree1ca4b35752cb30e03faa03e9e3ad084dbba0e57e
parent8829634bd7188bdfa5528421a8bbecf39c498f40 (diff)
downloadipxe-a0f60d26f5780196f75f4b14444dfa8d020a5e00.zip
ipxe-a0f60d26f5780196f75f4b14444dfa8d020a5e00.tar.gz
ipxe-a0f60d26f5780196f75f4b14444dfa8d020a5e00.tar.bz2
[gdb] Allow gdbstub to be started on an arbitrary serial port
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/core/gdbserial.c43
-rw-r--r--src/include/ipxe/gdbserial.h8
2 files changed, 44 insertions, 7 deletions
diff --git a/src/core/gdbserial.c b/src/core/gdbserial.c
index 802463f..0983f25 100644
--- a/src/core/gdbserial.c
+++ b/src/core/gdbserial.c
@@ -24,6 +24,8 @@
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
#include <assert.h>
#include <ipxe/uart.h>
#include <ipxe/gdbstub.h>
@@ -54,6 +56,8 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
/** GDB serial UART */
static struct uart gdbserial_uart;
+struct gdb_transport serial_gdb_transport __gdb_transport;
+
static size_t gdbserial_recv ( char *buf, size_t len ) {
assert ( len > 0 );
@@ -69,15 +73,27 @@ static void gdbserial_send ( const char *buf, size_t len ) {
}
}
-static int gdbserial_init ( int argc __unused, char **argv __unused ) {
- int rc;
+static int gdbserial_init ( int argc, char **argv ) {
+ unsigned int port;
+ char *endp;
- if ( ( rc = uart_select ( &gdbserial_uart, GDBSERIAL_PORT ) ) != 0 )
- return rc;
+ if ( argc == 0 ) {
+ port = GDBSERIAL_PORT;
+ } else if ( argc == 1 ) {
+ port = strtoul ( argv[0], &endp, 10 );
+ if ( *endp ) {
+ printf ( "serial: invalid port\n" );
+ return 1;
+ }
+ } else {
+ printf ( "serial: syntax <port>\n" );
+ return 1;
+ }
- if ( ( rc = uart_init ( &gdbserial_uart, GDBSERIAL_BAUD,
- GDBSERIAL_LCR ) ) != 0 )
- return rc;
+ if ( ! gdbserial_configure ( port, GDBSERIAL_BAUD, GDBSERIAL_LCR ) ) {
+ printf ( "serial: unable to configure\n" );
+ return 1;
+ }
return 0;
}
@@ -88,3 +104,16 @@ struct gdb_transport serial_gdb_transport __gdb_transport = {
.recv = gdbserial_recv,
.send = gdbserial_send,
};
+
+struct gdb_transport * gdbserial_configure ( unsigned int port,
+ unsigned int baud, uint8_t lcr ) {
+ int rc;
+
+ if ( ( rc = uart_select ( &gdbserial_uart, port ) ) != 0 )
+ return NULL;
+
+ if ( ( rc = uart_init ( &gdbserial_uart, baud, lcr ) ) != 0 )
+ return NULL;
+
+ return &serial_gdb_transport;
+}
diff --git a/src/include/ipxe/gdbserial.h b/src/include/ipxe/gdbserial.h
index db9cb15..e1040c9 100644
--- a/src/include/ipxe/gdbserial.h
+++ b/src/include/ipxe/gdbserial.h
@@ -9,4 +9,12 @@
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
+#include <stdint.h>
+
+struct gdb_transport;
+
+extern struct gdb_transport * gdbserial_configure ( unsigned int port,
+ unsigned int baud,
+ uint8_t lcr );
+
#endif /* _IPXE_GDBSERIAL_H */