summaryrefslogtreecommitdiffstats
path: root/toolbox
diff options
context:
space:
mode:
authorChris Dearman <chris.dearman@imgtec.com>2015-03-09 18:36:23 -0700
committerElliott Hughes <enh@google.com>2015-03-09 20:26:10 -0700
commit08b3466bc27d00af535711674f3273b04c7e15a5 (patch)
tree1f7f8862bf44392778765b4cb1500de77ce861f3 /toolbox
parent332c2881305549450b162d854b139611d7bdc42f (diff)
downloadsystem_core-08b3466bc27d00af535711674f3273b04c7e15a5.zip
system_core-08b3466bc27d00af535711674f3273b04c7e15a5.tar.gz
system_core-08b3466bc27d00af535711674f3273b04c7e15a5.tar.bz2
Increase output width for wchan and pc on 64 bit targets.
Also switch wchan to the textual form, since most of us don't know kernel addresses off by heart. Change-Id: I8e28d910034d8171c5b994189b16114f80f38d2f
Diffstat (limited to 'toolbox')
-rw-r--r--toolbox/ps.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/toolbox/ps.c b/toolbox/ps.c
index d0a8db3..18129ff 100644
--- a/toolbox/ps.c
+++ b/toolbox/ps.c
@@ -29,6 +29,12 @@ static char *nexttok(char **strp)
#define SHOW_NUMERIC_UID 32
#define SHOW_ABI 64
+#if __LP64__
+#define PC_WIDTH 10 /* Realistically, the top bits will be 0, so don't waste space. */
+#else
+#define PC_WIDTH (2*sizeof(uintptr_t))
+#endif
+
static int display_flags = 0;
static int ppid_filter = 0;
@@ -44,7 +50,8 @@ static int ps_line(int pid, int tid, char *namefilter)
int fd, r;
char *ptr, *name, *state;
int ppid;
- unsigned wchan, rss, vss, eip;
+ unsigned rss, vss;
+ uintptr_t eip;
unsigned utime, stime;
int prio, nice, rtprio, sched, psr;
struct passwd *pw;
@@ -124,7 +131,7 @@ static int ps_line(int pid, int tid, char *namefilter)
nexttok(&ptr); // blocked
nexttok(&ptr); // sigignore
nexttok(&ptr); // sigcatch
- wchan = strtoul(nexttok(&ptr), 0, 10); // wchan
+ nexttok(&ptr); // wchan
nexttok(&ptr); // nswap
nexttok(&ptr); // cnswap
nexttok(&ptr); // exit signal
@@ -176,7 +183,16 @@ static int ps_line(int pid, int tid, char *namefilter)
else
printf(" %.2s ", get_sched_policy_name(p));
}
- printf(" %08x %08x %s ", wchan, eip, state);
+ char path[PATH_MAX];
+ snprintf(path, sizeof(path), "/proc/%d/wchan", pid);
+ char wchan[10];
+ int fd = open(path, O_RDONLY);
+ ssize_t wchan_len = read(fd, wchan, sizeof(wchan));
+ if (wchan_len == -1) {
+ wchan[wchan_len = 0] = '\0';
+ }
+ close(fd);
+ printf(" %10.*s %0*lx %s ", (int) wchan_len, wchan, (int) PC_WIDTH, eip, state);
if (display_flags & SHOW_ABI) {
print_exe_abi(pid);
}
@@ -285,12 +301,13 @@ int ps_main(int argc, char **argv)
}
if (display_flags & SHOW_MACLABEL) {
- printf("LABEL USER PID PPID NAME\n");
+ printf("LABEL USER PID PPID NAME\n");
} else {
- printf("USER PID PPID VSIZE RSS %s%s %s WCHAN PC %sNAME\n",
+ printf("USER PID PPID VSIZE RSS %s%s %sWCHAN %*s %sNAME\n",
(display_flags&SHOW_CPU)?"CPU ":"",
(display_flags&SHOW_PRIO)?"PRIO NICE RTPRI SCHED ":"",
(display_flags&SHOW_POLICY)?"PCY " : "",
+ (int) PC_WIDTH, "PC",
(display_flags&SHOW_ABI)?"ABI " : "");
}
while((de = readdir(d)) != 0){