public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: "Jan Beulich" <JBeulich@novell.com>
To: <linux-kernel@vger.kernel.org>
Subject: [PATCH 14/39] NLKD - kernel trace buffer access
Date: Wed, 09 Nov 2005 15:09:13 +0100	[thread overview]
Message-ID: <43721119.76F0.0078.0@novell.com> (raw)
In-Reply-To: 4372105B.76F0.0078.0@novell.com

[-- Attachment #1: Type: text/plain, Size: 151 bytes --]

Debug extension implementation for NLKD to access the kernel trace
buffer.

Signed-Off-By: Jan Beulich <jbeulich@novell.com>

(actual patch attached)


[-- Attachment #2: linux-2.6.14-nlkd-printk.patch --]
[-- Type: application/octet-stream, Size: 4993 bytes --]

Debug extension implementation for NLKD to access the kernel trace
buffer.

Signed-Off-By: Jan Beulich <jbeulich@novell.com>

Index: 2.6.14-nlkd/kernel/printk.c
===================================================================
--- 2.6.14-nlkd.orig/kernel/printk.c	2005-11-09 10:40:17.000000000 +0100
+++ 2.6.14-nlkd/kernel/printk.c	2005-11-04 16:19:34.000000000 +0100
@@ -1032,3 +1032,190 @@ int printk_ratelimit(void)
 				printk_ratelimit_burst);
 }
 EXPORT_SYMBOL(printk_ratelimit);
