1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
24becef1dSAtsushi Nemoto /*
34becef1dSAtsushi Nemoto * Dump R3000 TLB for debugging purposes.
44becef1dSAtsushi Nemoto *
54becef1dSAtsushi Nemoto * Copyright (C) 1994, 1995 by Waldorf Electronics, written by Ralf Baechle.
64becef1dSAtsushi Nemoto * Copyright (C) 1999 by Silicon Graphics, Inc.
74becef1dSAtsushi Nemoto * Copyright (C) 1999 by Harald Koerfgen
84becef1dSAtsushi Nemoto */
94becef1dSAtsushi Nemoto #include <linux/kernel.h>
104becef1dSAtsushi Nemoto #include <linux/mm.h>
114becef1dSAtsushi Nemoto
124becef1dSAtsushi Nemoto #include <asm/mipsregs.h>
1380e8bd26SIsamu Mogi #include <asm/mmu_context.h>
144becef1dSAtsushi Nemoto #include <asm/page.h>
1540df3831SAtsushi Nemoto #include <asm/tlbdebug.h>
164becef1dSAtsushi Nemoto
dump_tlb_regs(void)173c865dd9SJames Hogan void dump_tlb_regs(void)
183c865dd9SJames Hogan {
193c865dd9SJames Hogan pr_info("Index : %0x\n", read_c0_index());
203c865dd9SJames Hogan pr_info("EntryHi : %0lx\n", read_c0_entryhi());
213c865dd9SJames Hogan pr_info("EntryLo : %0lx\n", read_c0_entrylo0());
223c865dd9SJames Hogan }
233c865dd9SJames Hogan
dump_tlb(int first,int last)2469ed25b8SAtsushi Nemoto static void dump_tlb(int first, int last)
254becef1dSAtsushi Nemoto {
264becef1dSAtsushi Nemoto int i;
274becef1dSAtsushi Nemoto unsigned int asid;
284edf00a4SPaul Burton unsigned long entryhi, entrylo0, asid_mask;
294becef1dSAtsushi Nemoto
304edf00a4SPaul Burton asid_mask = cpu_asid_mask(¤t_cpu_data);
314edf00a4SPaul Burton asid = read_c0_entryhi() & asid_mask;
324becef1dSAtsushi Nemoto
334becef1dSAtsushi Nemoto for (i = first; i <= last; i++) {
344becef1dSAtsushi Nemoto write_c0_index(i<<8);
354becef1dSAtsushi Nemoto __asm__ __volatile__(
364becef1dSAtsushi Nemoto ".set\tnoreorder\n\t"
374becef1dSAtsushi Nemoto "tlbr\n\t"
384becef1dSAtsushi Nemoto "nop\n\t"
394becef1dSAtsushi Nemoto ".set\treorder");
404becef1dSAtsushi Nemoto entryhi = read_c0_entryhi();
414becef1dSAtsushi Nemoto entrylo0 = read_c0_entrylo0();
424becef1dSAtsushi Nemoto
434becef1dSAtsushi Nemoto /* Unused entries have a virtual address of KSEG0. */
4448269c78SJames Hogan if ((entryhi & PAGE_MASK) != KSEG0 &&
4548269c78SJames Hogan (entrylo0 & R3K_ENTRYLO_G ||
464edf00a4SPaul Burton (entryhi & asid_mask) == asid)) {
474becef1dSAtsushi Nemoto /*
484becef1dSAtsushi Nemoto * Only print entries in use
494becef1dSAtsushi Nemoto */
504becef1dSAtsushi Nemoto printk("Index: %2d ", i);
514becef1dSAtsushi Nemoto
528a98495cSJames Hogan pr_cont("va=%08lx asid=%08lx"
534becef1dSAtsushi Nemoto " [pa=%06lx n=%d d=%d v=%d g=%d]",
54432d9ecbSIsamu Mogi entryhi & PAGE_MASK,
554edf00a4SPaul Burton entryhi & asid_mask,
564becef1dSAtsushi Nemoto entrylo0 & PAGE_MASK,
57d7f5499dSJames Hogan (entrylo0 & R3K_ENTRYLO_N) ? 1 : 0,
58d7f5499dSJames Hogan (entrylo0 & R3K_ENTRYLO_D) ? 1 : 0,
59d7f5499dSJames Hogan (entrylo0 & R3K_ENTRYLO_V) ? 1 : 0,
60d7f5499dSJames Hogan (entrylo0 & R3K_ENTRYLO_G) ? 1 : 0);
614becef1dSAtsushi Nemoto }
624becef1dSAtsushi Nemoto }
634becef1dSAtsushi Nemoto printk("\n");
644becef1dSAtsushi Nemoto
654becef1dSAtsushi Nemoto write_c0_entryhi(asid);
664becef1dSAtsushi Nemoto }
674becef1dSAtsushi Nemoto
dump_tlb_all(void)684becef1dSAtsushi Nemoto void dump_tlb_all(void)
694becef1dSAtsushi Nemoto {
704becef1dSAtsushi Nemoto dump_tlb(0, current_cpu_data.tlbsize - 1);
714becef1dSAtsushi Nemoto }
72