linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] powerpc/xmon: support dumping software pagetables
@ 2017-07-21  5:24 Balbir Singh
  2017-07-21  5:24 ` [PATCH 2/2] powerpc/xmon: revisit SPR support Balbir Singh
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: Balbir Singh @ 2017-07-21  5:24 UTC (permalink / raw)
  To: linuxppc-dev, mpe

It would be nice to be able to dump page tables in a
particular context

Example use cases

Dumping PTE contents to see the keys (useful for debugging)

c0000000ba48c880 c0000000bab438b0   2677   2675 T  2 protection_keys
0:mon> ds c0000000ba48c880 0x7ffff7f70000
translating tsk c0000000ba48c880, addr 7ffff7f70000
G: 0xb95b6400   U: 0xb6334000   M: 0xb6543000   PA: 0x012c0000, PTE: 0xd4800000012c0504

Dumping vmalloc space

0:mon> ds 0 d000000000000000
translating tsk           (null), addr d000000000000000
G: 0x3d450400   U: 0xbc184000   M: 0x3d460000   PA: 0x7e010000, PTE: 0xc08000007e01018e

I did not replicate the complex code of dump_pagetable and have no support
for bolted linear mapping, thats why I've called it software pagetable
dumping support. The format of the PTE can be expanded to add more useful
information about the flags in the PTE if required.

Signed-off-by: Balbir Singh <bsingharora@gmail.com>
---
 arch/powerpc/xmon/xmon.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 97 insertions(+)

diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
index 08e367e..8aedfff 100644
--- a/arch/powerpc/xmon/xmon.c
+++ b/arch/powerpc/xmon/xmon.c
@@ -126,6 +126,7 @@ static void byterev(unsigned char *, int);
 static void memex(void);
 static int bsesc(void);
 static void dump(void);
+static void show_pte(unsigned long);
 static void prdump(unsigned long, long);
 static int ppc_inst_dump(unsigned long, long, int);
 static void dump_log_buf(void);
@@ -233,6 +234,7 @@ Commands:\n\
 #endif
   "\
   dr	dump stream of raw bytes\n\
+  ds	dump software PTEs\n\
   dt	dump the tracing buffers (uses printk)\n\
 "
 #ifdef CONFIG_PPC_POWERNV
@@ -2528,6 +2530,9 @@ dump(void)
 	} else if (c == 't') {
 		ftrace_dump(DUMP_ALL);
 		tracing_on();
+	} else if (c == 's') {
+		/* dump software pte */
+		show_pte(adrs);
 	} else if (c == 'r') {
 		scanhex(&ndump);
 		if (ndump == 0)
@@ -2860,7 +2865,99 @@ static void show_task(struct task_struct *tsk)
 		state, task_thread_info(tsk)->cpu,
 		tsk->comm);
 }
+void format_pte(unsigned long pte)
+{
+	unsigned long pa = pte & PTE_RPN_MASK;
+
+	printf("PA: 0x%08lx, PTE: 0x%08lx\n", pa, pte);
+}
+
+static void show_pte(unsigned long tskv)
+{
+	unsigned long addr = 0;
+	struct task_struct *tsk = NULL;
+	struct mm_struct *mm;
+	pgd_t *pgdp;
+	pud_t *pudp;
+	pmd_t *pmdp;
+	pte_t *ptep;
+
+	tsk = (struct task_struct *)tskv;
+	if (tsk == NULL)
+		mm = &init_mm;
+	else
+		mm = tsk->active_mm;
+
+	if (mm == NULL)
+		mm = &init_mm;
+
+	if (!scanhex(&addr))
+		printf("need address to translate\n");
+
+	if (setjmp(bus_error_jmp) != 0) {
+		catch_memory_errors = 0;
+		printf("*** Error dumping pte for task %p\n", tsk);
+		return;
+	}
+
+	catch_memory_errors = 1;
+	sync();
+
+	if (mm == &init_mm)
+		pgdp = pgd_offset_k(addr);
+	else
+		pgdp = pgd_offset(mm, addr);
+
+	if (pgd_none(*pgdp)) {
+		printf("no linux page table for address\n");
+		return;
+	}
 
+	if (pgd_huge(*pgdp)) {
+		format_pte(pgd_val(*pgdp));
+		return;
+	}
+	printf("G: 0x%8lx\t", pgd_val(*pgdp));
+
+	pudp = pud_offset(pgdp, addr);
+
+	if (pud_none(*pudp)) {
+		printf("No valid PUD\n");
+		return;
+	}
+
+	if (pud_huge(*pudp)) {
+		format_pte(pud_val(*pudp));
+		return;
+	}
+	printf("U: 0x%8lx\t", pud_val(*pudp));
+
+	pmdp = pmd_offset(pudp, addr);
+
+	if (pmd_none(*pmdp)) {
+		printf("No valid PMD\n");
+		return;
+	}
+
+	if (pmd_huge(*pmdp)) {
+		format_pte(pmd_val(*pmdp));
+		return;
+	}
+	printf("M: 0x%8lx\t", pmd_val(*pmdp));
+
+	/* pte_offset_map is the same as pte_offset_kernel */
+	ptep = pte_offset_kernel(pmdp, addr);
+	if (pte_none(*ptep)) {
+		printf("no valid PTE\n");
+		return;
+	}
+
+	format_pte(pte_val(*ptep));
+
+	sync();
+	__delay(200);
+	catch_memory_errors = 0;
+}
 static void show_tasks(void)
 {
 	unsigned long tskv;
-- 
2.9.4

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

* [PATCH 2/2] powerpc/xmon: revisit SPR support
  2017-07-21  5:24 [PATCH 1/2] powerpc/xmon: support dumping software pagetables Balbir Singh
@ 2017-07-21  5:24 ` Balbir Singh
  2017-07-21  6:59 ` [PATCH 1/2] powerpc/xmon: support dumping software pagetables Michael Ellerman
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 6+ messages in thread
From: Balbir Singh @ 2017-07-21  5:24 UTC (permalink / raw)
  To: linuxppc-dev, mpe

This patch readjusts the SPR's adds support for IAMR/AMR
UAMOR/AMOR based on their supported ISA revisions. The
HDEC SPR is now printed with 16 hex digits instead of 8,
so that we can see the expanded values on ISA 300.
There is also support for printing the PIDR/TIDR for
ISA 300 and PSSCR and PTCR in ISA 300 hypervisor mode.

Signed-off-by: Balbir Singh <bsingharora@gmail.com>
---
 arch/powerpc/xmon/xmon.c | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
index 8aedfff..e025a16 100644
--- a/arch/powerpc/xmon/xmon.c
+++ b/arch/powerpc/xmon/xmon.c
@@ -1738,13 +1738,15 @@ static void dump_206_sprs(void)
 		mfspr(SPRN_SRR0), mfspr(SPRN_SRR1), mfspr(SPRN_DSISR));
 	printf("dscr   = %.16x  ppr   = %.16x pir    = %.8x\n",
 		mfspr(SPRN_DSCR), mfspr(SPRN_PPR), mfspr(SPRN_PIR));
+	printf("amr    = %.16x  uamor = %.16x\n",
+		mfspr(SPRN_AMR), mfspr(SPRN_UAMOR));
 
 	if (!(mfmsr() & MSR_HV))
 		return;
 
 	printf("sdr1   = %.16x  hdar  = %.16x hdsisr = %.8x\n",
 		mfspr(SPRN_SDR1), mfspr(SPRN_HDAR), mfspr(SPRN_HDSISR));
-	printf("hsrr0  = %.16x hsrr1  = %.16x hdec = %.8x\n",
+	printf("hsrr0  = %.16x hsrr1  = %.16x hdec = %.16x\n",
 		mfspr(SPRN_HSRR0), mfspr(SPRN_HSRR1), mfspr(SPRN_HDEC));
 	printf("lpcr   = %.16x  pcr   = %.16x lpidr = %.8x\n",
 		mfspr(SPRN_LPCR), mfspr(SPRN_PCR), mfspr(SPRN_LPID));
@@ -1788,6 +1790,7 @@ static void dump_207_sprs(void)
 		mfspr(SPRN_SDAR), mfspr(SPRN_SIER), mfspr(SPRN_PMC6));
 	printf("ebbhr  = %.16x  ebbrr = %.16x bescr  = %.16x\n",
 		mfspr(SPRN_EBBHR), mfspr(SPRN_EBBRR), mfspr(SPRN_BESCR));
+	printf("iamr   = %.16x\n", mfspr(SPRN_IAMR));
 
 	if (!(msr & MSR_HV))
 		return;
@@ -1796,6 +1799,28 @@ static void dump_207_sprs(void)
 		mfspr(SPRN_HFSCR), mfspr(SPRN_DHDES), mfspr(SPRN_RPR));
 	printf("dawr   = %.16x  dawrx = %.16x ciabr  = %.16x\n",
 		mfspr(SPRN_DAWR), mfspr(SPRN_DAWRX), mfspr(SPRN_CIABR));
+	printf("amor   = %.16x\n", mfspr(SPRN_AMOR));
+#endif
+}
+
+static void dump_300_sprs(void)
+{
+#ifdef CONFIG_PPC64
+	unsigned long msr;
+
+	if (!cpu_has_feature(CPU_FTR_ARCH_300))
+		return;
+
+	printf("pidr   = %.16x  tidr  = %.16x asdr   = %.16x\n",
+		mfspr(SPRN_PID), mfspr(SPRN_TIDR), mfspr(SPRN_ASDR));
+
+	msr = mfmsr();
+
+	if (!(msr & MSR_HV))
+		return;
+
+	printf("ptcr   = %.16x  psscr = %.16x\n",
+		mfspr(SPRN_PTCR), mfspr(SPRN_PSSCR));
 #endif
 }
 
@@ -1852,6 +1877,7 @@ static void super_regs(void)
 
 		dump_206_sprs();
 		dump_207_sprs();
+		dump_300_sprs();
 
 		return;
 	}
-- 
2.9.4

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

* Re: [PATCH 1/2] powerpc/xmon: support dumping software pagetables
  2017-07-21  5:24 [PATCH 1/2] powerpc/xmon: support dumping software pagetables Balbir Singh
  2017-07-21  5:24 ` [PATCH 2/2] powerpc/xmon: revisit SPR support Balbir Singh
