linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] powerpc: Add an xmon command to dump one or all pacas
@ 2012-09-12  7:52 Michael Ellerman
  2012-09-12  8:45 ` Benjamin Herrenschmidt
  2012-09-12 11:07 ` Stephen Rothwell
  0 siblings, 2 replies; 9+ messages in thread
From: Michael Ellerman @ 2012-09-12  7:52 UTC (permalink / raw)
  To: linuxppc-dev

This was originally motivated by a desire to see the mapping between
logical and hardware cpu numbers.

But it seemed that it made more sense to just add a command to dump
(most of) the paca.

With no arguments "dp" will dump the paca for all possible cpus. If
there are no possible cpus, like early in boot, it will tell you that.

It also takes an argument, eg. "dp 3" which is the logical cpu number
in hex. This form does not check if the cpu is possible, but displays
the paca regardless, as well as the cpu's state in the possible, present
and online masks.

Sample output, number in brackets is the offset into the struct:

2:mon> dp 3
paca for cpu 0x3 @ c00000000ff20a80:
 possible         = yes
 present          = yes
 online           = yes
 lock_token       = 0x8000            	(0x8)
 paca_index       = 0x3               	(0xa)
 kernel_toc       = 0xc00000000144f990	(0x10)
 kernelbase       = 0xc000000000000000	(0x18)
 kernel_msr       = 0xb000000000001032	(0x20)
 stab_real        = 0x0               	(0x28)
 stab_addr        = 0x0               	(0x30)
 emergency_sp     = 0xc00000003ffe4000	(0x38)
 data_offset      = 0xa40000          	(0x40)
 hw_cpu_id        = 0x9               	(0x50)
 cpu_start        = 0x1               	(0x52)
 kexec_state      = 0x0               	(0x53)
 __current        = 0xc00000007e568680	(0x218)
 kstack           = 0xc00000007e5a3e30	(0x220)
 stab_rr          = 0x1a              	(0x228)
 saved_r1         = 0xc00000007e7cb450	(0x230)
 trap_save        = 0x0               	(0x240)
 soft_enabled     = 0x0               	(0x242)
 irq_happened     = 0x0               	(0x243)
 io_sync          = 0x0               	(0x244)
 irq_work_pending = 0x0               	(0x245)
 nap_state_lost   = 0x0               	(0x246)

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
---
 arch/powerpc/xmon/xmon.c |   83 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 83 insertions(+)

diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
index eab3492..f090c46 100644
--- a/arch/powerpc/xmon/xmon.c
+++ b/arch/powerpc/xmon/xmon.c
@@ -202,6 +202,7 @@ Commands:\n\
   df	dump float values\n\
   dd	dump double values\n\
   dl    dump the kernel log buffer\n\
+  dp #  dump paca for cpu # (or all)\n\
   dr	dump stream of raw bytes\n\
   e	print exception information\n\
   f	flush cache\n\
@@ -2008,6 +2009,82 @@ static void xmon_rawdump (unsigned long adrs, long ndump)
 	printf("\n");
 }
 
