[PATCH v2] powerpc/xmon: Allow limiting the size of the paca display

Michael Ellerman mpe at ellerman.id.au
Wed Aug 12 21:55:25 AEST 2015


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.

We'd like to expand the paca display even more, so add a way to limit
the number of lines that are displayed.

This adds a third form of 'dp' which is 'dp # #', where the first number
is the cpu, and the second is the number of lines to display.

Example output:

  5:mon> dp 3 6
  paca for cpu 0x3 @ c00000000fe00c00:
   possible         = yes
   present          = yes
   online           = yes
   lock_token       = 0x8000            	(0xa)
   paca_index       = 0x3               	(0x8)
   kernel_toc       = 0xc000000001230300	(0x10)

Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>
---

v2: Honour the limit even for the initial lines, and change the
    implementation to use goto to bail out early rather than checking
    continuously.


 arch/powerpc/xmon/xmon.c | 40 +++++++++++++++++++++++++++++-----------
 1 file changed, 29 insertions(+), 11 deletions(-)

diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
index e599259d84fc..2950c6aface4 100644
--- a/arch/powerpc/xmon/xmon.c
+++ b/arch/powerpc/xmon/xmon.c
@@ -205,6 +205,7 @@ Commands:\n\
 #ifdef CONFIG_PPC64
   "\
   dp[#]	dump paca for current cpu, or cpu #\n\
+  dp##  dump paca for cpu #, only # lines\n\
   dpa	dump paca for all possible cpus\n"
 #endif
   "\
@@ -2070,9 +2071,10 @@ static void xmon_rawdump (unsigned long adrs, long ndump)
 }
 
 #ifdef CONFIG_PPC64
-static void dump_one_paca(int cpu)
+static void dump_one_paca(int cpu, int num_lines)
 {
 	struct paca_struct *p;
+	int line;
 
 	if (setjmp(bus_error_jmp) != 0) {
 		printf("*** Error dumping paca for cpu 0x%x!\n", cpu);
@@ -2082,17 +2084,28 @@ static void dump_one_paca(int cpu)
 	catch_memory_errors = 1;
 	sync();
 
+#define CHECK_LINE()				\
+	if (num_lines && line++ >= num_lines)	\
+		goto out;			\
+
+#define DUMP(paca, name, format)					\
+	printf(" %-*s = %#-*"format"\t(0x%lx)\n", 16, #name, 18,	\
+	       paca->name, offsetof(struct paca_struct, name));		\
+	CHECK_LINE();
+
 	p = &paca[cpu];
 
+	line = 0;
+
 	printf("paca for cpu 0x%x @ %p:\n", cpu, p);
+	CHECK_LINE();
 
 	printf(" %-*s = %s\n", 16, "possible", cpu_possible(cpu) ? "yes" : "no");
+	CHECK_LINE();
 	printf(" %-*s = %s\n", 16, "present", cpu_present(cpu) ? "yes" : "no");
+	CHECK_LINE();
 	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));
+	CHECK_LINE();
 
 	DUMP(p, lock_token, "x");
 	DUMP(p, paca_index, "x");
@@ -2119,8 +2132,10 @@ static void dump_one_paca(int cpu)
 	DUMP(p, irq_work_pending, "x");
 	DUMP(p, nap_state_lost, "x");
 
+#undef CHECK_LINE
 #undef DUMP
 
+out:
 	catch_memory_errors = 0;
 	sync();
 }
@@ -2135,12 +2150,12 @@ static void dump_all_pacas(void)
 	}
 
 	for_each_possible_cpu(cpu)
-		dump_one_paca(cpu);
+		dump_one_paca(cpu, 0);
 }
 
 static void dump_pacas(void)
 {
-	unsigned long num;
+	unsigned long num, lines;
 	int c;
 
 	c = inchar();
@@ -2151,10 +2166,13 @@ static void dump_pacas(void)
 
 	termch = c;	/* Put c back, it wasn't 'a' */
 
-	if (scanhex(&num))
-		dump_one_paca(num);
-	else
-		dump_one_paca(xmon_owner);
+	num = xmon_owner;
+	scanhex(&num);
+
+	lines = 0;
+	scanhex(&lines);
+
+	dump_one_paca(num, lines);
 }
 #endif
 
-- 
2.1.4



More information about the Linuxppc-dev mailing list