From: Douglas Miller <dougmill@linux.vnet.ibm.com>
To: Benjamin Herrenschmidt <benh@kernel.crashing.org>,
linuxppc-dev@lists.ozlabs.org
Subject: Re: [xmon PATCH 1/1] RFC: Add xmon command to dump process/task similar to ps(1)
Date: Fri, 13 Nov 2015 09:58:19 -0600 [thread overview]
Message-ID: <5646089B.6090408@linux.vnet.ibm.com> (raw)
In-Reply-To: <1447229393.31884.152.camel@kernel.crashing.org>
[-- Attachment #1: Type: text/plain, Size: 1499 bytes --]
Thanks, Ben, for the feedback.
Here is an updated patch. I added a macro XMON_PROTECT() to wrap a
statement in what I think is the correct setjmp/protection code. Each
place seems to do it slightly differently, so I wasn't sure what the
right way was and didn't want to change all other places until we were
certain. If you have a better way to implement this, please let me know.
It may be difficult to make a macro that fits all use cases, too.
I checked using a task point of NULL and it errored out safely, and also
tried a pointer to valid memory but not a valid task_struct and it also
errored out cleanly. Of course, random memory might not always cause a
fault but rather just print garbage.
Thanks,
Doug
On 11/11/2015 02:09 AM, Benjamin Herrenschmidt wrote:
> On Tue, 2015-11-10 at 10:50 -0600, Douglas Miller wrote:
>> +{
>> + unsigned long tskv;
>> + struct task_struct *tsk;
>> +
>> + if (scanhex(&tskv)) {
>> + procshow((struct task_struct *)tskv);
>> + } else {
>> + for_each_process(tsk) {
>> + procshow(tsk);
>> + }
>> + }
>> +}
>> +
> The main thing is wrap it with the setjump magic that xmon uses for
> other things that allows it to recover if you hit a bad pointer
> along the way:
>
> if (setjmp(bus_error_jmp) == 0) {
> catch_memory_errors = 1;
> sync();
> ... do your stuff...
> sync();
> }
> catch_memory_errors = 0;
>
> We could make some kind of helper or macro to factor that out
> while it it ;-) (For bonus points !)
>
> Cheers,
> Ben.
>
>
[-- Attachment #2: 0001-Add-xmon-command-to-dump-process-task-similar-to-ps-.patch --]
[-- Type: text/x-patch, Size: 2937 bytes --]
>From a0e7eeef8c51ecedad131aa4c04541f37fc083c4 Mon Sep 17 00:00:00 2001
From: Douglas Miller <dougmill@linux.vnet.ibm.com>
Date: Thu, 5 Nov 2015 07:55:33 -0600
Subject: [PATCH] Add xmon command to dump process/task similar to ps(1)
---
arch/powerpc/xmon/xmon.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 58 insertions(+), 0 deletions(-)
diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
index 13c6e20..5c24f55 100644
--- a/arch/powerpc/xmon/xmon.c
+++ b/arch/powerpc/xmon/xmon.c
@@ -149,6 +149,7 @@ static int cpu_cmd(void);
static void csum(void);
static void bootcmds(void);
static void proccall(void);
+static void proclist(void);
void dump_segments(void);
static void symbol_lookup(void);
static void xmon_show_stack(unsigned long sp, unsigned long lr,
@@ -191,6 +192,24 @@ extern void xmon_leave(void);
|| ('A' <= (c) && (c) <= 'Z'))
#define isspace(c) (c == ' ' || c == '\t' || c == 10 || c == 13 || c == 0)
+/*
+ * Wrap a statement (typically function call) in setjmp to
+ * protect it from memory access errors. msg... are printf
+ * fmt+args used if error is trapped.
+ */
+#define XMON_PROTECT(stmt, msg...) \
+ if (setjmp(bus_error_jmp) != 0) { \
+ catch_memory_errors = 0; \
+ printf(msg); \
+ } else { \
+ catch_memory_errors = 1; \
+ sync(); \
+ stmt; \
+ sync(); \
+ __delay(200); \
+ catch_memory_errors = 0; \
+ }
+
static char *help_string = "\
Commands:\n\
b show breakpoints\n\
@@ -228,6 +247,7 @@ Commands:\n\
mz zero a block of memory\n\
mi show information about memory allocation\n\
p call a procedure\n\
+ P list processes/tasks\n\
r print registers\n\
s single step\n"
#ifdef CONFIG_SPU_BASE
@@ -947,6 +967,9 @@ cmds(struct pt_regs *excp)
case 'p':
proccall();
break;
+ case 'P':
+ proclist();
+ break;
#ifdef CONFIG_PPC_STD_MMU
case 'u':
dump_segments();
@@ -2450,6 +2473,41 @@ memzcan(void)
printf("%.8x\n", a - mskip);
}
+static void procshow(struct task_struct *tsk)
+{
+ char state;
+
+ state = (tsk->state == 0) ? 'R' :
+ (tsk->state < 0) ? 'U' :
+ (tsk->state & TASK_UNINTERRUPTIBLE) ? 'D' :
+ (tsk->state & TASK_STOPPED) ? 'T' :
+ (tsk->state & TASK_TRACED) ? 'C' :
+ (tsk->exit_state & EXIT_ZOMBIE) ? 'Z' :
+ (tsk->exit_state & EXIT_DEAD) ? 'E' :
+ (tsk->state & TASK_INTERRUPTIBLE) ? 'S' : '?';
+
+ printf("%p %016lx %6d %6d %c %2d %s\n", tsk,
+ tsk->thread.ksp,
+ tsk->pid, tsk->parent->pid,
+ state, task_thread_info(tsk)->cpu,
+ tsk->comm);
+}
+
+static void proclist(void)
+{
+ unsigned long tskv;
+ struct task_struct *tsk;
+
+ if (scanhex(&tskv)) {
+ tsk = (struct task_struct *)tskv;
+ XMON_PROTECT(procshow(tsk), "*** Error dumping task %p\n", tsk);
+ } else {
+ for_each_process(tsk) {
+ XMON_PROTECT(procshow(tsk), "*** Error dumping task %p\n", tsk);
+ }
+ }
+}
+
static void proccall(void)
{
unsigned long args[8];
--
1.7.1
prev parent reply other threads:[~2015-11-13 15:58 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-10 15:31 [xmon PATCH 1/1] RFC: Add xmon command to dump process/task similar to ps(1) Douglas Miller
2015-11-10 16:50 ` Douglas Miller
2015-11-11 8:09 ` Benjamin Herrenschmidt
2015-11-13 15:58 ` Douglas Miller [this message]
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=5646089B.6090408@linux.vnet.ibm.com \
--to=dougmill@linux.vnet.ibm.com \
--cc=benh@kernel.crashing.org \
--cc=linuxppc-dev@lists.ozlabs.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.