+static void dump_one_paca(int cpu)
+{
+	struct paca_struct *p;
+
+	if (setjmp(bus_error_jmp) != 0) {
+		printf("*** Error dumping paca for cpu 0x%x!\n", cpu);
+		return;
+	}
+
+	catch_memory_errors = 1;
+	sync();
+
+	p = &paca[cpu];
+
+	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");
+
+#define DUMP(name, format) \
+	printf(" %-*s = %#-*"format"\t(0x%lx)\n", 16, #name, 18, p->name, \
+		(u64)((void *)&(p->name) - (void *)p));
+
+	DUMP(lock_token, "x");
+	DUMP(paca_index, "x");
+	DUMP(kernel_toc, "lx");
+	DUMP(kernelbase, "lx");
+	DUMP(kernel_msr, "lx");
+#ifdef CONFIG_PPC_STD_MMU_64
+	DUMP(stab_real, "lx");
+	DUMP(stab_addr, "lx");
+#endif
+	DUMP(emergency_sp, "p");
+	DUMP(data_offset, "lx");
+	DUMP(hw_cpu_id, "x");
+	DUMP(cpu_start, "x");
+	DUMP(kexec_state, "x");
+	DUMP(__current, "p");
+	DUMP(kstack, "lx");
+	DUMP(stab_rr, "lx");
+	DUMP(saved_r1, "lx");
+	DUMP(trap_save, "x");
+	DUMP(soft_enabled, "x");
+	DUMP(irq_happened, "x");
+	DUMP(io_sync, "x");
+	DUMP(irq_work_pending, "x");
+	DUMP(nap_state_lost, "x");
+
+#undef DUMP
+
+	catch_memory_errors = 0;
+	sync();
+}
+
+static void dump_pacas(void)
+{
+	unsigned long num = ULONG_MAX;
+	int cpu;
+
+	scanhex(&num);
+	if (num != ULONG_MAX) {
+		/* NB we allow showing a non-possible paca here */
+		dump_one_paca(num);
+		return;
+	}
+
+	if (num_possible_cpus() == 0) {
+		printf("No possible cpus, use 'dp #' to dump individual cpus\n");
+		return;
+	}
+
+	for_each_possible_cpu(cpu)
+		dump_one_paca(cpu);
+}
+
 #define isxdigit(c)	(('0' <= (c) && (c) <= '9') \
 			 || ('a' <= (c) && (c) <= 'f') \
 			 || ('A' <= (c) && (c) <= 'F'))
@@ -2017,6 +2094,12 @@ dump(void)
 	int c;
 
 	c = inchar();
+
+	if (c == 'p') {
+		dump_pacas();
+		return;
+	}
+
 	if ((isxdigit(c) && c != 'f' && c != 'd') || c == '\n')
 		termch = c;
 	scanhex((void *)&adrs);
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH] powerpc: Add an xmon command to dump one or all pacas
  2012-09-12  7:52 [PATCH] powerpc: Add an xmon command to dump one or all pacas Michael Ellerman
