mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Jason Wessel <jason.wessel@windriver.com>
To: linux-kernel@vger.kernel.org
Cc: kgdb-bugreport@lists.sourceforge.net, mingo@elte.hu,
	Jason Wessel <jason.wessel@windriver.com>
Subject: [PATCH 02/15] gdbstub: Optimize kgdb's "thread:" response for the gdb serial protocol
Date: Fri, 30 Jul 2010 14:17:23 -0500	[thread overview]
Message-ID: <1280517456-1167-3-git-send-email-jason.wessel@windriver.com> (raw)
In-Reply-To: <1280517456-1167-1-git-send-email-jason.wessel@windriver.com>

The gdb debugger understands how to parse short versions of the thread
reference string as long as the bytes are paired in sets of two
characters.  The kgdb implementation was always sending 8 leading
zeros which could be omitted, and further optimized in the case of
non-negative thread numbers.  The negative numbers are used to
reference a specific cpu in the case of kgdb.

An example of the previous i386 stop packet looks like:
    T05thread:00000000000003bb;

New stop packet response:
    T05thread:03bb;

The previous ThreadInfo response looks like:
    m00000000fffffffe,0000000000000001,0000000000000002,0000000000000003,0000000000000004,0000000000000005,0000000000000006,0000000000000007,000000000000000c,0000000000000088,000000000000008a,000000000000008b,000000000000008c,000000000000008d,000000000000008e,00000000000000d4,00000000000000d5,00000000000000dd

New ThreadInfo response:
    mfffffffe,01,02,03,04,05,06,07,0c,88,8a,8b,8c,8d,8e,d4,d5,dd

A few bytes saved means better response time when using kgdb over a
serial line.

Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
---
 kernel/debug/gdbstub.c |   37 +++++++++++++++++++------------------
 1 files changed, 19 insertions(+), 18 deletions(-)

diff --git a/kernel/debug/gdbstub.c b/kernel/debug/gdbstub.c
index 3517fd7..e117cfd 100644
--- a/kernel/debug/gdbstub.c
+++ b/kernel/debug/gdbstub.c
@@ -367,28 +367,31 @@ static void error_packet(char *pkt, int error)
  * remapped to negative TIDs.
  */
 
-#define BUF_THREAD_ID_SIZE	16
+#define BUF_THREAD_ID_SIZE	8
 
 static char *pack_threadid(char *pkt, unsigned char *id)
 {
-	char *limit;
+	unsigned char *limit;
+	int lzero = 1;
+
+	limit = id + (BUF_THREAD_ID_SIZE / 2);
+	while (id < limit) {
+		if (!lzero || *id != 0) {
+			pkt = pack_hex_byte(pkt, *id);
+			lzero = 0;
+		}
+		id++;
+	}
 
-	limit = pkt + BUF_THREAD_ID_SIZE;
-	while (pkt < limit)
-		pkt = pack_hex_byte(pkt, *id++);
+	if (lzero)
+		pkt = pack_hex_byte(pkt, 0);
 
 	return pkt;
 }
 
 static void int_to_threadref(unsigned char *id, int value)
 {
-	unsigned char *scan;
-	int i = 4;
-
-	scan = (unsigned char *)id;
-	while (i--)
-		*scan++ = 0;
-	put_unaligned_be32(value, scan);
+	put_unaligned_be32(value, id);
 }
 
 static struct task_struct *getthread(struct pt_regs *regs, int tid)
