Skip to content

Commit

Permalink
powerpc/xmon: Paged output for paca display
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Sam bobroff authored and Michael Ellerman committed Oct 15, 2015
1 parent b340587 commit 958b7c8
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 2 deletions.
64 changes: 62 additions & 2 deletions arch/powerpc/xmon/nonstdio.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,25 @@
#include <asm/time.h>
#include "nonstdio.h"

static bool paginating, paginate_skipping;
static unsigned long paginate_lpp; /* Lines Per Page */
static unsigned long paginate_pos;

static int xmon_write(const void *ptr, int nb)
void xmon_start_pagination(void)
{
return udbg_write(ptr, nb);
paginating = true;
paginate_skipping = false;
paginate_pos = 0;
}

void xmon_end_pagination(void)
{
paginating = false;
}

void xmon_set_pagination_lpp(unsigned long lpp)
{
paginate_lpp = lpp;
}

static int xmon_readchar(void)
Expand All @@ -24,6 +39,51 @@ static int xmon_readchar(void)
return -1;
}

static int xmon_write(const char *ptr, int nb)
{
int rv = 0;
const char *p = ptr, *q;
const char msg[] = "[Hit a key (a:all, q:truncate, any:next page)]";

if (nb <= 0)
return rv;

if (paginating && paginate_skipping)
return nb;

if (paginate_lpp) {
while (paginating && (q = strchr(p, '\n'))) {
rv += udbg_write(p, q - p + 1);
p = q + 1;
paginate_pos++;

if (paginate_pos >= paginate_lpp) {
udbg_write(msg, strlen(msg));

switch (xmon_readchar()) {
case 'a':
paginating = false;
break;
case 'q':
paginate_skipping = true;
break;
default:
/* nothing */
break;
}

paginate_pos = 0;
udbg_write("\r\n", 2);

if (paginate_skipping)
return nb;
}
}
}

return rv + udbg_write(p, nb - (p - ptr));
}

int xmon_putchar(int c)
{
char ch = c;
Expand Down
3 changes: 3 additions & 0 deletions arch/powerpc/xmon/nonstdio.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
#define printf xmon_printf
#define putchar xmon_putchar

extern void xmon_set_pagination_lpp(unsigned long lpp);
extern void xmon_start_pagination(void);
extern void xmon_end_pagination(void);
extern int xmon_putchar(int c);
extern void xmon_puts(const char *);
extern char *xmon_gets(char *, int);
Expand Down
18 changes: 18 additions & 0 deletions arch/powerpc/xmon/xmon.c
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,9 @@ Commands:\n\
" u dump TLB\n"
#endif
" ? help\n"
#ifdef CONFIG_PPC64
" # n limit output to n lines per page (dump paca only)\n"
#endif
" zr reboot\n\
zh halt\n"
;
Expand Down Expand Up @@ -833,6 +836,16 @@ static void remove_cpu_bpts(void)
write_ciabr(0);
}

static void set_lpp_cmd(void)
{
unsigned long lpp;

if (!scanhex(&lpp)) {
printf("Invalid number.\n");
lpp = 0;
}
xmon_set_pagination_lpp(lpp);
}
/* Command interpreting routine */
static char *last_cmd;

Expand Down Expand Up @@ -924,6 +937,9 @@ cmds(struct pt_regs *excp)
case '?':
xmon_puts(help_string);
break;
case '#':
set_lpp_cmd();
break;
case 'b':
bpt_cmds();
break;
Expand Down Expand Up @@ -2166,7 +2182,9 @@ dump(void)

#ifdef CONFIG_PPC64
if (c == 'p') {
xmon_start_pagination();
dump_pacas();
xmon_end_pagination();
return;
}
#endif
Expand Down

0 comments on commit 958b7c8

Please sign in to comment.