linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: Michael Ellerman <michael@ellerman.id.au>
Cc: linuxppc-dev@ozlabs.org
Subject: Re: [PATCH] powerpc: Add an xmon command to dump one or all pacas
Date: Wed, 12 Sep 2012 18:45:41 +1000	[thread overview]
Message-ID: <1347439541.2603.100.camel@pasglop> (raw)
In-Reply-To: <1347436360-29095-1-git-send-email-michael@ellerman.id.au>

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);

  reply	other threads:[~2012-09-12  8:45 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 [this message]
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
  -- strict thread matches above, loose matches on Subject: below --
2012-09-14  6:03 Michael Ellerman
2012-09-14  8:59 ` Michael Ellerman
2012-09-14  9:01 Michael Ellerman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1347439541.2603.100.camel@pasglop \
    --to=benh@kernel.crashing.org \
    --cc=linuxppc-dev@ozlabs.org \
    --cc=michael@ellerman.id.au \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).