@ 2017-07-21  6:59 ` Michael Ellerman
  2017-07-21  8:43   ` Balbir Singh
  2017-07-21 17:08 ` Ram Pai
  2017-07-23 14:50 ` kbuild test robot
  3 siblings, 1 reply; 6+ messages in thread
From: Michael Ellerman @ 2017-07-21  6:59 UTC (permalink / raw)
  To: Balbir Singh, linuxppc-dev

Nice !

Balbir Singh <bsingharora@gmail.com> writes:

> It would be nice to be able to dump page tables in a
> particular context
>
> Example use cases
>
> Dumping PTE contents to see the keys (useful for debugging)
>
> c0000000ba48c880 c0000000bab438b0   2677   2675 T  2 protection_keys

What is that ^ ?

> 0:mon> ds c0000000ba48c880 0x7ffff7f70000
> translating tsk c0000000ba48c880, addr 7ffff7f70000
> G: 0xb95b6400   U: 0xb6334000   M: 0xb6543000   PA: 0x012c0000, PTE: 0xd4800000012c0504

Without reading the code I don't grok what G/U/M mean.

Feel free to use more than one line of output :)

> Dumping vmalloc space
>
> 0:mon> ds 0 d000000000000000

I suspect we will want to do that a lot. So I'd rather the arguments
were reversed, and the second (task) can be omitted.

