powerpc: Add xmon function to dump 44x TLB
PATCH 1/1 powerpc: Add xmon function to dump 44x TLB
This adds a function to xmon to dump the content of the 44x processor TLB with a little bit of decoding (but not much).
---
Did that to track down some machine checks I was having while working on PCI support due to 32/64 bits resource screwage.
Useful to see where a given MMIO virtual address really maps to.
arch/powerpc/xmon/xmon.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+)
arch/powerpc/xmon/xmon.c +38 -0
@@ -153,6 +153,10 @@ static const char *getvecname(unsigned lstatic int do_spu_cmd (void ); +#ifdef CONFIG_44x +static void dump_tlb_44x (void ); +#endif +int xmon_no_auto_backtrace;extern void xmon_enter (void );
@@ -231,6 +235,9 @@ Commands:\n\#ifdef CONFIG_PPC_STD_MMU_32 " u dump segment registers\n"#endif +#ifdef CONFIG_44x +" u dump TLB\n" +#endif " ? help\n" " zr reboot\n\ zh halt\n"
@@ -856,6 +863,11 @@ cmds(struct pt_regs *excp)dump_segments ();break ;#endif +#ifdef CONFIG_4xx +case 'u' : +dump_tlb_44x (); +break ; +#endif default :printf ("Unrecognized command: " ); do {
@@ -2581,6 +2593,32 @@ void dump_segments(void) }#endif +#ifdef CONFIG_44x +static void dump_tlb_44x (void ) +{ +int i; + +for (i =0 ; i < PPC44x_TLB_SIZE; i++) { +unsigned long w0,w1,w2; + asmvolatile ("tlbre %0,%1,0" :"=r" (w0) :"r" (i)); + asmvolatile ("tlbre %0,%1,1" :"=r" (w1) :"r" (i)); + asmvolatile ("tlbre %0,%1,2" :"=r" (w2) :"r" (i)); +printf ("[%02x] %08x %08x %08x " , i, w0, w1, w2); +if (w0 & PPC44x_TLB_VALID) { +printf ("V %08x -> %01x%08x %c%c%c%c%c" , + w0 & PPC44x_TLB_EPN_MASK, + w1 & PPC44x_TLB_ERPN_MASK, + w1 & PPC44x_TLB_RPN_MASK, + (w2 & PPC44x_TLB_W) ?'W' :'w' , + (w2 & PPC44x_TLB_I) ?'I' :'i' , + (w2 & PPC44x_TLB_M) ?'M' :'m' , + (w2 & PPC44x_TLB_G) ?'G' :'g' , + (w2 & PPC44x_TLB_E) ?'E' :'e' ); + } +printf ("\n" ); + } +} +#endif /* CONFIG_44x */ void xmon_init (int enable) {#ifdef CONFIG_PPC_ISERIES
arch/powerpc/xmon/xmon.c static const char *getvecname(unsigned l · line 158
Quoted 3 lines
arch/powerpc/xmon/xmon.c +3
-0+#ifdef CONFIG_44x +static void dump_tlb_44x (void ); +#endif
No need to #ifdef this...
arch/powerpc/xmon/xmon.c void dump_segments(void) · line 2598
Quoted 3 lines
arch/powerpc/xmon/xmon.c +3
-0+#ifdef CONFIG_44x +static void dump_tlb_44x (void ) +{
...or this.
Segher
Quoted 11 lines
arch/powerpc/xmon/xmon.c static const char *getvecname(unsigned l · line 158
Quoted 3 lines
arch/powerpc/xmon/xmon.c +3
-0+#ifdef CONFIG_44x +static void dump_tlb_44x (void ); +#endif No need to #ifdef this...
arch/powerpc/xmon/xmon.c void dump_segments(void) · line 2598
Quoted 3 lines
arch/powerpc/xmon/xmon.c +3
-0+#ifdef CONFIG_44x +static void dump_tlb_44x (void ) +{...or this.
Erm actually, that last one would give you a compiler warning ("function defined but not used"), unless you convert the point where it is used to a plain "if" too -- probably not worth it until we have 32-bit multiplatform support :-)
Segher
Quoted 12 lines · Segher Boessenkool
Quoted 11 lines
arch/powerpc/xmon/xmon.c static const char *getvecname(unsigned l · line 158
Quoted 3 lines
arch/powerpc/xmon/xmon.c +3
-0+#ifdef CONFIG_44x +static void dump_tlb_44x (void ); +#endif No need to #ifdef this...
arch/powerpc/xmon/xmon.c void dump_segments(void) · line 2598
Quoted 3 lines
arch/powerpc/xmon/xmon.c +3
-0+#ifdef CONFIG_44x +static void dump_tlb_44x (void ) +{...or this.
Quoted 5 lines
Erm actually, that last one would give you a compiler warning ("function defined but not used"), unless you convert the point where it is used to a plain "if" too -- probably not worth it until we have 32-bit multiplatform
support :-)
We do have multiplatform support but not accross CPU families :-)
Ben.
Quoted 11 lines · Segher Boessenkool
arch/powerpc/xmon/xmon.c static const char *getvecname(unsigned l · line 158
Quoted 3 lines
arch/powerpc/xmon/xmon.c +3
-0+#ifdef CONFIG_44x +static void dump_tlb_44x (void ); +#endif No need to #ifdef this...
arch/powerpc/xmon/xmon.c void dump_segments(void) · line 2598
Quoted 3 lines
arch/powerpc/xmon/xmon.c +3
-0+#ifdef CONFIG_44x +static void dump_tlb_44x (void ) +{...or this.
I don't want to require binutils to understand the 44x TLB ops
Ben.