@ 2012-09-12  8:45 ` Benjamin Herrenschmidt
  2012-09-14  4:44   ` Michael Ellerman
  2012-09-12 11:07 ` Stephen Rothwell
  1 sibling, 1 reply; 9+ messages in thread
From: Benjamin Herrenschmidt @ 2012-09-12  8:45 UTC (permalink / raw)
  To: Michael Ellerman; +Cc: linuxppc-dev

On Wed, 2012-09-12 at 17:52 +1000, Michael Ellerman wrote:
> This was originally motivated by a desire to see the mapping between
> logical and hardware cpu numbers.
> 
> But it seemed that it made more sense to just add a command to dump
> (most of) the paca.
> 
> With no arguments "dp" will dump the paca for all possible cpus. If
> there are no possible cpus, like early in boot, it will tell you that.

I'd rather "dp" dump the paca for the current active CPU in xmon.
Shouldn't be hard to make a "dpa" that dumps them all too.

(You can do inchar to check the next char and if not 'a' you can put it
back in termch).

Cheers,
Ben.

> It also takes an argument, eg. "dp 3" which is the logical cpu number
> in hex. This form does not check if the cpu is possible, but displays
> the paca regardless, as well as the cpu's state in the possible, present
> and online masks.
> 
> Sample output, number in brackets is the offset into the struct:
> 
> 2:mon> dp 3
> paca for cpu 0x3 @ c00000000ff20a80:
>  possible         = yes
>  present          = yes
>  online           = yes

A bit of bike shed painting but ... the above isn't strictly PACA
fields... Handy to have but should it be part of the same command ?

Cheers,
Ben.

>  lock_token       = 0x8000            	(0x8)
>  paca_index       = 0x3               	(0xa)
>  kernel_toc       = 0xc00000000144f990	(0x10)
>  kernelbase       = 0xc000000000000000	(0x18)
>  kernel_msr       = 0xb000000000001032	(0x20)
>  stab_real        = 0x0               	(0x28)
>  stab_addr        = 0x0               	(0x30)
>  emergency_sp     = 0xc00000003ffe4000	(0x38)
>  data_offset      = 0xa40000          	(0x40)
>  hw_cpu_id        = 0x9               	(0x50)
>  cpu_start        = 0x1               	(0x52)
>  kexec_state      = 0x0               	(0x53)
>  __current        = 0xc00000007e568680	(0x218)
>  kstack           = 0xc00000007e5a3e30	(0x220)
>  stab_rr          = 0x1a              	(0x228)
>  saved_r1         = 0xc00000007e7cb450	(0x230)
>  trap_save        = 0x0               	(0x240)
>  soft_enabled     = 0x0               	(0x242)
>  irq_happened     = 0x0               	(0x243)
>  io_sync          = 0x0               	(0x244)
>  irq_work_pending = 0x0               	(0x245)
>  nap_state_lost   = 0x0               	(0x246)
> 
> Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
> ---
>  arch/powerpc/xmon/xmon.c |   83 ++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 83 insertions(+)
> 
> diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
> index eab3492..f090c46 100644
> --- a/arch/powerpc/xmon/xmon.c
> +++ b/arch/powerpc/xmon/xmon.c
> @@ -202,6 +202,7 @@ Commands:\n\
>    df	dump float values\n\
>    dd	dump double values\n\
>    dl    dump the kernel log buffer\n\
> +  dp #  dump paca for cpu # (or all)\n\
>    dr	dump stream of raw bytes\n\
>    e	print exception information\n\
>    f	flush cache\n\
> @@ -2008,6 +2009,82 @@ static void xmon_rawdump (unsigned long adrs, long ndump)
>  	printf("\n");
>  }
>  
> +static void dump_one_paca(int cpu)
> +{
> +	struct paca_struct *p;
> +
> +	if (setjmp(bus_error_jmp) != 0) {
> +		printf("*** Error dumping paca for cpu 0x%x!\n", cpu);
> +		return;
> +	}
> +
> +	catch_memory_errors = 1;
> +	sync();
> +
> +	p = &paca[cpu];
> +
> +	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");
> +
> +#define DUMP(name, format) \
> +	printf(" %-*s = %#-*"format"\t(0x%lx)\n", 16, #name, 18, p->name, \
> +		(u64)((void *)&(p->name) - (void *)p));
> +
> +	DUMP(lock_token, "x");
> +	DUMP(paca_index, "x");
> +	DUMP(kernel_toc, "lx");
> +	DUMP(kernelbase, "lx");
> +	DUMP(kernel_msr, "lx");
> +#ifdef CONFIG_PPC_STD_MMU_64
> +	DUMP(stab_real, "lx");
> +	DUMP(stab_addr, "lx");
> +#endif
> +	DUMP(emergency_sp, "p");
> +	DUMP(data_offset, "lx");
> +	DUMP(hw_cpu_id, "x");
> +	DUMP(cpu_start, "x");
> +	DUMP(kexec_state, "x");
> +	DUMP(__current, "p");
> +	DUMP(kstack, "lx");
> +	DUMP(stab_rr, "lx");
> +	DUMP(saved_r1, "lx");
> +	DUMP(trap_save, "x");
> +	DUMP(soft_enabled, "x");
> +	DUMP(irq_happened, "x");
> +	DUMP(io_sync, "x");
> +	DUMP(irq_work_pending, "x");
> +	DUMP(nap_state_lost, "x");
> +
> +#undef DUMP
> +
> +	catch_memory_errors = 0;
> +	sync();
> +}
> +
> +static void dump_pacas(void)
> +{
> +	unsigned long num = ULONG_MAX;
> +	int cpu;
> +
> +	scanhex(&num);
> +	if (num != ULONG_MAX) {
> +		/* NB we allow showing a non-possible paca here */
> +		dump_one_paca(num);
> +		return;
> +	}
> +
> +	if (num_possible_cpus() == 0) {
> +		printf("No possible cpus, use 'dp #' to dump individual cpus\n");
> +		return;
> +	}
> +
> +	for_each_possible_cpu(cpu)
> +		dump_one_paca(cpu);
> +}
> +
>  #define isxdigit(c)	(('0' <= (c) && (c) <= '9') \
>  			 || ('a' <= (c) && (c) <= 'f') \
>  			 || ('A' <= (c) && (c) <= 'F'))
> @@ -2017,6 +2094,12 @@ dump(void)
>  	int c;
>  
>  	c = inchar();
> +
> +	if (c == 'p') {
> +		dump_pacas();
> +		return;
> +	}
> +
>  	if ((isxdigit(c) && c != 'f' && c != 'd') || c == '\n')
>  		termch = c;
>  	scanhex((void *)&adrs);

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] powerpc: Add an xmon command to dump one or all pacas
  2012-09-12  7:52 [PATCH] powerpc: Add an xmon command to dump one or all pacas Michael Ellerman
  2012-09-12  8:45 ` Benjamin Herrenschmidt
