2 * Dump R3000 TLB for debugging purposes.
4 * Copyright (C) 1994, 1995 by Waldorf Electronics, written by Ralf Baechle.
5 * Copyright (C) 1999 by Silicon Graphics, Inc.
6 * Copyright (C) 1999 by Harald Koerfgen
8 #include <linux/kernel.h>
10 #include <linux/sched.h>
11 #include <linux/string.h>
13 #include <asm/bootinfo.h>
14 #include <asm/cachectl.h>
15 #include <asm/mipsregs.h>
17 #include <asm/pgtable.h>
19 #define mips_tlb_entries 64
22 dump_tlb(int first
, int last
)
26 unsigned long entryhi
, entrylo0
;
28 asid
= get_entryhi() & 0xfc0;
30 for(i
=first
;i
<=last
;i
++)
32 write_32bit_cp0_register(CP0_INDEX
, i
<<8);
38 entryhi
= read_32bit_cp0_register(CP0_ENTRYHI
);
39 entrylo0
= read_32bit_cp0_register(CP0_ENTRYLO0
);
41 /* Unused entries have a virtual address of KSEG0. */
42 if ((entryhi
& 0xffffe000) != 0x80000000
43 && (entryhi
& 0xfc0) == asid
) {
45 * Only print entries in use
47 printk("Index: %2d ", i
);
49 printk("va=%08lx asid=%08lx"
50 " [pa=%06lx n=%d d=%d v=%d g=%d]",
51 (entryhi
& 0xffffe000),
54 (entrylo0
& (1 << 11)) ? 1 : 0,
55 (entrylo0
& (1 << 10)) ? 1 : 0,
56 (entrylo0
& (1 << 9)) ? 1 : 0,
57 (entrylo0
& (1 << 8)) ? 1 : 0);
68 dump_tlb(0, mips_tlb_entries
- 1);
76 printk("Wired: %d", wired
);
77 dump_tlb(0, read_32bit_cp0_register(CP0_WIRED
));
81 dump_tlb_addr(unsigned long addr
)
83 unsigned int flags
, oldpid
;
86 __save_and_cli(flags
);
87 oldpid
= get_entryhi() & 0xff;
88 set_entryhi((addr
& PAGE_MASK
) | oldpid
);
92 __restore_flags(flags
);
95 printk("No entry for address 0x%08lx in TLB\n", addr
);
99 printk("Entry %d maps address 0x%08lx\n", index
, addr
);
100 dump_tlb(index
, index
);
104 dump_tlb_nonwired(void)
106 dump_tlb(8, mips_tlb_entries
- 1);
110 dump_list_process(struct task_struct
*t
, void *address
)
112 pgd_t
*page_dir
, *pgd
;
118 addr
= (unsigned int) address
;
120 printk("Addr == %08x\n", addr
);
121 printk("tasks->mm.pgd == %08x\n", (unsigned int) t
->mm
->pgd
);
123 page_dir
= pgd_offset(t
->mm
, 0);
124 printk("page_dir == %08x\n", (unsigned int) page_dir
);
126 pgd
= pgd_offset(t
->mm
, addr
);
127 printk("pgd == %08x, ", (unsigned int) pgd
);
129 pmd
= pmd_offset(pgd
, addr
);
130 printk("pmd == %08x, ", (unsigned int) pmd
);
132 pte
= pte_offset(pmd
, addr
);
133 printk("pte == %08x, ", (unsigned int) pte
);
136 printk("page == %08x\n", (unsigned int) pte_val(page
));
139 if (val
& _PAGE_PRESENT
) printk("present ");
140 if (val
& _PAGE_READ
) printk("read ");
141 if (val
& _PAGE_WRITE
) printk("write ");
142 if (val
& _PAGE_ACCESSED
) printk("accessed ");
143 if (val
& _PAGE_MODIFIED
) printk("modified ");
144 if (val
& _PAGE_GLOBAL
) printk("global ");
145 if (val
& _PAGE_VALID
) printk("valid ");
150 dump_list_current(void *address
)
152 dump_list_process(current
, address
);
161 unsigned int addr
, paddr
;
163 addr
= (unsigned long) address
;
164 pgd
= pgd_offset(current
->mm
, addr
);
165 pmd
= pmd_offset(pgd
, addr
);
166 pte
= pte_offset(pmd
, addr
);
167 paddr
= (KSEG1
| (unsigned int) pte_val(*pte
)) & PAGE_MASK
;
168 paddr
|= (addr
& ~PAGE_MASK
);
174 dump16(unsigned long *p
)
180 printk("*%08lx == %08lx, ",
181 (unsigned long)p
, (unsigned long)*p
++);
182 printk("*%08lx == %08lx\n",
183 (unsigned long)p
, (unsigned long)*p
++);