@@ -601,7 +604,7 @@ static void gdb_cmd_query(struct kgdb_state *ks)
 {
 	struct task_struct *g;
 	struct task_struct *p;
-	unsigned char thref[8];
+	unsigned char thref[BUF_THREAD_ID_SIZE];
 	char *ptr;
 	int i;
 	int cpu;
@@ -621,8 +624,7 @@ static void gdb_cmd_query(struct kgdb_state *ks)
 			for_each_online_cpu(cpu) {
 				ks->thr_query = 0;
 				int_to_threadref(thref, -cpu - 2);
-				pack_threadid(ptr, thref);
-				ptr += BUF_THREAD_ID_SIZE;
+				ptr = pack_threadid(ptr, thref);
 				*(ptr++) = ',';
 				i++;
 			}
@@ -631,8 +633,7 @@ static void gdb_cmd_query(struct kgdb_state *ks)
 		do_each_thread(g, p) {
 			if (i >= ks->thr_query && !finished) {
 				int_to_threadref(thref, p->pid);
-				pack_threadid(ptr, thref);
-				ptr += BUF_THREAD_ID_SIZE;
+				ptr = pack_threadid(ptr, thref);
 				*(ptr++) = ',';
 				ks->thr_query++;
 				if (ks->thr_query % KGDB_MAX_THREAD_QUERY == 0)
@@ -851,7 +852,7 @@ int gdb_serial_stub(struct kgdb_state *ks)
 	memset(remcom_out_buffer, 0, sizeof(remcom_out_buffer));
 
 	if (kgdb_connected) {
-		unsigned char thref[8];
+		unsigned char thref[BUF_THREAD_ID_SIZE];
 		char *ptr;
 
 		/* Reply to host that an exception has occurred */
-- 
1.6.4.rc1


  parent reply	other threads:[~2010-07-30 19:18 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-07-30 19:17 [PATCH 0/15] kgdb,kdb: proposed merge set for 2.6.36 Jason Wessel
2010-07-30 19:17 ` [PATCH 01/15] kgdb: remove custom hex_to_bin()implementation Jason Wessel
2010-07-30 19:17 ` Jason Wessel [this message]
2010-07-30 19:17 ` [PATCH 03/15] kgdb,kdb: individual register set and and get API Jason Wessel
2010-07-30 19:17 ` [PATCH 04/15] x86,kgdb: Individual register get/set for x86 Jason Wessel
2010-07-30 23:29   ` H. Peter Anvin
2010-07-30 19:17 ` [PATCH 05/15] mips,kgdb: Individual register get/set for mips Jason Wessel
2010-08-02 13:30   ` Ralf Baechle
2010-07-30 19:17 ` [PATCH 06/15] arm,kgdb: Individual register get/set for arm Jason Wessel
2010-07-30 19:17 ` [PATCH 07/15] gdbstub,x86: Implement gdbserial 'p' and 'P' packets Jason Wessel
2010-07-30 19:17 ` [PATCH 08/15] gdbstub: do not directly use dbg_reg_def[] in gdb_cmd_reg_set() Jason Wessel
2010-07-30 19:17 ` [PATCH 09/15] arm,kgdb: Add ability to trap into debugger on notify_die Jason Wessel
2010-07-30 19:17 ` [PATCH 10/15] powerpc: Replace hardcoded offset by BREAK_INSTR_SIZE Jason Wessel
2010-07-30 23:44   ` Benjamin Herrenschmidt
2010-07-30 19:17 ` [PATCH 11/15] ftrace,kdb: Extend kdb to be able to dump the ftrace buffer Jason Wessel
2010-07-30 19:17 ` [PATCH 12/15] ftrace,kdb: Allow dumping a specific cpu's buffer with ftdump Jason Wessel
2010-07-30 19:17 ` [PATCH 13/15] KGDB: Remove set but unused newPC Jason Wessel
2010-07-30 19:17 ` [PATCH 14/15] sunhv,kgdboc: Add sunhv console poll hooks for kgdboc Jason Wessel
2010-07-30 19:17 ` [PATCH 15/15] mm,kdb,kgdb: Add a debug reference for the kdb kmap usage Jason Wessel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1280517456-1167-3-git-send-email-jason.wessel@windriver.com \
    --to=jason.wessel@windriver.com \
    --cc=kgdb-bugreport@lists.sourceforge.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®