@ 2012-09-12 11:07 ` Stephen Rothwell
  2012-09-14  4:45   ` Michael Ellerman
  1 sibling, 1 reply; 9+ messages in thread
From: Stephen Rothwell @ 2012-09-12 11:07 UTC (permalink / raw)
  To: Michael Ellerman; +Cc: linuxppc-dev

[-- Attachment #1: Type: text/plain, Size: 477 bytes --]

Hi Michael,

On Wed, 12 Sep 2012 17:52:40 +1000 Michael Ellerman <michael@ellerman.id.au> wrote:
>
> +#define DUMP(name, format) \
> +	printf(" %-*s = %#-*"format"\t(0x%lx)\n", 16, #name, 18, p->name, \
> +		(u64)((void *)&(p->name) - (void *)p));

I must say that I hate macros that reference (assumed) globals and
shouldn't you use offsetof(struct paca_struct, name) (from
linux/stddef.h)?

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au

[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] powerpc: Add an xmon command to dump one or all pacas
  2012-09-12  8:45 ` Benjamin Herrenschmidt
@ 2012-09-14  4:44   ` Michael Ellerman
  2012-09-14  5:45     ` Benjamin Herrenschmidt
  0 siblings, 1 reply; 9+ messages in thread
From: Michael Ellerman @ 2012-09-14  4:44 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: linuxppc-dev

On Wed, 2012-09-12 at 18:45 +1000, Benjamin Herrenschmidt wrote:
> On Wed, 2012-09-12 at 17:52 +1000, Michael Ellerman wrote:
> > This was originally motivated by a desire to see the mapping between
> > logical and hardware cpu numbers.
> > 
> > But it seemed that it made more sense to just add a command to dump
> > (most of) the paca.
> > 
> > With no arguments "dp" will dump the paca for all possible cpus. If
> > there are no possible cpus, like early in boot, it will tell you that.
> 
> I'd rather "dp" dump the paca for the current active CPU in xmon.
> Shouldn't be hard to make a "dpa" that dumps them all too.

OK.

I also want to be able to dump the paca of a cpu not in xmon, so I'll
keep the "dp #" variant as well.

cheers

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] powerpc: Add an xmon command to dump one or all pacas
  2012-09-12 11:07 ` Stephen Rothwell
@ 2012-09-14  4:45   ` Michael Ellerman
  0 siblings, 0 replies; 9+ messages in thread
From: Michael Ellerman @ 2012-09-14  4:45 UTC (permalink / raw)
  To: Stephen Rothwell; +Cc: linuxppc-dev

On Wed, 2012-09-12 at 21:07 +1000, Stephen Rothwell wrote:
> Hi Michael,
> 
> On Wed, 12 Sep 2012 17:52:40 +1000 Michael Ellerman <michael@ellerman.id.au> wrote:
> >
> > +#define DUMP(name, format) \
> > +	printf(" %-*s = %#-*"format"\t(0x%lx)\n", 16, #name, 18, p->name, \
> > +		(u64)((void *)&(p->name) - (void *)p));
> 
> I must say that I hate macros that reference (assumed) globals 

Well sure, but it's xmon :)

I can change it to take p as a parameter.

> shouldn't you use offsetof(struct paca_struct, name) (from
> linux/stddef.h)?

Yes!

cheers

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] powerpc: Add an xmon command to dump one or all pacas
  2012-09-14  4:44   ` Michael Ellerman