+
+#if defined(CONFIG_PRINTK) && defined(CONFIG_NLKD)
+# include <linux/ctype.h>
+# include <linux/nlkd.h>
+
+static int match(unsigned long start, unsigned long end, const char *pattern, size_t len)
+{
+	unsigned long stop;
+
+	start &= LOG_BUF_MASK;
+	stop = end &= LOG_BUF_MASK;
+	if (stop < start)
+		stop = log_buf_len;
+	for (;;) {
+		const char *p;
+
+		while (((end - start) & LOG_BUF_MASK) >= len
+		       && (p = memchr(log_buf + start, *pattern, stop - start)) != NULL) {
+			unsigned long where = p - log_buf;
+
+			if (len > stop - where
+			    ? !memcmp(p, pattern, stop - where)
+			      && !memcmp(p + (stop - where),
+			                 pattern + (stop - where),
+			                 len - (stop - where))
+			    : !memcmp(p, pattern, len))
+					return 1;
+			start = where + 1;
+		}
+		if (end >= start)
+			return 0;
+		start = 0;
+		stop = end;
+	}
+}
+
+static void do_mgrep(const char *pattern, long skip, long count)
+{
+	int backward = 1;
+	unsigned long line, cur;
+	size_t len = pattern ? strlen(pattern) : 0;
+
+	if (count == 0)
+		count = 5;
+	else if (count < 0) {
+		count = -count;
+		backward = 0;
+	}
+	if (skip < 0) {
+		skip = -skip;
+		backward = 0;
+	}
+#define LOG_IDX_MATCH(idx1, idx2) (!(((idx1) ^ (idx2)) & LOG_BUF_MASK))
+	if (backward) {
+		/* Search from end.  */
+		int end;
+
+		skip += count - 1;
+		line = log_end;
+		do {
+			for (cur = line - 1; !LOG_IDX_MATCH(cur, log_end) && LOG_BUF(cur) && LOG_BUF(cur) == '\n'; --cur)
+				;
+			for (; !(end = LOG_IDX_MATCH(cur, log_end) || !LOG_BUF(cur)) && LOG_BUF(cur) != '\n'; --cur)
+				;
+			if (len && !match(cur + 1, line, pattern, len))
+				++skip;
+			line = cur + 1;
+		} while (skip-- && !end);
+		if (++skip < count)
+			count -= skip;
+		else
+			count = 0;
+	}
+	else {
+		/* Search from start.  */
+		for (cur = LOG_BUF(log_end) ? log_end : 0; line = cur, skip; --skip) {
+			while (LOG_BUF(cur) != '\n')
+				if (!LOG_BUF(cur) || LOG_IDX_MATCH(++cur, log_end))
+					return;
+			while (LOG_BUF(cur) == '\n')
+				if (!LOG_BUF(cur) || LOG_IDX_MATCH(++cur, log_end))
+					return;
+			if (len && !match(line, cur, pattern, len))
+				++skip;
+		}
+	}
+	while (count) {
+		for (cur = line; LOG_BUF(cur) && LOG_BUF(cur) != '\n'; ++cur)
+			if (LOG_IDX_MATCH(cur + 1, 0)) {
+				for (cur = 0; LOG_BUF(cur) && LOG_BUF(cur) != '\n'; ++cur)
+					if (LOG_IDX_MATCH(cur + 1, line))
+						break;
+				break;
+			}
+		if(!len || match(line, cur, pattern, len)) {
+			if (cur < line) {
+				nlkdExtPrintf("%.*s", log_buf_len - (int)(line & LOG_BUF_MASK), &LOG_BUF(line));
+				nlkdExtPrintf("%.*s\n", (int)cur, log_buf);
+			}
+			else
+				nlkdExtPrintf("%.*s\n", (int)(cur - line), &LOG_BUF(line));
+			--count;
+		}
+		if (LOG_BUF(cur) != '\n')
+			break;
+		for (line = cur + 1; LOG_BUF(line) == '\n'; ++line)
+			;
+	}
+#undef LOG_IDX_MATCH
+}
+
+static char *skipComma(char *s) {
+	while (*s && isspace(*s))
+		++s;
+	if (*s == ';' || *s == ',')
+		++s;
+	while (*s && isspace(*s))
+		++s;
+	return s;
+}
+
+/*
+ * !dmesg [[<# to skip>;]<# of lines>]
+ */
+static void dbgxt_dmesg(void *pattern, const char *command) {
+	long skip = 0, count = 0;
+
+	if (!command)
+		return;
+	if (!pattern && *command == '?') {
+		nlkdExtOutputString("dmesg [[<# to skip>] <# of entries>]");
+		return;
+	}
+	if (*command) {
+		char *tail;
+
+		skip = simple_strtol(command, &tail, 0);
+		if (*(tail = skipComma(tail)))
+			count = simple_strtol(tail, NULL, 0);
+		else {
+			count = skip;
+			skip = 0;
+		}
+	}
+	do_mgrep(pattern, skip, count);
+}
+
+/*
+ * !mgrep <match string> [[<# to skip>];<# of lines>]
+ */
+static void dbgxt_mgrep(void *unused, const char *command) {
+	if (!command)
+		return;
+	if (!strcmp(command, "?")) {
+		nlkdExtOutputString("mgrep <match> [[<# to skip>] <# of entries>]");
+		return;
+	}
+	if (*command) {
+		char pattern[256], *dst;
+		char quote = strchr("\"\'", *command) != NULL ? *command++ : 0;
+
+		for (dst = pattern; *command && (quote ? *command != quote : !isspace(*command)); ++command)
+			if(dst < pattern + ARRAY_SIZE(pattern) - 1)
+				*dst++ = *command;
+		*dst = 0;
+		if (*command)
+			++command;
+		while (*command && isspace(*command))
+			++command;
+		dbgxt_dmesg((void *)pattern, command);
+	}
+}
+
+static THIS_MODULE_ID(printkModuleId);
+NLKD_EXTENSION(dmesg,
+	dbgxt_dmesg,
+	NULL,
+	printkModuleId,
+	"Display trace buffer records",
+	0);
+NLKD_EXTENSION(mgrep,
+	dbgxt_mgrep,
+	NULL,
+	printkModuleId,
+	"Grep trace buffer records",
+	0);
+#endif

  parent reply	other threads:[~2005-11-09 14:08 UTC|newest]

