lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Fri,  8 May 2009 16:23:11 -0500
From:	Jason Wessel <jason.wessel@...driver.com>
To:	linux-kernel@...r.kernel.org
Cc:	kgdb-bugreport@...ts.sourceforge.net, kdb@....sgi.com,
	Jason Wessel <jason.wessel@...driver.com>
Subject: [PATCH 04/13] RFC ONLY - kgdb: gdb "monitor" -> kdb passthrough

This is a RFC patch.  The work to possibly merge kdb and kgdb is being
evaluated and this patch is considered only a proof of concept or
prototype.

One of the driving forces behind integrating another front end to kgdb
is to allow front end commands to be accessible via gdb's monitor
command.  It is true that you could write gdb macros to get certain
data, but you may want to just use gdb to access the commands that are
available in the kdb front end.

This patch implements the Rcmd gdb stub packet.  In gdb you access
this with the "monitor" command.  For instance you could type "monitor
help", "monitor lsmod" or "monitor ps A" etc...

There is no error checking or command restrictions on what you can and
cannot access at this point.  Doing something like trying to set
breakpoints with the monitor command is going to cause nothing but
problems.  Perhaps in the future only the commands that are actually
known to work with the gdb monitor command will be available.

Signed-off-by: Jason Wessel <jason.wessel@...driver.com>
---
 include/linux/kgdb.h |    3 ++-
 kdb/kdb_io.c         |   13 +++++++++----
 kernel/kgdb.c        |   28 +++++++++++++++++++++++++---
 3 files changed, 36 insertions(+), 8 deletions(-)

diff --git a/include/linux/kgdb.h b/include/linux/kgdb.h
index 967803d..0299b79 100644
--- a/include/linux/kgdb.h
+++ b/include/linux/kgdb.h
@@ -279,7 +279,8 @@ extern int
 kgdb_handle_exception(int ex_vector, int signo, int err_code,
 		      struct pt_regs *regs);
 extern int kgdb_nmicallback(int cpu, void *regs);
-
+extern int kgdb_use_passthrough;
+extern void kgdb_msg_write(const char *s, int len);
 extern int			kgdb_single_step;
 extern atomic_t			kgdb_active;
 
diff --git a/kdb/kdb_io.c b/kdb/kdb_io.c
index e7c3b40..d00f05c 100644
--- a/kdb/kdb_io.c
+++ b/kdb/kdb_io.c
@@ -24,6 +24,7 @@
 #include <linux/kdb.h>
 #include <linux/kdbprivate.h>
 #include <linux/kallsyms.h>
+#include <linux/kgdb.h>
 
 static struct console *kdbcons;
 
@@ -698,10 +699,14 @@ kdb_printit:
 	else
 #endif
 
-	while (c) {
-		c->write(c, kdb_buffer, strlen(kdb_buffer));
-		touch_nmi_watchdog();
-		c = c->next;
+	if (!kgdb_use_passthrough && kgdb_connected) {
+		kgdb_msg_write(kdb_buffer, strlen(kdb_buffer));
+	} else {
+		while (c) {
+			c->write(c, kdb_buffer, strlen(kdb_buffer));
+			touch_nmi_watchdog();
+			c = c->next;
+		}
 	}
 	if (logging) {
 		saved_loglevel = console_loglevel;
diff --git a/kernel/kgdb.c b/kernel/kgdb.c
index 2f093bc..484f106 100644
--- a/kernel/kgdb.c
+++ b/kernel/kgdb.c
@@ -100,9 +100,9 @@ static int kgdb_use_con;
 
 /* Controls for using the kgdb passthrough */
 #ifdef CONFIG_KGDB_KDB_PRIMARY
-static int kgdb_use_passthrough = 1;
+int kgdb_use_passthrough = 1;
 #else /* ! CONFIG_KGDB_KDB_PRIMARY */
-static int kgdb_use_passthrough;
+int kgdb_use_passthrough;
 #endif /* CONFIG_KGDB_KDB_PRIMARY */
 #define KGDB_PASS_EVENT -12345
 
@@ -963,12 +963,15 @@ static inline int shadow_pid(int realpid)
 
 static char gdbmsgbuf[BUFMAX + 1];
 
-static void kgdb_msg_write(const char *s, int len)
+void kgdb_msg_write(const char *s, int len)
 {
 	char *bufptr;
 	int wcount;
 	int i;
 
+	if (len == 0)
+		len = strlen(s);
+
 	/* 'O'utput */
 	gdbmsgbuf[0] = 'O';
 
@@ -1270,6 +1273,25 @@ static void gdb_cmd_query(struct kgdb_state *ks)
 			kgdb_mem2hex(tmpstr, remcom_out_buffer, strlen(tmpstr));
 		}
 		break;
+#ifdef CONFIG_KGDB_KDB
+	case 'R':
+		if (strncmp(remcom_in_buffer, "qRcmd,", 6) == 0) {
+			int len = strlen(remcom_in_buffer + 6);
+
+			if ((len % 2) != 0) {
+				strcpy(remcom_out_buffer, "E01");
+				break;
+			}
+			kgdb_hex2mem(remcom_in_buffer + 6,
+				     remcom_out_buffer, len);
+			len = len / 2;
+			remcom_out_buffer[len++] = 0;
+
+			kdb_parse(remcom_out_buffer);
+			strcpy(remcom_out_buffer, "OK");
+		}
+		break;
+#endif
 	}
 }
 
-- 
1.6.3.rc0.1.gf800

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