So:
0:mon> ds x	== translate x via init_mm
0:mon> ds x y	== translate x via &y->mm

I guess it's easier for folks to find a task rather than an mm directly?
Otherwise it could take an mm not a task.

> translating tsk           (null), addr d000000000000000

We should special case that to say "using kernel page tables" or similar.

> G: 0x3d450400   U: 0xbc184000   M: 0x3d460000   PA: 0x7e010000, PTE: 0xc08000007e01018e

> I did not replicate the complex code of dump_pagetable and have no support
> for bolted linear mapping, thats why I've called it software pagetable
> dumping support.

Not sure about that naming. On hash it makes sense, but not on radix or
on other platforms.

Maybe 'dv' for dump Virtual address ?

It doesn't dump a PTE, it tries to translate an address into a PTE.

cheers

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

* Re: [PATCH 1/2] powerpc/xmon: support dumping software pagetables
  2017-07-21  6:59 ` [PATCH 1/2] powerpc/xmon: support dumping software pagetables Michael Ellerman
@ 2017-07-21  8:43   ` Balbir Singh
  0 siblings, 0 replies; 6+ messages in thread
From: Balbir Singh @ 2017-07-21  8:43 UTC (permalink / raw)
  To: Michael Ellerman, linuxppc-dev

On Fri, 2017-07-21 at 16:59 +1000, Michael Ellerman wrote:
> Nice !
> 
> Balbir Singh <bsingharora@gmail.com> writes:
> 
> > It would be nice to be able to dump page tables in a
> > particular context
> > 
> > Example use cases
> > 
> > Dumping PTE contents to see the keys (useful for debugging)
> > 
> > c0000000ba48c880 c0000000bab438b0   2677   2675 T  2 protection_keys
> 
> What is that ^ ?


