diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
index e599259..9ce9e7d 100644
--- a/arch/powerpc/xmon/xmon.c
+++ b/arch/powerpc/xmon/xmon.c
@@ -72,6 +72,12 @@ static int xmon_gate;
static unsigned long in_xmon __read_mostly = 0;
+#define XMON_PRINTF(...) do { if (paged_vis()) printf(__VA_ARGS__); } while (0)
+#define MAX_PAGED_SIZE 1024
+static unsigned long paged_size = 0, paged_pos, paged_cur_page;
+#ifdef CONFIG_PPC64
+static unsigned long paca_cpu;
+#endif
static unsigned long adrs;
static int size = 1;
#define MAX_DUMP (128 * 1024)@@ -242,6 +248,9 @@ Commands:\n\
" u dump TLB\n"
#endif
" ? help\n"
+#ifdef CONFIG_PPC64
+" .# limit output to # lines per page (dump paca only)\n"
+#endif
" zr reboot\n\
zh halt\n"
;
@@ -833,6 +842,19 @@ static void remove_cpu_bpts(void)
write_ciabr(0);
}
+static void paged_set_size(void)
+{
+ if (!scanhex(&paged_size) || (paged_size > MAX_PAGED_SIZE)) {
+ printf("Invalid number of lines per page (max: %d).\n",
+ MAX_PAGED_SIZE);
+ paged_size = 0;
+ }
+}
+static void paged_reset(void)
+{
+ paged_cur_page = 0;
+}
+
/* Command interpreting routine */
static char *last_cmd;
@@ -863,7 +885,8 @@ cmds(struct pt_regs *excp)
take_input(last_cmd);
last_cmd = NULL;
cmd = inchar();
- }
+ } else
+ paged_reset();
switch (cmd) {
case 'm':
cmd = inchar();@@ -924,6 +947,9 @@ cmds(struct pt_regs *excp)
case '?':
xmon_puts(help_string);
break;
+ case '.':
+ paged_set_size();
+ break;
case 'b':
bpt_cmds();
break;
@@ -2069,6 +2095,31 @@ static void xmon_rawdump (unsigned long adrs, long ndump)
printf("\n");
}
+static void paged_start(void)
+{
+ paged_pos = 0;
+}
+
+static void paged_end(char *next_cmd)
+{
+ unsigned long next_page_start = ++paged_cur_page * paged_size;
+
+ if (paged_size && (paged_pos > next_page_start)) {
+ last_cmd = next_cmd;
+ printf("[Enter for next page]\n");
+ }
+}
+
+static bool paged_vis(void)
+{
+ bool rv = (!paged_size
+ || ((paged_pos >= (paged_size * paged_cur_page))
+ && (paged_pos < (paged_size * (paged_cur_page + 1)))));
+
+ paged_pos++;
+ return rv;
+}
+
#ifdef CONFIG_PPC64
static void dump_one_paca(int cpu)
{@@ -2084,15 +2135,17 @@ static void dump_one_paca(int cpu)
p = &paca[cpu];
- printf("paca for cpu 0x%x @ %p:\n", cpu, p);
+ XMON_PRINTF("paca for cpu 0x%x @ %p:\n", cpu, p);
- printf(" %-*s = %s\n", 16, "possible", cpu_possible(cpu) ? "yes" : "no");
- printf(" %-*s = %s\n", 16, "present", cpu_present(cpu) ? "yes" : "no");
- printf(" %-*s = %s\n", 16, "online", cpu_online(cpu) ? "yes" : "no");
+ XMON_PRINTF(" %-*s = %s\n", 16, "possible", cpu_possible(cpu) ? "yes" : "no");
+ XMON_PRINTF(" %-*s = %s\n", 16, "present", cpu_present(cpu) ? "yes" : "no");
+ XMON_PRINTF(" %-*s = %s\n", 16, "online", cpu_online(cpu) ? "yes" : "no");
-#define DUMP(paca, name, format) \
- printf(" %-*s = %#-*"format"\t(0x%lx)\n", 16, #name, 18, paca->name, \
- offsetof(struct paca_struct, name));
+#define DUMP(paca, name, format) do { \
+ if (paged_vis()) \
+ printf(" %-*s = %#-*"format"\t(0x%lx)\n", 16, #name, 18, \
+ paca->name, offsetof(struct paca_struct, name)); \
+} while (0)
DUMP(p, lock_token, "x");
DUMP(p, paca_index, "x");@@ -2134,13 +2187,14 @@ static void dump_all_pacas(void)
return;
}
+ paged_start();
for_each_possible_cpu(cpu)
dump_one_paca(cpu);
+ paged_end("dpa\n");
}
static void dump_pacas(void)
{
- unsigned long num;
int c;
c = inchar();@@ -2148,13 +2202,15 @@ static void dump_pacas(void)
dump_all_pacas();
return;
}
+ if (c != '_') {
+ termch = c;
+ if (!scanhex(&paca_cpu))
+ paca_cpu = xmon_owner;
+ }
- termch = c; /* Put c back, it wasn't 'a' */
-
- if (scanhex(&num))
- dump_one_paca(num);
- else
- dump_one_paca(xmon_owner);
+ paged_start();
+ dump_one_paca(paca_cpu);
+ paged_end("dp_\n");
}
#endif
--
2.1.4