summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arch/x86/lib/c_start.S1
-rw-r--r--src/arch/x86/lib/exception.c13
-rw-r--r--src/console/console.c24
-rw-r--r--src/include/console/streams.h6
-rw-r--r--src/include/console/uart.h8
-rw-r--r--src/include/console/usb.h16
6 files changed, 64 insertions, 4 deletions
diff --git a/src/arch/x86/lib/c_start.S b/src/arch/x86/lib/c_start.S
index faea22d6a6..675a09ce72 100644
--- a/src/arch/x86/lib/c_start.S
+++ b/src/arch/x86/lib/c_start.S
@@ -86,6 +86,7 @@ _start:
post_code(POST_PRE_HARDWAREMAIN) /* post fe */
#if CONFIG_GDB_WAIT
+ call gdb_hw_init
call gdb_stub_breakpoint
#endif
call main
diff --git a/src/arch/x86/lib/exception.c b/src/arch/x86/lib/exception.c
index 97569493fd..f64b2e799b 100644
--- a/src/arch/x86/lib/exception.c
+++ b/src/arch/x86/lib/exception.c
@@ -1,4 +1,5 @@
#include <console/console.h>
+#include <console/streams.h>
#include <string.h>
#if CONFIG_GDB_STUB
@@ -217,12 +218,17 @@ static char out_buffer[BUFMAX];
static inline void stub_putc(int ch)
{
- console_tx_byte(ch);
+ gdb_tx_byte(ch);
+}
+
+static inline void stub_flush(void)
+{
+ gdb_tx_flush();
}
static inline int stub_getc(void)
{
- return console_rx_byte();
+ return gdb_rx_byte();
}
static int hex(char ch)
@@ -322,9 +328,11 @@ static int get_packet(char *buffer)
if (checksum != xmitcsum) {
stub_putc('-'); /* failed checksum */
+ stub_flush();
}
else {
stub_putc('+'); /* successful transfer */
+ stub_flush();
}
}
} while(checksum != xmitcsum);
@@ -353,6 +361,7 @@ static void put_packet(char *buffer)
stub_putc('#');
stub_putc(hexchars[checksum >> 4]);
stub_putc(hexchars[checksum % 16]);
+ stub_flush();
} while ((stub_getc() & 0x7f) != '+');
diff --git a/src/console/console.c b/src/console/console.c
index 9b1c25542a..bd03144a32 100644
--- a/src/console/console.c
+++ b/src/console/console.c
@@ -17,6 +17,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include <rules.h>
#include <console/streams.h>
#include <console/cbmem_console.h>
#include <console/uart.h>
@@ -53,3 +54,26 @@ void console_tx_flush(void)
__ne2k_tx_flush();
__usb_tx_flush();
}
+
+
+#if CONFIG_GDB_STUB && (ENV_ROMSTAGE || ENV_RAMSTAGE)
+void gdb_hw_init(void)
+{
+ __gdb_hw_init();
+}
+
+void gdb_tx_byte(unsigned char byte)
+{
+ __gdb_tx_byte(byte);
+}
+
+void gdb_tx_flush(void)
+{
+ __gdb_tx_flush();
+}
+
+unsigned char gdb_rx_byte(void)
+{
+ return __gdb_rx_byte();
+}
+#endif
diff --git a/src/include/console/streams.h b/src/include/console/streams.h
index 9d4d3fcc6b..fb168da905 100644
--- a/src/include/console/streams.h
+++ b/src/include/console/streams.h
@@ -22,6 +22,12 @@ void console_hw_init(void);
void console_tx_byte(unsigned char byte);
void console_tx_flush(void);
+/* For remote GDB debugging. */
+void gdb_hw_init(void);
+void gdb_tx_byte(unsigned char byte);
+void gdb_tx_flush(void);
+unsigned char gdb_rx_byte(void);
+
/* Helpers for ROMCC console. */
void console_tx_nibble(unsigned nibble);
void console_tx_hex8(unsigned char value);
diff --git a/src/include/console/uart.h b/src/include/console/uart.h
index b08cd9b4f1..d4020c3aa0 100644
--- a/src/include/console/uart.h
+++ b/src/include/console/uart.h
@@ -69,6 +69,14 @@ static inline void __uart_tx_byte(u8 data) {}
static inline void __uart_tx_flush(void) {}
#endif
+#if CONFIG_GDB_STUB && (ENV_ROMSTAGE || ENV_RAMSTAGE)
+#define CONFIG_UART_FOR_GDB CONFIG_UART_FOR_CONSOLE
+static inline void __gdb_hw_init(void) { uart_init(CONFIG_UART_FOR_GDB); }
+static inline void __gdb_tx_byte(u8 data) { uart_tx_byte(CONFIG_UART_FOR_GDB, data); }
+static inline void __gdb_tx_flush(void) { uart_tx_flush(CONFIG_UART_FOR_GDB); }
+static inline u8 __gdb_rx_byte(void) { return uart_rx_byte(CONFIG_UART_FOR_GDB); }
+#endif
+
#endif /* __ROMCC__ */
#endif /* CONSOLE_UART_H */
diff --git a/src/include/console/usb.h b/src/include/console/usb.h
index 57ea4eb3df..b5aab66649 100644
--- a/src/include/console/usb.h
+++ b/src/include/console/usb.h
@@ -34,14 +34,26 @@ int usb_can_rx_byte(int idx);
#define __CONSOLE_USB_ENABLE__ CONFIG_CONSOLE_USB && \
((ENV_ROMSTAGE && CONFIG_USBDEBUG_IN_ROMSTAGE) || ENV_RAMSTAGE)
+#define USB_PIPE_FOR_CONSOLE 0
+#define USB_PIPE_FOR_GDB 0
+
#if __CONSOLE_USB_ENABLE__
static inline void __usbdebug_init(void) { usbdebug_init(); }
-static inline void __usb_tx_byte(u8 data) { usb_tx_byte(0, data); }
-static inline void __usb_tx_flush(void) { usb_tx_flush(0); }
+static inline void __usb_tx_byte(u8 data) { usb_tx_byte(USB_PIPE_FOR_CONSOLE, data); }
+static inline void __usb_tx_flush(void) { usb_tx_flush(USB_PIPE_FOR_CONSOLE); }
#else
static inline void __usbdebug_init(void) {}
static inline void __usb_tx_byte(u8 data) {}
static inline void __usb_tx_flush(void) {}
#endif
+/* */
+#if 0 && CONFIG_GDB_STUB && \
+ ((ENV_ROMSTAGE && CONFIG_USBDEBUG_IN_ROMSTAGE) || ENV_RAMSTAGE)
+static inline void __gdb_hw_init(void) { usbdebug_init(); }
+static inline void __gdb_tx_byte(u8 data) { usb_tx_byte(USB_PIPE_FOR_GDB, data); }
+static inline void __gdb_tx_flush(void) { usb_tx_flush(USB_PIPE_FOR_GDB); }
+static inline u8 __gdb_rx_byte(void) { return usb_rx_byte(USB_PIPE_FOR_GDB); }
+#endif
+
#endif /* _CONSOLE_USB_H_ */