Thats extra, the output of P (print all tasks, I've used that task selection)

> 
> > 0:mon> ds c0000000ba48c880 0x7ffff7f70000
> > translating tsk c0000000ba48c880, addr 7ffff7f70000
> > G: 0xb95b6400   U: 0xb6334000   M: 0xb6543000   PA: 0x012c0000, PTE: 0xd4800000012c0504
> 
> Without reading the code I don't grok what G/U/M mean.

PGD, PUD and PMD, I'll expand on them.

> 
> Feel free to use more than one line of output :)
> 
> > Dumping vmalloc space
> > 
> > 0:mon> ds 0 d000000000000000
> 
> I suspect we will want to do that a lot. So I'd rather the arguments
> were reversed, and the second (task) can be omitted.

I considered that as well, can do

> 
> So:
> 0:mon> ds x	== translate x via init_mm
> 0:mon> ds x y	== translate x via &y->mm
> 
> I guess it's easier for folks to find a task rather than an mm directly?
> Otherwise it could take an mm not a task.
> 

we already have commands for task, via (P), which is why I thought
task makes sense.

> > translating tsk           (null), addr d000000000000000
> 
> We should special case that to say "using kernel page tables" or similar.
> 
> > G: 0x3d450400   U: 0xbc184000   M: 0x3d460000   PA: 0x7e010000, PTE: 0xc08000007e01018e
> > I did not replicate the complex code of dump_pagetable and have no support
> > for bolted linear mapping, thats why I've called it software pagetable
> > dumping support.
> 
> Not sure about that naming. On hash it makes sense, but not on radix or
> on other platforms.
> 
> Maybe 'dv' for dump Virtual address ?
> 
> It doesn't dump a PTE, it tries to translate an address into a PTE.
>

Done, will do a v2

Thanks for the review!
Balbir Singh. 

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

* Re: [PATCH 1/2] powerpc/xmon: support dumping software pagetables
  2017-07-21  5:24 [PATCH 1/2] powerpc/xmon: support dumping software pagetables Balbir Singh
  2017-07-21  5:24 ` [PATCH 2/2] powerpc/xmon: revisit SPR support Balbir Singh
  2017-07-21  6:59 ` [PATCH 1/2] powerpc/xmon: support dumping software pagetables Michael Ellerman
@ 2017-07-21 17:08 ` Ram Pai
  2017-07-23 14:50 ` kbuild test robot
  3 siblings, 0 replies; 6+ messages in thread
From: Ram Pai @ 2017-07-21 17:08 UTC (permalink / raw)
  To: Balbir Singh; +Cc: linuxppc-dev, mpe

