Title: [5297] trunk: Task[#3428] A better solution to support gdb break signal in kgdboc.
Revision
5297
Author
sonicz
Date
2008-09-16 06:16:41 -0500 (Tue, 16 Sep 2008)

Log Message

Task[#3428] A better solution to support gdb break signal in kgdboc.

Modified Paths

Diff

Modified: trunk/drivers/serial/bfin_5xx.c (5296 => 5297)


--- trunk/drivers/serial/bfin_5xx.c	2008-09-16 01:33:57 UTC (rev 5296)
+++ trunk/drivers/serial/bfin_5xx.c	2008-09-16 11:16:41 UTC (rev 5297)
@@ -23,7 +23,8 @@
 #include <linux/serial_core.h>
 #include <stdarg.h>
 
-#ifdef CONFIG_KGDB_SERIAL_CONSOLE
+#if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
+	defined(CONFIG_KGDB_SERIAL_CONSOLE_MODULE)
 #include <linux/kgdb.h>
 #include <asm/irq_regs.h>
 #endif
@@ -46,13 +47,15 @@
 static struct bfin_serial_port bfin_serial_ports[BFIN_UART_NR_PORTS];
 static int nr_active_ports = ARRAY_SIZE(bfin_serial_resource);
 
-#ifdef CONFIG_KGDB_SERIAL_CONSOLE
+#if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
+	defined(CONFIG_KGDB_SERIAL_CONSOLE_MODULE)
 
 # ifndef CONFIG_SERIAL_BFIN_PIO
 #  error KGDB only support UART in PIO mode.
 # endif
 
-static int gdb_break_enabled;
+static int kgdboc_port_line;
+static int kgdboc_break_enabled;
 #endif
 /*
  * Setup for console. Argument comes from the menuconfig
@@ -161,8 +164,10 @@
  	ch = UART_GET_CHAR(uart);
  	uart->port.icount.rx++;
 
-#ifdef CONFIG_KGDB_SERIAL_CONSOLE
-	if (kgdb_connected && is_kgdb_tty_line(uart->port.line)) {
+#if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
+	defined(CONFIG_KGDB_SERIAL_CONSOLE_MODULE)
+	if (kgdb_connected && kgdboc_break_enabled &&
+		kgdboc_port_line == uart->port.line) {
 		if (ch == 0x3) {/* Ctrl + C */
 			kgdb_breakpoint();
 			return;
@@ -593,9 +598,10 @@
 	uart->rx_dma_timer.expires = jiffies + DMA_RX_FLUSH_JIFFIES;
 	add_timer(&(uart->rx_dma_timer));
 #else
-# ifdef CONFIG_KGDB_SERIAL_CONSOLE
-	if (is_kgdb_tty_line(uart->port.line) && gdb_break_enabled == 1)
-		gdb_break_enabled = 0;
+#if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
+	defined(CONFIG_KGDB_SERIAL_CONSOLE_MODULE)
+	if (kgdboc_port_line == uart->port.line && kgdboc_break_enabled)
+		kgdboc_break_enabled = 0;
 	else {
 # endif
 	if (request_irq(uart->port.irq, bfin_serial_rx_int, IRQF_DISABLED,
@@ -647,7 +653,8 @@
 		}
 	}
 # endif
-# ifdef CONFIG_KGDB_SERIAL_CONSOLE
+#if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
+	defined(CONFIG_KGDB_SERIAL_CONSOLE_MODULE)
 	}
 # endif
 #endif
@@ -863,8 +870,8 @@
 	SSYNC();
 }
 
-#ifdef CONFIG_KGDB_SERIAL_CONSOLE
-void bfin_serial_poll_put_char(struct uart_port *port, unsigned char chr)
+#ifdef CONFIG_CONSOLE_POLL
+static void bfin_serial_poll_put_char(struct uart_port *port, unsigned char chr)
 {
 	struct bfin_serial_port *uart = (struct bfin_serial_port *)port;
 
@@ -875,7 +882,7 @@
 	UART_PUT_CHAR(uart, (unsigned char)chr);
 }
 
-int bfin_serial_poll_get_char(struct uart_port *port)
+static int bfin_serial_poll_get_char(struct uart_port *port)
 {
 	struct bfin_serial_port *uart = (struct bfin_serial_port *)port;
 	unsigned char chr;
@@ -888,23 +895,24 @@
 
 	return chr;
 }
+#endif
 
-void kgdboc_uart_port_shutdown(int line)
+#if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
+	defined(CONFIG_KGDB_SERIAL_CONSOLE_MODULE)
+static void bfin_kgdboc_port_shutdown(struct uart_port *port)
 {
-	struct bfin_serial_port *uart = &bfin_serial_ports[line];
-
-	if (gdb_break_enabled == 1) {
-		bfin_serial_shutdown(&uart->port);
-		gdb_break_enabled = 0;
+	if (kgdboc_break_enabled) {
+		bfin_serial_shutdown(port);
+		kgdboc_break_enabled = 0;
 	}
 }
 
-void kgdboc_uart_port_startup(int line)
+static int bfin_kgdboc_port_startup(struct uart_port *port)
 {
-	struct bfin_serial_port *uart = &bfin_serial_ports[line];
+	bfin_serial_startup(port);
+	kgdboc_break_enabled = 1;
 
-	bfin_serial_startup(&uart->port);
-	gdb_break_enabled = 1;
+	return 0;
 }
 #endif
 
@@ -926,6 +934,11 @@
 	.request_port	= bfin_serial_request_port,
 	.config_port	= bfin_serial_config_port,
 	.verify_port	= bfin_serial_verify_port,
+#if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
+	defined(CONFIG_KGDB_SERIAL_CONSOLE_MODULE)
+	.kgdboc_port_startup	= bfin_kgdboc_port_startup,
+	.kgdboc_port_shutdown	= bfin_kgdboc_port_shutdown,
+#endif
 #ifdef CONFIG_CONSOLE_POLL
 	.poll_put_char	= bfin_serial_poll_put_char,
 	.poll_get_char	= bfin_serial_poll_get_char,

Modified: trunk/drivers/serial/kgdboc.c (5296 => 5297)


--- trunk/drivers/serial/kgdboc.c	2008-09-16 01:33:57 UTC (rev 5296)
+++ trunk/drivers/serial/kgdboc.c	2008-09-16 11:16:41 UTC (rev 5297)
@@ -32,24 +32,6 @@
 static struct tty_driver	*kgdb_tty_driver;
 static int			kgdb_tty_line;
 
-/* Allow UART driver to check if current tty device is used by kgdb.*/
-int is_kgdb_tty_line(int tty_line)
-{
-	return tty_line == kgdb_tty_line;
-}
-EXPORT_SYMBOL_GPL(is_kgdb_tty_line);
-
-/* UART driver may decide whether to support gdb break signal Ctrl+C
-   by request and handle UART RX interrupt. */
-void __weak kgdboc_uart_port_startup(int line)
-{
-}
-
-/* Free UART RX interrupt */
-void __weak kgdboc_uart_port_shutdown(int line)
-{
-}
-
 static int kgdboc_option_setup(char *opt)
 {
 	if (strlen(opt) > MAX_CONFIG_LEN) {
@@ -88,7 +70,8 @@
 
 	configured = 1;
 
-	kgdboc_uart_port_startup(kgdb_tty_line);
+	kgdb_tty_driver->ops->kgdboc_port_startup(kgdb_tty_driver,
+					kgdb_tty_line);
 
 	return 0;
 
@@ -111,7 +94,8 @@
 static void cleanup_kgdboc(void)
 {
 	if (configured == 1) {
-		kgdboc_uart_port_shutdown(kgdb_tty_line);
+		kgdb_tty_driver->ops->kgdboc_port_shutdown(kgdb_tty_driver,
+					kgdb_tty_line);
 		kgdb_unregister_io_module(&kgdboc_io_ops);
 	}
 }

Modified: trunk/drivers/serial/serial_core.c (5296 => 5297)


--- trunk/drivers/serial/serial_core.c	2008-09-16 01:33:57 UTC (rev 5296)
+++ trunk/drivers/serial/serial_core.c	2008-09-16 11:16:41 UTC (rev 5297)
@@ -2245,6 +2245,39 @@
 	}
 }
 
+#if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
+	defined(CONFIG_KGDB_SERIAL_CONSOLE_MODULE)
+static int uart_kgdboc_port_startup(struct tty_driver *driver, int line)
+{
+	struct uart_driver *drv = driver->driver_state;
+	struct uart_state *state = drv->state + line;
+	struct uart_port *port;
+
+	if (!state || !state->port)
+		return -1;
+
+	port = state->port;
+	if (port->ops->kgdboc_port_startup)
+		return port->ops->kgdboc_port_startup(port);
+	else
+		return -1;
+}
+
+static void uart_kgdboc_port_shutdown(struct tty_driver *driver, int line)
+{
+	struct uart_driver *drv = driver->driver_state;
+	struct uart_state *state = drv->state + line;
+	struct uart_port *port;
+
+	if (!state || !state->port)
+		return;
+
+	port = state->port;
+	if (port->ops->kgdboc_port_shutdown)
+		port->ops->kgdboc_port_shutdown(port);
+}
+#endif
+
 #ifdef CONFIG_CONSOLE_POLL
 
 static int uart_poll_init(struct tty_driver *driver, int line, char *options)
@@ -2324,6 +2357,11 @@
 #endif
 	.tiocmget	= uart_tiocmget,
 	.tiocmset	= uart_tiocmset,
+#if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
+	defined(CONFIG_KGDB_SERIAL_CONSOLE_MODULE)
+	.kgdboc_port_startup	= uart_kgdboc_port_startup,
+	.kgdboc_port_shutdown	= uart_kgdboc_port_shutdown,
+#endif
 #ifdef CONFIG_CONSOLE_POLL
 	.poll_init	= uart_poll_init,
 	.poll_get_char	= uart_poll_get_char,

Modified: trunk/include/linux/serial_core.h (5296 => 5297)


--- trunk/include/linux/serial_core.h	2008-09-16 01:33:57 UTC (rev 5296)
+++ trunk/include/linux/serial_core.h	2008-09-16 11:16:41 UTC (rev 5297)
@@ -216,6 +216,15 @@
 	void		(*config_port)(struct uart_port *, int);
 	int		(*verify_port)(struct uart_port *, struct serial_struct *);
 	int		(*ioctl)(struct uart_port *, unsigned int, unsigned long);
+#if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
+	defined(CONFIG_KGDB_SERIAL_CONSOLE_MODULE)
+	/*
+	 * Start up serial port earlier in kgdboc to support gdb break
+	 * signal Ctrl+C.
+	 */
+	int		(*kgdboc_port_startup)(struct uart_port *);
+	void		(*kgdboc_port_shutdown)(struct uart_port *);
+#endif
 #ifdef CONFIG_CONSOLE_POLL
 	void	(*poll_put_char)(struct uart_port *, unsigned char);
 	int		(*poll_get_char)(struct uart_port *);

Modified: trunk/include/linux/tty_driver.h (5296 => 5297)


--- trunk/include/linux/tty_driver.h	2008-09-16 01:33:57 UTC (rev 5296)
+++ trunk/include/linux/tty_driver.h	2008-09-16 11:16:41 UTC (rev 5297)
@@ -202,6 +202,11 @@
 	int (*tiocmget)(struct tty_struct *tty, struct file *file);
 	int (*tiocmset)(struct tty_struct *tty, struct file *file,
 			unsigned int set, unsigned int clear);
+#if defined(CONFIG_KGDB_SERIAL_CONSOLE) || \
+	defined(CONFIG_KGDB_SERIAL_CONSOLE_MODULE)
+	int (*kgdboc_port_startup)(struct tty_driver *driver, int line);
+	int (*kgdboc_port_shutdown)(struct tty_driver *driver, int line);
+#endif
 #ifdef CONFIG_CONSOLE_POLL
 	int (*poll_init)(struct tty_driver *driver, int line, char *options);
 	int (*poll_get_char)(struct tty_driver *driver, int line);
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
http://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to