Thread overview: 105+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-11-09 13:54 [PATCH 0/39] NLKD - Novell Linux Kernel Debugger Jan Beulich
2005-11-09 13:56 ` [PATCH 1/39] NLKD - an alternative kallsyms approach Jan Beulich
2005-11-09 13:57   ` [PATCH 2/39] NLKD - an alternative early ioremap approach Jan Beulich
2005-11-09 13:58     ` [PATCH 3/39] NLKD - early/late CPU up/down notification Jan Beulich
2005-11-09 13:59       ` [PATCH 4/39] NLKD/i386 " Jan Beulich
2005-11-09 14:01       ` [PATCH 5/39] NLKD/x86-64 " Jan Beulich
2005-11-10 13:10         ` Andi Kleen
2005-11-14  8:04           ` [discuss] " Jan Beulich
2005-11-14 12:37             ` Andi Kleen
2005-11-09 14:01       ` [PATCH 6/39] NLKD - early panic notification Jan Beulich
2005-11-09 14:02         ` [PATCH 7/39] NLKD - task create/destroy notification Jan Beulich
2005-11-09 14:03           ` [PATCH 8/39] NLKD - rmmod notification Jan Beulich
2005-11-09 14:04             ` [PATCH 9/39] NLKD - hotkey notification Jan Beulich
2005-11-09 14:05               ` [PATCH 10/39] NLKD - console layout change notification Jan Beulich
2005-11-09 14:06                 ` [PATCH 11/39] NLKD - time adjustment Jan Beulich
2005-11-09 14:06                   ` [PATCH 12/39] NLKD/i386 " Jan Beulich
2005-11-09 19:10                     ` George Anzinger
2005-11-10  8:12                       ` Jan Beulich
2005-11-11  0:17                         ` George Anzinger
2005-11-09 14:08                   ` [PATCH 13/39] NLKD/x86-64 " Jan Beulich
2005-11-09 14:13                     ` [PATCH 18/39] NLKD/x86-64 - INT1/INT3 handling changes Jan Beulich
2005-11-09 14:14                       ` [PATCH 19/39] NLKD/x86-64 - stack-pointer-invalid markers Jan Beulich
2005-11-09 14:15                         ` [PATCH 20/39] NLKD/x86-64 - switch_to() floating point adjustment Jan Beulich
2005-11-09 14:16                           ` [PATCH 21/39] NLKD/x86-64 - core adjustments Jan Beulich
2005-11-10 13:24                           ` [PATCH 20/39] NLKD/x86-64 - switch_to() floating point adjustment Andi Kleen
2005-11-10 14:07                             ` Jan Beulich
2005-11-10 13:23                         ` [PATCH 19/39] NLKD/x86-64 - stack-pointer-invalid markers Andi Kleen
2005-11-10 14:25                           ` Jan Beulich
2005-11-10 13:21                       ` [PATCH 18/39] NLKD/x86-64 - INT1/INT3 handling changes Andi Kleen
2005-11-10 14:07                         ` Jan Beulich
2005-11-10 14:25                           ` Andi Kleen
2005-11-10 15:00                             ` Jan Beulich
2005-11-11  3:39                               ` [discuss] " Andi Kleen
2005-11-10 13:19                     ` [PATCH 13/39] NLKD/x86-64 - time adjustment Andi Kleen
2005-11-10 14:23                       ` Jan Beulich
2005-11-11  2:12                         ` Andi Kleen
2005-11-12  9:22                           ` Vojtech Pavlik
2005-11-12 17:21                             ` Andi Kleen
2005-11-12 20:44                               ` Vojtech Pavlik
2005-11-15  0:38                                 ` George Anzinger
2005-11-15  1:05                                   ` [discuss] " Andi Kleen
2005-11-15  7:50                                     ` Vojtech Pavlik
2005-11-15  8:24                                       ` Jan Beulich
2005-11-10 14:43                       ` Vojtech Pavlik
2005-11-09 14:09                   ` Jan Beulich [this message]
2005-11-09 14:09                     ` [PATCH 15/39] NLKD - early pseudo-fs Jan Beulich
2005-11-09 14:11                       ` [PATCH 16/39] NLKD - core adjustments Jan Beulich
2005-11-09 14:11                         ` [PATCH 17/39] NLKD/i386 " Jan Beulich
2005-11-09 19:00                           ` Adrian Bunk
2005-11-10  8:04                             ` Jan Beulich
2005-11-10 10:29                               ` Adrian Bunk
2005-11-10 11:52                                 ` Jan Beulich
2005-11-10 12:36                                   ` Lars Marowsky-Bree
2005-11-09 14:18                         ` [PATCH 22/39] NLKD - core Jan Beulich
2005-11-09 14:19                           ` [PATCH 23/39] NLKD/x86 " Jan Beulich
2005-11-09 14:20                             ` [PATCH 24/39] NLKD/i386 " Jan Beulich
2005-11-09 14:21                             ` [PATCH 25/39] NLKD/x86-64 " Jan Beulich
2005-11-10 13:30                               ` Andi Kleen
2005-11-09 14:22                           ` [PATCH 26/39] NLKD - run time library Jan Beulich
2005-11-09 14:23                             ` [PATCH 27/39] NLKD/i386 " Jan Beulich
2005-11-09 14:23                               ` [PATCH 28/39] NLKD/x86-64 " Jan Beulich
2005-11-10 13:32                                 ` Andi Kleen
     [not found]                             ` <437214B7.76F0.0078.0@novell.com>
     [not found]                               ` <4372156A.76F0.0078.0@novell.com>
2005-11-09 14:28                                 ` [PATCH 34/39] NLKD/x86 - Console Debug Agent Jan Beulich
     [not found]                                 ` <43721600.76F0.0078.0@novell.com>
2005-11-09 14:30                                   ` [PATCH 38/39] NLKD/i386 - Remote " Jan Beulich
2005-11-09 14:31                                   ` [PATCH 39/39] NLKD/x86-64 " Jan Beulich
2005-11-09 14:29                       ` [PATCH 15/39] NLKD - early pseudo-fs Al Viro
2005-11-09 14:37                         ` Jan Beulich
2005-11-09 15:00                           ` Al Viro
2005-11-09 16:00                             ` Jan Beulich
2005-11-10  5:44                     ` [PATCH 14/39] NLKD - kernel trace buffer access Keith Owens
2005-11-10  8:02                       ` Jan Beulich
2005-11-09 18:51                   ` [PATCH 11/39] NLKD - time adjustment George Anzinger
2005-11-09 16:50         ` [PATCH 6/39] NLKD - early panic notification Greg KH
2005-11-09 16:45       ` [PATCH 3/39] NLKD - early/late CPU up/down notification Greg KH
2005-11-09 17:09         ` Jan Beulich
2005-11-09 17:19           ` Greg KH
2005-11-10  7:41             ` Jan Beulich
2005-11-10 20:59               ` Sam Ravnborg
2005-11-11  7:52                 ` Jan Beulich
2005-11-12 20:52                   ` Randy.Dunlap
2005-11-10 23:01               ` Greg KH
2005-11-11 10:06     ` [PATCH 2/39] NLKD - an alternative early ioremap approach Pavel Machek
2005-11-11 10:19       ` Jan Beulich
2005-11-09 16:50   ` [PATCH 1/39] NLKD - an alternative kallsyms approach Randy.Dunlap
2005-11-09 16:57     ` Greg KH
2005-11-09 17:20     ` Jan Beulich
2005-11-09 16:59 ` [PATCH 0/39] NLKD - Novell Linux Kernel Debugger Jeff Garzik
2005-11-09 17:06   ` Randy.Dunlap
2005-11-09 17:14     ` Jan Beulich
2005-11-09 17:56       ` Alan Cox
2005-11-09 18:05       ` Greg KH
2005-11-09 18:54       ` Paul Jackson
2005-11-10 12:41       ` Christoph Hellwig
2005-11-13  1:09     ` Andi Kleen
2005-11-13  2:53       ` jmerkey
2005-11-13  3:44         ` Andi Kleen
2005-11-13  3:26           ` Jeff V. Merkey
2005-11-13  3:32             ` Jeff V. Merkey
2005-11-09 17:53   ` Alan Cox
2005-11-09 16:25     ` Jeffrey V. Merkey
2005-11-10 14:48     ` Mark Lord
2005-11-10 15:28       ` Tom Rini
2005-11-10 16:37       ` Alan Cox
2005-11-13  1:11       ` Andi Kleen
     [not found] ` <437214E4.76F0.0078.0@novell.com>
     [not found]   ` <4372153C.76F0.0078.0@novell.com>
2005-11-10 13:33     ` [PATCH 32/39] NLKD/x86-64 - Core Debug Engine Andi Kleen

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=43721119.76F0.0078.0@novell.com \
    --to=jbeulich@novell.com \
    --cc=linux-kernel@vger.kernel.org \
    /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