On Fri, Jul 21, 2017 at 03:24:05PM +1000, Balbir Singh wrote:
> It would be nice to be able to dump page tables in a
> particular context
> 
> Example use cases
> 
> Dumping PTE contents to see the keys (useful for debugging)
> 
> c0000000ba48c880 c0000000bab438b0   2677   2675 T  2 protection_keys
> 0:mon> ds c0000000ba48c880 0x7ffff7f70000
> translating tsk c0000000ba48c880, addr 7ffff7f70000
> G: 0xb95b6400   U: 0xb6334000   M: 0xb6543000   PA: 0x012c0000, PTE: 0xd4800000012c0504
> 
> Dumping vmalloc space
> 
> 0:mon> ds 0 d000000000000000
> translating tsk           (null), addr d000000000000000
> G: 0x3d450400   U: 0xbc184000   M: 0x3d460000   PA: 0x7e010000, PTE: 0xc08000007e01018e
> 
> I did not replicate the complex code of dump_pagetable and have no support
> for bolted linear mapping, thats why I've called it software pagetable
> dumping support. The format of the PTE can be expanded to add more useful
> information about the flags in the PTE if required.

yes. a nice way of dumping all the flags in the PTE will be handy.
especially; my favorite, protection key values.

> 
> Signed-off-by: Balbir Singh <bsingharora@gmail.com>
> ---
>  arch/powerpc/xmon/xmon.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 97 insertions(+)
> 
> diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
> index 08e367e..8aedfff 100644
> --- a/arch/powerpc/xmon/xmon.c
> +++ b/arch/powerpc/xmon/xmon.c
> @@ -126,6 +126,7 @@ static void byterev(unsigned char *, int);
>  static void memex(void);
>  static int bsesc(void);
>  static void dump(void);
> +static void show_pte(unsigned long);
>  static void prdump(unsigned long, long);
>  static int ppc_inst_dump(unsigned long, long, int);
>  static void dump_log_buf(void);
> @@ -233,6 +234,7 @@ Commands:\n\
>  #endif
>    "\
>    dr	dump stream of raw bytes\n\
> +  ds	dump software PTEs\n\
>    dt	dump the tracing buffers (uses printk)\n\
>  "
>  #ifdef CONFIG_PPC_POWERNV
> @@ -2528,6 +2530,9 @@ dump(void)
>  	} else if (c == 't') {
>  		ftrace_dump(DUMP_ALL);
>  		tracing_on();
> +	} else if (c == 's') {
> +		/* dump software pte */
> +		show_pte(adrs);
>  	} else if (c == 'r') {
>  		scanhex(&ndump);
>  		if (ndump == 0)
> @@ -2860,7 +2865,99 @@ static void show_task(struct task_struct *tsk)
>  		state, task_thread_info(tsk)->cpu,
>  		tsk->comm);
>  }
> +void format_pte(unsigned long pte)
> +{
> +	unsigned long pa = pte & PTE_RPN_MASK;
> +
> +	printf("PA: 0x%08lx, PTE: 0x%08lx\n", pa, pte);
> +}
> +
> +static void show_pte(unsigned long tskv)
> +{
> +	unsigned long addr = 0;
> +	struct task_struct *tsk = NULL;
> +	struct mm_struct *mm;
> +	pgd_t *pgdp;
> +	pud_t *pudp;
> +	pmd_t *pmdp;
> +	pte_t *ptep;
> +
> +	tsk = (struct task_struct *)tskv;
> +	if (tsk == NULL)
> +		mm = &init_mm;
> +	else
> +		mm = tsk->active_mm;
> +
> +	if (mm == NULL)
> +		mm = &init_mm;
> +
> +	if (!scanhex(&addr))
> +		printf("need address to translate\n");
> +
> +	if (setjmp(bus_error_jmp) != 0) {
> +		catch_memory_errors = 0;
> +		printf("*** Error dumping pte for task %p\n", tsk);
> +		return;
> +	}
> +
> +	catch_memory_errors = 1;
> +	sync();
> +
> +	if (mm == &init_mm)
> +		pgdp = pgd_offset_k(addr);
> +	else
> +		pgdp = pgd_offset(mm, addr);
> +
> +	if (pgd_none(*pgdp)) {
> +		printf("no linux page table for address\n");
> +		return;
> +	}
> 
> +	if (pgd_huge(*pgdp)) {
> +		format_pte(pgd_val(*pgdp));
> +		return;
> +	}
> +	printf("G: 0x%8lx\t", pgd_val(*pgdp));
> +
> +	pudp = pud_offset(pgdp, addr);
> +
> +	if (pud_none(*pudp)) {
> +		printf("No valid PUD\n");
> +		return;
> +	}
> +
> +	if (pud_huge(*pudp)) {
> +		format_pte(pud_val(*pudp));
> +		return;
> +	}
> +	printf("U: 0x%8lx\t", pud_val(*pudp));
> +
> +	pmdp = pmd_offset(pudp, addr);
> +
> +	if (pmd_none(*pmdp)) {
> +		printf("No valid PMD\n");
> +		return;
> +	}
> +
> +	if (pmd_huge(*pmdp)) {
> +		format_pte(pmd_val(*pmdp));
> +		return;
> +	}
> +	printf("M: 0x%8lx\t", pmd_val(*pmdp));
> +
> +	/* pte_offset_map is the same as pte_offset_kernel */
> +	ptep = pte_offset_kernel(pmdp, addr);
> +	if (pte_none(*ptep)) {
> +		printf("no valid PTE\n");
> +		return;
> +	}
> +
> +	format_pte(pte_val(*ptep));
> +

These two lines below always go togather. A nice macro
#define sync_delay() { sync(); __delay(200); }
can help.

> +	sync();
> +	__delay(200);


> +	catch_memory_errors = 0;


> +}
>  static void show_tasks(void)
>  {
>  	unsigned long tskv;
> -- 
> 2.9.4

-- 
Ram Pai

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

* Re: [PATCH 1/2] powerpc/xmon: support dumping software pagetables
  2017-07-21  5:24 [PATCH 1/2] powerpc/xmon: support dumping software pagetables Balbir Singh
                   ` (2 preceding siblings ...)
  2017-07-21 17:08 ` Ram Pai
@ 2017-07-23 14:50 ` kbuild test robot
  3 siblings, 0 replies; 6+ messages in thread
From: kbuild test robot @ 2017-07-23 14:50 UTC (permalink / raw)
  To: Balbir Singh; +Cc: kbuild-all, linuxppc-dev, mpe

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

Hi Balbir,

[auto build test ERROR on powerpc/next]
[also build test ERROR on v4.13-rc1 next-20170721]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Balbir-Singh/powerpc-xmon-support-dumping-software-pagetables/20170723-002848
base:   https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next
config: powerpc-akebono_defconfig (attached as .config)
compiler: powerpc-linux-gnu-gcc (Debian 6.1.1-9) 6.1.1 20160705
reproduce:
        wget https://raw.githubusercontent.com/01org/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=powerpc 

All errors (new ones prefixed by >>):

   arch/powerpc/xmon/xmon.c: In function 'show_pte':
>> arch/powerpc/xmon/xmon.c:2929:6: error: implicit declaration of function 'pud_huge' [-Werror=implicit-function-declaration]
     if (pud_huge(*pudp)) {
         ^~~~~~~~
>> arch/powerpc/xmon/xmon.c:2942:6: error: implicit declaration of function 'pmd_huge' [-Werror=implicit-function-declaration]
     if (pmd_huge(*pmdp)) {
         ^~~~~~~~
   cc1: all warnings being treated as errors

vim +/pud_huge +2929 arch/powerpc/xmon/xmon.c

  2874	
  2875	static void show_pte(unsigned long tskv)
  2876	{
  2877		unsigned long addr = 0;
  2878		struct task_struct *tsk = NULL;
  2879		struct mm_struct *mm;
  2880		pgd_t *pgdp;
  2881		pud_t *pudp;
  2882		pmd_t *pmdp;
  2883		pte_t *ptep;
  2884	
  2885		tsk = (struct task_struct *)tskv;
  2886		if (tsk == NULL)
  2887			mm = &init_mm;
  2888		else
  2889			mm = tsk->active_mm;
  2890	
  2891		if (mm == NULL)
  2892			mm = &init_mm;
  2893	
  2894		if (!scanhex(&addr))
  2895			printf("need address to translate\n");
  2896	
  2897		if (setjmp(bus_error_jmp) != 0) {
  2898			catch_memory_errors = 0;
  2899			printf("*** Error dumping pte for task %p\n", tsk);
  2900			return;
  2901		}
  2902	
  2903		catch_memory_errors = 1;
  2904		sync();
  2905	
  2906		if (mm == &init_mm)
  2907			pgdp = pgd_offset_k(addr);
  2908		else
  2909			pgdp = pgd_offset(mm, addr);
  2910	
  2911		if (pgd_none(*pgdp)) {
  2912			printf("no linux page table for address\n");
  2913			return;
  2914		}
  2915	
  2916		if (pgd_huge(*pgdp)) {
  2917			format_pte(pgd_val(*pgdp));
  2918			return;
  2919		}
  2920		printf("G: 0x%8lx\t", pgd_val(*pgdp));
  2921	
  2922		pudp = pud_offset(pgdp, addr);
  2923	
  2924		if (pud_none(*pudp)) {
  2925			printf("No valid PUD\n");
  2926			return;
  2927		}
  2928	
> 2929		if (pud_huge(*pudp)) {
  2930			format_pte(pud_val(*pudp));
  2931			return;
  2932		}
  2933		printf("U: 0x%8lx\t", pud_val(*pudp));
  2934	
  2935		pmdp = pmd_offset(pudp, addr);
  2936	
  2937		if (pmd_none(*pmdp)) {
  2938			printf("No valid PMD\n");
  2939			return;
  2940		}
  2941	
> 2942		if (pmd_huge(*pmdp)) {
  2943			format_pte(pmd_val(*pmdp));
  2944			return;
  2945		}
  2946		printf("M: 0x%8lx\t", pmd_val(*pmdp));
  2947	
  2948		/* pte_offset_map is the same as pte_offset_kernel */
  2949		ptep = pte_offset_kernel(pmdp, addr);
  2950		if (pte_none(*ptep)) {
  2951			printf("no valid PTE\n");
  2952			return;
  2953		}
  2954	
  2955		format_pte(pte_val(*ptep));
  2956	
  2957		sync();
  2958		__delay(200);
  2959		catch_memory_errors = 0;
  2960	}
  2961	static void show_tasks(void)
  2962	{
  2963		unsigned long tskv;
  2964		struct task_struct *tsk = NULL;
  2965	
  2966		printf("     task_struct     ->thread.ksp    PID   PPID S  P CMD\n");
  2967	
  2968		if (scanhex(&tskv))
  2969			tsk = (struct task_struct *)tskv;
  2970	
  2971		if (setjmp(bus_error_jmp) != 0) {
  2972			catch_memory_errors = 0;
  2973			printf("*** Error dumping task %p\n", tsk);
  2974			return;
  2975		}
  2976	
  2977		catch_memory_errors = 1;
  2978		sync();
  2979	
  2980		if (tsk)
  2981			show_task(tsk);
  2982		else
  2983			for_each_process(tsk)
  2984				show_task(tsk);
  2985	
  2986		sync();
  2987		__delay(200);
  2988		catch_memory_errors = 0;
  2989	}
  2990	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 15731 bytes --]

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

end of thread, other threads:[~2017-07-23 14:51 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-07-21  5:24 [PATCH 1/2] powerpc/xmon: support dumping software pagetables Balbir Singh
2017-07-21  5:24 ` [PATCH 2/2] powerpc/xmon: revisit SPR support Balbir Singh
2017-07-21  6:59 ` [PATCH 1/2] powerpc/xmon: support dumping software pagetables Michael Ellerman
2017-07-21  8:43   ` Balbir Singh
2017-07-21 17:08 ` Ram Pai
2017-07-23 14:50 ` kbuild test robot

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