@ 2012-09-14  5:45     ` Benjamin Herrenschmidt
  0 siblings, 0 replies; 9+ messages in thread
From: Benjamin Herrenschmidt @ 2012-09-14  5:45 UTC (permalink / raw)
  To: Michael Ellerman; +Cc: linuxppc-dev

On Fri, 2012-09-14 at 14:44 +1000, Michael Ellerman wrote:
> On Wed, 2012-09-12 at 18:45 +1000, Benjamin Herrenschmidt wrote:
> > On Wed, 2012-09-12 at 17:52 +1000, Michael Ellerman wrote:
> > > This was originally motivated by a desire to see the mapping between
> > > logical and hardware cpu numbers.
> > > 
> > > But it seemed that it made more sense to just add a command to dump
> > > (most of) the paca.
> > > 
> > > With no arguments "dp" will dump the paca for all possible cpus. If
> > > there are no possible cpus, like early in boot, it will tell you that.
> > 
> > I'd rather "dp" dump the paca for the current active CPU in xmon.
> > Shouldn't be hard to make a "dpa" that dumps them all too.
> 
> OK.
> 
> I also want to be able to dump the paca of a cpu not in xmon, so I'll
> keep the "dp #" variant as well.

Yes, absolutely.

Cheers,
Ben.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH] powerpc: Add an xmon command to dump one or all pacas
@ 2012-09-14  9:01 Michael Ellerman
  0 siblings, 0 replies; 9+ messages in thread
From: Michael Ellerman @ 2012-09-14  9:01 UTC (permalink / raw)
  To: linuxppc-dev

This was originally motivated by a desire to see the mapping between
logical and hardware cpu numbers.

But it seemed that it made more sense to just add a command to dump
(most of) the paca.

With no arguments "dp" will dump the paca for the current cpu.

It also takes an argument, eg. "dp 3" which is the logical cpu number
in hex. This form does not check if the cpu is possible, but displays
the paca regardless, as well as the cpu's state in the possible, present
and online masks.

Thirdly, "dpa" will display the paca for all possible cpus. If there are
no possible cpus, like early in boot, it will tell you that.

Sample output, number in brackets is the offset into the struct:

2:mon> dp 3
paca for cpu 0x3 @ c00000000ff20a80:
 possible         = yes
 present          = yes
 online           = yes
 lock_token       = 0x8000            	(0x8)
 paca_index       = 0x3               	(0xa)
 kernel_toc       = 0xc00000000144f990	(0x10)
 kernelbase       = 0xc000000000000000	(0x18)
 kernel_msr       = 0xb000000000001032	(0x20)
 stab_real        = 0x0               	(0x28)
 stab_addr        = 0x0               	(0x30)
 emergency_sp     = 0xc00000003ffe4000	(0x38)
 data_offset      = 0xa40000          	(0x40)
 hw_cpu_id        = 0x9               	(0x50)
 cpu_start        = 0x1               	(0x52)
 kexec_state      = 0x0               	(0x53)
 __current        = 0xc00000007e568680	(0x218)
 kstack           = 0xc00000007e5a3e30	(0x220)
 stab_rr          = 0x1a              	(0x228)
 saved_r1         = 0xc00000007e7cb450	(0x230)
 trap_save        = 0x0               	(0x240)
 soft_enabled     = 0x0               	(0x242)
 irq_happened     = 0x0               	(0x243)
 io_sync          = 0x0               	(0x244)
 irq_work_pending = 0x0               	(0x245)
 nap_state_lost   = 0x0               	(0x246)

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>

---

v3: Fix 32-bit build :}

v2: Fix macro per sfr's comments. Change dp to show current cpu's paca,
    and add dpa to show all.
---
 arch/powerpc/xmon/xmon.c |  105 +++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 104 insertions(+), 1 deletion(-)

diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
index 9b49c65..d5ae12b 100644
--- a/arch/powerpc/xmon/xmon.c
+++ b/arch/powerpc/xmon/xmon.c
@@ -202,7 +202,13 @@ Commands:\n\
   di	dump instructions\n\
   df	dump float values\n\
   dd	dump double values\n\
-  dl    dump the kernel log buffer\n\
+  dl    dump the kernel log buffer\n"
+#ifdef CONFIG_PPC64
+  "\
+  dp[#]	dump paca for current cpu, or cpu #\n\
+  dpa	dump paca for all possible cpus\n"
+#endif
+  "\
   dr	dump stream of raw bytes\n\
   e	print exception information\n\
   f	flush cache\n\
@@ -2009,6 +2015,95 @@ static void xmon_rawdump (unsigned long adrs, long ndump)
 	printf("\n");
 }
 
+#ifdef CONFIG_PPC64
+static void dump_one_paca(int cpu)
+{
+	struct paca_struct *p;
+
+	if (setjmp(bus_error_jmp) != 0) {
+		printf("*** Error dumping paca for cpu 0x%x!\n", cpu);
+		return;
+	}
+
+	catch_memory_errors = 1;
+	sync();
+
+	p = &paca[cpu];
+
+	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");
+
+#define DUMP(paca, name, format) \
+	printf(" %-*s = %#-*"format"\t(0x%lx)\n", 16, #name, 18, paca->name, \
+		offsetof(struct paca_struct, name));
+
+	DUMP(p, lock_token, "x");
+	DUMP(p, paca_index, "x");
+	DUMP(p, kernel_toc, "lx");
+	DUMP(p, kernelbase, "lx");
+	DUMP(p, kernel_msr, "lx");
+#ifdef CONFIG_PPC_STD_MMU_64
+	DUMP(p, stab_real, "lx");
+	DUMP(p, stab_addr, "lx");
+#endif
+	DUMP(p, emergency_sp, "p");
+	DUMP(p, data_offset, "lx");
+	DUMP(p, hw_cpu_id, "x");
+	DUMP(p, cpu_start, "x");
+	DUMP(p, kexec_state, "x");
+	DUMP(p, __current, "p");
+	DUMP(p, kstack, "lx");
+	DUMP(p, stab_rr, "lx");
+	DUMP(p, saved_r1, "lx");
+	DUMP(p, trap_save, "x");
+	DUMP(p, soft_enabled, "x");
+	DUMP(p, irq_happened, "x");
+	DUMP(p, io_sync, "x");
+	DUMP(p, irq_work_pending, "x");
+	DUMP(p, nap_state_lost, "x");
+
+#undef DUMP
+
+	catch_memory_errors = 0;
+	sync();
+}
+
+static void dump_all_pacas(void)
+{
+	int cpu;
+
+	if (num_possible_cpus() == 0) {
+		printf("No possible cpus, use 'dp #' to dump individual cpus\n");
+		return;
+	}
+
+	for_each_possible_cpu(cpu)
+		dump_one_paca(cpu);
+}
+
+static void dump_pacas(void)
+{
+	unsigned long num;
+	int c;
+
+	c = inchar();
+	if (c == 'a') {
+		dump_all_pacas();
+		return;
+	}
+
+	termch = c;	/* Put c back, it wasn't 'a' */
+
+	if (scanhex(&num))
+		dump_one_paca(num);
+	else
+		dump_one_paca(xmon_owner);
+}
+#endif
+
 #define isxdigit(c)	(('0' <= (c) && (c) <= '9') \
 			 || ('a' <= (c) && (c) <= 'f') \
 			 || ('A' <= (c) && (c) <= 'F'))
@@ -2018,6 +2113,14 @@ dump(void)
 	int c;
 
 	c = inchar();
+
+#ifdef CONFIG_PPC64
+	if (c == 'p') {
+		dump_pacas();
+		return;
+	}
+#endif
+
 	if ((isxdigit(c) && c != 'f' && c != 'd') || c == '\n')
 		termch = c;
 	scanhex((void *)&adrs);
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH] powerpc: Add an xmon command to dump one or all pacas
  2012-09-14  6:03 Michael Ellerman
@ 2012-09-14  8:59 ` Michael Ellerman
  0 siblings, 0 replies; 9+ messages in thread
