Skip to content

Commit

Permalink
[gdb] Allow gdbstub to be started on an arbitrary serial port
Browse files Browse the repository at this point in the history
Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Jun 29, 2015
1 parent 8829634 commit a0f60d2
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 7 deletions.
43 changes: 36 additions & 7 deletions src/core/gdbserial.c
Expand Up @@ -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>
Expand Down Expand Up @@ -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 );
Expand All @@ -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;
}
Expand All @@ -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;
}
8 changes: 8 additions & 0 deletions src/include/ipxe/gdbserial.h
Expand Up @@ -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 */

0 comments on commit a0f60d2

Please sign in to comment.