console: Add console for GDB
Connection of UARTs to GDB stub got lost in the console transition process, bring it back. In theory, GDB stub should work also over usbdebug, but that solution is not really tested at all yet. Change-Id: I90e05e8132889e788b92e055ee191f35add43bbc Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com> Reviewed-on: http://review.coreboot.org/5343 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <patrick@georgi-clan.de>
This commit is contained in:
parent
c009601f29
commit
f2f7f03aff
|
@ -86,6 +86,7 @@ _start:
|
||||||
post_code(POST_PRE_HARDWAREMAIN) /* post fe */
|
post_code(POST_PRE_HARDWAREMAIN) /* post fe */
|
||||||
|
|
||||||
#if CONFIG_GDB_WAIT
|
#if CONFIG_GDB_WAIT
|
||||||
|
call gdb_hw_init
|
||||||
call gdb_stub_breakpoint
|
call gdb_stub_breakpoint
|
||||||
#endif
|
#endif
|
||||||
call main
|
call main
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include <console/console.h>
|
#include <console/console.h>
|
||||||
|
#include <console/streams.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#if CONFIG_GDB_STUB
|
#if CONFIG_GDB_STUB
|
||||||
|
@ -217,12 +218,17 @@ static char out_buffer[BUFMAX];
|
||||||
|
|
||||||
static inline void stub_putc(int ch)
|
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)
|
static inline int stub_getc(void)
|
||||||
{
|
{
|
||||||
return console_rx_byte();
|
return gdb_rx_byte();
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hex(char ch)
|
static int hex(char ch)
|
||||||
|
@ -322,9 +328,11 @@ static int get_packet(char *buffer)
|
||||||
|
|
||||||
if (checksum != xmitcsum) {
|
if (checksum != xmitcsum) {
|
||||||
stub_putc('-'); /* failed checksum */
|
stub_putc('-'); /* failed checksum */
|
||||||
|
stub_flush();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
stub_putc('+'); /* successful transfer */
|
stub_putc('+'); /* successful transfer */
|
||||||
|
stub_flush();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} while(checksum != xmitcsum);
|
} while(checksum != xmitcsum);
|
||||||
|
@ -353,6 +361,7 @@ static void put_packet(char *buffer)
|
||||||
stub_putc('#');
|
stub_putc('#');
|
||||||
stub_putc(hexchars[checksum >> 4]);
|
stub_putc(hexchars[checksum >> 4]);
|
||||||
stub_putc(hexchars[checksum % 16]);
|
stub_putc(hexchars[checksum % 16]);
|
||||||
|
stub_flush();
|
||||||
|
|
||||||
} while ((stub_getc() & 0x7f) != '+');
|
} while ((stub_getc() & 0x7f) != '+');
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <rules.h>
|
||||||
#include <console/streams.h>
|
#include <console/streams.h>
|
||||||
#include <console/cbmem_console.h>
|
#include <console/cbmem_console.h>
|
||||||
#include <console/uart.h>
|
#include <console/uart.h>
|
||||||
|
@ -53,3 +54,26 @@ void console_tx_flush(void)
|
||||||
__ne2k_tx_flush();
|
__ne2k_tx_flush();
|
||||||
__usb_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
|
||||||
|
|
|
@ -22,6 +22,12 @@ void console_hw_init(void);
|
||||||
void console_tx_byte(unsigned char byte);
|
void console_tx_byte(unsigned char byte);
|
||||||
void console_tx_flush(void);
|
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. */
|
/* Helpers for ROMCC console. */
|
||||||
void console_tx_nibble(unsigned nibble);
|
void console_tx_nibble(unsigned nibble);
|
||||||
void console_tx_hex8(unsigned char value);
|
void console_tx_hex8(unsigned char value);
|
||||||
|
|
|
@ -69,6 +69,14 @@ static inline void __uart_tx_byte(u8 data) {}
|
||||||
static inline void __uart_tx_flush(void) {}
|
static inline void __uart_tx_flush(void) {}
|
||||||
#endif
|
#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 /* __ROMCC__ */
|
||||||
|
|
||||||
#endif /* CONSOLE_UART_H */
|
#endif /* CONSOLE_UART_H */
|
||||||
|
|
|
@ -34,14 +34,26 @@ int usb_can_rx_byte(int idx);
|
||||||
#define __CONSOLE_USB_ENABLE__ CONFIG_CONSOLE_USB && \
|
#define __CONSOLE_USB_ENABLE__ CONFIG_CONSOLE_USB && \
|
||||||
((ENV_ROMSTAGE && CONFIG_USBDEBUG_IN_ROMSTAGE) || ENV_RAMSTAGE)
|
((ENV_ROMSTAGE && CONFIG_USBDEBUG_IN_ROMSTAGE) || ENV_RAMSTAGE)
|
||||||
|
|
||||||
|
#define USB_PIPE_FOR_CONSOLE 0
|
||||||
|
#define USB_PIPE_FOR_GDB 0
|
||||||
|
|
||||||
#if __CONSOLE_USB_ENABLE__
|
#if __CONSOLE_USB_ENABLE__
|
||||||
static inline void __usbdebug_init(void) { usbdebug_init(); }
|
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_byte(u8 data) { usb_tx_byte(USB_PIPE_FOR_CONSOLE, data); }
|
||||||
static inline void __usb_tx_flush(void) { usb_tx_flush(0); }
|
static inline void __usb_tx_flush(void) { usb_tx_flush(USB_PIPE_FOR_CONSOLE); }
|
||||||
#else
|
#else
|
||||||
static inline void __usbdebug_init(void) {}
|
static inline void __usbdebug_init(void) {}
|
||||||
static inline void __usb_tx_byte(u8 data) {}
|
static inline void __usb_tx_byte(u8 data) {}
|
||||||
static inline void __usb_tx_flush(void) {}
|
static inline void __usb_tx_flush(void) {}
|
||||||
#endif
|
#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_ */
|
#endif /* _CONSOLE_USB_H_ */
|
||||||
|
|
Loading…
Reference in New Issue