From: Michael Ellerman @ 2012-09-14  8:59 UTC (permalink / raw)
  To: linuxppc-dev

On Fri, 2012-09-14 at 16:03 +1000, Michael Ellerman wrote:
> This was originally motivated by a desire to see the mapping between
> logical and hardware cpu numbers.

Thanks to everyone who reminded me that the paca is 64-bit only :)

New patch on the way.

cheers

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH] powerpc: Add an xmon command to dump one or all pacas
@ 2012-09-14  6:03 Michael Ellerman
  2012-09-14  8:59 ` Michael Ellerman
  0 siblings, 1 reply; 9+ messages in thread
From: Michael Ellerman @ 2012-09-14  6:03 UTC (permalink / raw)
  To: linuxppc-dev

This was originally motivated by a desire to see the mapping between
logical and hardware cpu numbers.

But it seemed that it made more sense to just add a command to dump
(most of) the paca.

With no arguments "dp" will dump the paca for the current cpu.

It also takes an argument, eg. "dp 3" which is the logical cpu number
in hex. This form does not check if the cpu is possible, but displays
the paca regardless, as well as the cpu's state in the possible, present
and online masks.

Thirdly, "dpa" will display the paca for all possible cpus. If there are
no possible cpus, like early in boot, it will tell you that.

Sample output, number in brackets is the offset into the struct:

2:mon> dp 3
paca for cpu 0x3 @ c00000000ff20a80:
 possible         = yes
 present          = yes
 online           = yes
 lock_token       = 0x8000            	(0x8)
 paca_index       = 0x3               	(0xa)
 kernel_toc       = 0xc00000000144f990	(0x10)
 kernelbase       = 0xc000000000000000	(0x18)
 kernel_msr       = 0xb000000000001032	(0x20)
 stab_real        = 0x0               	(0x28)
 stab_addr        = 0x0               	(0x30)
 emergency_sp     = 0xc00000003ffe4000	(0x38)
 data_offset      = 0xa40000          	(0x40)
 hw_cpu_id        = 0x9               	(0x50)
 cpu_start        = 0x1               	(0x52)
 kexec_state      = 0x0               	(0x53)
 __current        = 0xc00000007e568680	(0x218)
 kstack           = 0xc00000007e5a3e30	(0x220)
 stab_rr          = 0x1a              	(0x228)
 saved_r1         = 0xc00000007e7cb450	(0x230)
 trap_save        = 0x0               	(0x240)
 soft_enabled     = 0x0               	(0x242)
 irq_happened     = 0x0               	(0x243)
 io_sync          = 0x0               	(0x244)
 irq_work_pending = 0x0               	(0x245)
 nap_state_lost   = 0x0               	(0x246)

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>

---

v2: Fix macro per sfr's comments. Change dp to show current cpu's paca,
    and add dpa to show all.
---
 arch/powerpc/xmon/xmon.c |   95 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 95 insertions(+)

diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
index 9b49c65..2a2339f 100644
--- a/arch/powerpc/xmon/xmon.c
+++ b/arch/powerpc/xmon/xmon.c
@@ -203,6 +203,8 @@ Commands:\n\
   df	dump float values\n\
   dd	dump double values\n\
   dl    dump the kernel log buffer\n\
+  dp[#]	dump paca for current cpu, or cpu #\n\
+  dpa	dump paca for all possible cpus\n\
   dr	dump stream of raw bytes\n\
   e	print exception information\n\
   f	flush cache\n\
@@ -2009,6 +2011,93 @@ static void xmon_rawdump (unsigned long adrs, long ndump)
 	printf("\n");
 }
 
+static void dump_one_paca(int cpu)
+{
+	struct paca_struct *p;
+
+	if (setjmp(bus_error_jmp) != 0) {
+		printf("*** Error dumping paca for cpu 0x%x!\n", cpu);
+		return;
+	}
+
+	catch_memory_errors = 1;
+	sync();
+
+	p = &paca[cpu];
+
+	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");
+
+#define DUMP(paca, name, format) \
+	printf(" %-*s = %#-*"format"\t(0x%lx)\n", 16, #name, 18, paca->name, \
+		offsetof(struct paca_struct, name));
+
+	DUMP(p, lock_token, "x");
+	DUMP(p, paca_index, "x");
+	DUMP(p, kernel_toc, "lx");
+	DUMP(p, kernelbase, "lx");
+	DUMP(p, kernel_msr, "lx");
+#ifdef CONFIG_PPC_STD_MMU_64
+	DUMP(p, stab_real, "lx");
+	DUMP(p, stab_addr, "lx");
+#endif
+	DUMP(p, emergency_sp, "p");
+	DUMP(p, data_offset, "lx");
+	DUMP(p, hw_cpu_id, "x");
+	DUMP(p, cpu_start, "x");
+	DUMP(p, kexec_state, "x");
+	DUMP(p, __current, "p");
+	DUMP(p, kstack, "lx");
+	DUMP(p, stab_rr, "lx");
+	DUMP(p, saved_r1, "lx");
+	DUMP(p, trap_save, "x");
+	DUMP(p, soft_enabled, "x");
+	DUMP(p, irq_happened, "x");
+	DUMP(p, io_sync, "x");
+	DUMP(p, irq_work_pending, "x");
+	DUMP(p, nap_state_lost, "x");
+
+#undef DUMP
+
+	catch_memory_errors = 0;
+	sync();
+}
+
+static void dump_all_pacas(void)
+{
+	int cpu;
+
+	if (num_possible_cpus() == 0) {
+		printf("No possible cpus, use 'dp #' to dump individual cpus\n");
+		return;
+	}
+
+	for_each_possible_cpu(cpu)
+		dump_one_paca(cpu);
+}
+
+static void dump_pacas(void)
+{
+	unsigned long num;
+	int c;
+
+	c = inchar();
+	if (c == 'a') {
+		dump_all_pacas();
+		return;
+	}
+
+	termch = c;	/* Put c back, it wasn't 'a' */
+
+	if (scanhex(&num))
+		dump_one_paca(num);
+	else
+		dump_one_paca(xmon_owner);
+}
+
 #define isxdigit(c)	(('0' <= (c) && (c) <= '9') \
 			 || ('a' <= (c) && (c) <= 'f') \
 			 || ('A' <= (c) && (c) <= 'F'))
@@ -2018,6 +2107,12 @@ dump(void)
 	int c;
 
 	c = inchar();
+
+	if (c == 'p') {
+		dump_pacas();
+		return;
+	}
+
 	if ((isxdigit(c) && c != 'f' && c != 'd') || c == '\n')
 		termch = c;
 	scanhex((void *)&adrs);
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2012-09-14  9:01 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-09-12  7:52 [PATCH] powerpc: Add an xmon command to dump one or all pacas Michael Ellerman
2012-09-12  8:45 ` Benjamin Herrenschmidt
2012-09-14  4:44   ` Michael Ellerman
2012-09-14  5:45     ` Benjamin Herrenschmidt
2012-09-12 11:07 ` Stephen Rothwell
2012-09-14  4:45   ` Michael Ellerman
2012-09-14  6:03 Michael Ellerman
2012-09-14  8:59 ` Michael Ellerman
2012-09-14  9:01 Michael Ellerman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).