aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam bobroff <sam.bobroff@au1.ibm.com>2015-10-07 20:50:23 -0400
committerMichael Ellerman <mpe@ellerman.id.au>2015-10-15 05:32:01 -0400
commit958b7c80507a6eb847777b0d6d99d2cad08c529c (patch)
tree045104d89a48fe4c75a2f34625224c94955830e9
parentb340587e68b479e52039f800d7c60abd417e1975 (diff)
powerpc/xmon: Paged output for paca display
The paca display is already more than 24 lines, which can be problematic if you have an old school 80x24 terminal, or more likely you are on a virtual terminal which does not scroll for whatever reason. This patch adds a new command "#", which takes a single (hex) numeric argument: lines per page. It will cause the output of "dp" and "dpa" to be broken into pages, if necessary. Sample output: 0:mon> # 10 0:mon> dp1 paca for cpu 0x1 @ c00000000fdc0480: possible = yes present = yes online = yes lock_token = 0x8000 (0x8) paca_index = 0x1 (0xa) kernel_toc = 0xc000000000eb2400 (0x10) kernelbase = 0xc000000000000000 (0x18) kernel_msr = 0xb000000000001032 (0x20) emergency_sp = 0xc00000003ffe8000 (0x28) mc_emergency_sp = 0xc00000003ffe4000 (0x2e0) in_mce = 0x0 (0x2e8) data_offset = 0x7f170000 (0x30) hw_cpu_id = 0x8 (0x38) cpu_start = 0x1 (0x3a) kexec_state = 0x0 (0x3b) [Hit a key (a:all, q:truncate, any:next page)] 0:mon> __current = 0xc00000007e696620 (0x290) kstack = 0xc00000007e6ebe30 (0x298) stab_rr = 0xb (0x2a0) saved_r1 = 0xc00000007ef37860 (0x2a8) trap_save = 0x0 (0x2b8) soft_enabled = 0x0 (0x2ba) irq_happened = 0x1 (0x2bb) io_sync = 0x0 (0x2bc) irq_work_pending = 0x0 (0x2bd) nap_state_lost = 0x0 (0x2be) 0:mon> Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com> [mpe: Use bool, make some variables static] Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
-rw-r--r--arch/powerpc/xmon/nonstdio.c64
-rw-r--r--arch/powerpc/xmon/nonstdio.h3
-rw-r--r--arch/powerpc/xmon/xmon.c18
3 files changed, 83 insertions, 2 deletions
diff --git a/arch/powerpc/xmon/nonstdio.c b/arch/powerpc/xmon/nonstdio.c
index c98748617896..d00123421e00 100644
--- a/arch/powerpc/xmon/nonstdio.c
+++ b/arch/powerpc/xmon/nonstdio.c
@@ -11,10 +11,25 @@
11#include <asm/time.h> 11#include <asm/time.h>
12#include "nonstdio.h" 12#include "nonstdio.h"
13 13
14static bool paginating, paginate_skipping;
15static unsigned long paginate_lpp; /* Lines Per Page */
16static unsigned long paginate_pos;
14 17
15static int xmon_write(const void *ptr, int nb) 18void xmon_start_pagination(void)
16{ 19{
17 return udbg_write(ptr, nb); 20 paginating = true;
21 paginate_skipping = false;
22 paginate_pos = 0;
23}
24
25void xmon_end_pagination(void)
26{
27 paginating = false;
28}
29
30void xmon_set_pagination_lpp(unsigned long lpp)
31{
32 paginate_lpp = lpp;
18} 33}
19 34
20static int xmon_readchar(void) 35static int xmon_readchar(void)
@@ -24,6 +39,51 @@ static int xmon_readchar(void)
24 return -1; 39 return -1;
25} 40}
26 41
42static int xmon_write(const char *ptr, int nb)
43{
44 int rv = 0;
45 const char *p = ptr, *q;
46 const char msg[] = "[Hit a key (a:all, q:truncate, any:next page)]";
47
48 if (nb <= 0)
49 return rv;
50
51 if (paginating && paginate_skipping)
52 return nb;
53
54 if (paginate_lpp) {
55 while (paginating && (q = strchr(p, '\n'))) {
56 rv += udbg_write(p, q - p + 1);
57 p = q + 1;
58 paginate_pos++;
59
60 if (paginate_pos >= paginate_lpp) {
61 udbg_write(msg, strlen(msg));
62
63 switch (xmon_readchar()) {
64 case 'a':
65 paginating = false;
66 break;
67 case 'q':
68 paginate_skipping = true;
69 break;
70 default:
71 /* nothing */
72 break;
73 }
74
75 paginate_pos = 0;
76 udbg_write("\r\n", 2);
77
78 if (paginate_skipping)
79 return nb;
80 }
81 }
82 }
83
84 return rv + udbg_write(p, nb - (p - ptr));
85}
86
27int xmon_putchar(int c) 87int xmon_putchar(int c)
28{ 88{
29 char ch = c; 89 char ch = c;
diff --git a/arch/powerpc/xmon/nonstdio.h b/arch/powerpc/xmon/nonstdio.h
index 18a51ded4ffd..f8653365667e 100644
--- a/arch/powerpc/xmon/nonstdio.h
+++ b/arch/powerpc/xmon/nonstdio.h
@@ -3,6 +3,9 @@
3#define printf xmon_printf 3#define printf xmon_printf
4#define putchar xmon_putchar 4#define putchar xmon_putchar
5 5
6extern void xmon_set_pagination_lpp(unsigned long lpp);
7extern void xmon_start_pagination(void);
8extern void xmon_end_pagination(void);
6extern int xmon_putchar(int c); 9extern int xmon_putchar(int c);
7extern void xmon_puts(const char *); 10extern void xmon_puts(const char *);
8extern char *xmon_gets(char *, int); 11extern char *xmon_gets(char *, int);
diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
index 6ef1231c6e9c..f829baf45fd7 100644
--- a/arch/powerpc/xmon/xmon.c
+++ b/arch/powerpc/xmon/xmon.c
@@ -242,6 +242,9 @@ Commands:\n\
242" u dump TLB\n" 242" u dump TLB\n"
243#endif 243#endif
244" ? help\n" 244" ? help\n"
245#ifdef CONFIG_PPC64
246" # n limit output to n lines per page (dump paca only)\n"
247#endif
245" zr reboot\n\ 248" zr reboot\n\
246 zh halt\n" 249 zh halt\n"
247; 250;
@@ -833,6 +836,16 @@ static void remove_cpu_bpts(void)
833 write_ciabr(0); 836 write_ciabr(0);
834} 837}
835 838
839static void set_lpp_cmd(void)
840{
841 unsigned long lpp;
842
843 if (!scanhex(&lpp)) {
844 printf("Invalid number.\n");
845 lpp = 0;
846 }
847 xmon_set_pagination_lpp(lpp);
848}
836/* Command interpreting routine */ 849/* Command interpreting routine */
837static char *last_cmd; 850static char *last_cmd;
838 851
@@ -924,6 +937,9 @@ cmds(struct pt_regs *excp)
924 case '?': 937 case '?':
925 xmon_puts(help_string); 938 xmon_puts(help_string);
926 break; 939 break;
940 case '#':
941 set_lpp_cmd();
942 break;
927 case 'b': 943 case 'b':
928 bpt_cmds(); 944 bpt_cmds();
929 break; 945 break;
@@ -2166,7 +2182,9 @@ dump(void)
2166 2182
2167#ifdef CONFIG_PPC64 2183#ifdef CONFIG_PPC64
2168 if (c == 'p') { 2184 if (c == 'p') {
2185 xmon_start_pagination();
2169 dump_pacas(); 2186 dump_pacas();
2187 xmon_end_pagination();
2170 return; 2188 return;
2171 } 2189 }
2172#endif 2190#endif