xref: /openbmc/linux/arch/mips/lib/r3k_dump_tlb.c (revision 40df3831)
14becef1dSAtsushi Nemoto /*
24becef1dSAtsushi Nemoto  * Dump R3000 TLB for debugging purposes.
34becef1dSAtsushi Nemoto  *
44becef1dSAtsushi Nemoto  * Copyright (C) 1994, 1995 by Waldorf Electronics, written by Ralf Baechle.
54becef1dSAtsushi Nemoto  * Copyright (C) 1999 by Silicon Graphics, Inc.
64becef1dSAtsushi Nemoto  * Copyright (C) 1999 by Harald Koerfgen
74becef1dSAtsushi Nemoto  */
84becef1dSAtsushi Nemoto #include <linux/kernel.h>
94becef1dSAtsushi Nemoto #include <linux/mm.h>
104becef1dSAtsushi Nemoto 
114becef1dSAtsushi Nemoto #include <asm/mipsregs.h>
124becef1dSAtsushi Nemoto #include <asm/page.h>
134becef1dSAtsushi Nemoto #include <asm/pgtable.h>
1440df3831SAtsushi Nemoto #include <asm/tlbdebug.h>
154becef1dSAtsushi Nemoto 
164becef1dSAtsushi Nemoto extern int r3k_have_wired_reg;	/* defined in tlb-r3k.c */
174becef1dSAtsushi Nemoto 
1869ed25b8SAtsushi Nemoto static void dump_tlb(int first, int last)
194becef1dSAtsushi Nemoto {
204becef1dSAtsushi Nemoto 	int	i;
214becef1dSAtsushi Nemoto 	unsigned int asid;
224becef1dSAtsushi Nemoto 	unsigned long entryhi, entrylo0;
234becef1dSAtsushi Nemoto 
244becef1dSAtsushi Nemoto 	asid = read_c0_entryhi() & 0xfc0;
254becef1dSAtsushi Nemoto 
264becef1dSAtsushi Nemoto 	for (i = first; i <= last; i++) {
274becef1dSAtsushi Nemoto 		write_c0_index(i<<8);
284becef1dSAtsushi Nemoto 		__asm__ __volatile__(
294becef1dSAtsushi Nemoto 			".set\tnoreorder\n\t"
304becef1dSAtsushi Nemoto 			"tlbr\n\t"
314becef1dSAtsushi Nemoto 			"nop\n\t"
324becef1dSAtsushi Nemoto 			".set\treorder");
334becef1dSAtsushi Nemoto 		entryhi  = read_c0_entryhi();
344becef1dSAtsushi Nemoto 		entrylo0 = read_c0_entrylo0();
354becef1dSAtsushi Nemoto 
364becef1dSAtsushi Nemoto 		/* Unused entries have a virtual address of KSEG0.  */
374becef1dSAtsushi Nemoto 		if ((entryhi & 0xffffe000) != 0x80000000
384becef1dSAtsushi Nemoto 		    && (entryhi & 0xfc0) == asid) {
394becef1dSAtsushi Nemoto 			/*
404becef1dSAtsushi Nemoto 			 * Only print entries in use
414becef1dSAtsushi Nemoto 			 */
424becef1dSAtsushi Nemoto 			printk("Index: %2d ", i);
434becef1dSAtsushi Nemoto 
444becef1dSAtsushi Nemoto 			printk("va=%08lx asid=%08lx"
454becef1dSAtsushi Nemoto 			       "  [pa=%06lx n=%d d=%d v=%d g=%d]",
464becef1dSAtsushi Nemoto 			       (entryhi & 0xffffe000),
474becef1dSAtsushi Nemoto 			       entryhi & 0xfc0,
484becef1dSAtsushi Nemoto 			       entrylo0 & PAGE_MASK,
494becef1dSAtsushi Nemoto 			       (entrylo0 & (1 << 11)) ? 1 : 0,
504becef1dSAtsushi Nemoto 			       (entrylo0 & (1 << 10)) ? 1 : 0,
514becef1dSAtsushi Nemoto 			       (entrylo0 & (1 << 9)) ? 1 : 0,
524becef1dSAtsushi Nemoto 			       (entrylo0 & (1 << 8)) ? 1 : 0);
534becef1dSAtsushi Nemoto 		}
544becef1dSAtsushi Nemoto 	}
554becef1dSAtsushi Nemoto 	printk("\n");
564becef1dSAtsushi Nemoto 
574becef1dSAtsushi Nemoto 	write_c0_entryhi(asid);
584becef1dSAtsushi Nemoto }
594becef1dSAtsushi Nemoto 
604becef1dSAtsushi Nemoto void dump_tlb_all(void)
614becef1dSAtsushi Nemoto {
624becef1dSAtsushi Nemoto 	dump_tlb(0, current_cpu_data.tlbsize - 1);
634becef1dSAtsushi Nemoto }
64