Update of /cvsroot/linux-mips/linux/arch/mips/lib
In directory usw-pr-cvs1:/tmp/cvs-serv23204/arch/mips/lib
Modified Files:
dump_tlb.c
Log Message:
Most of it was a collection of fixes and cleanups for mips64 and SMP stuff
Index: dump_tlb.c
===================================================================
RCS file: /cvsroot/linux-mips/linux/arch/mips/lib/dump_tlb.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- dump_tlb.c 15 Jan 2002 00:34:07 -0000 1.4
+++ dump_tlb.c 26 Feb 2002 17:34:15 -0000 1.5
@@ -4,29 +4,47 @@
* Copyright (C) 1994, 1995 by Waldorf Electronics, written by Ralf Baechle.
* Copyright (C) 1999 by Silicon Graphics, Inc.
*/
+#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/sched.h>
#include <linux/string.h>
#include <asm/bootinfo.h>
-#include <asm/cachectl.h>
#include <asm/cpu.h>
+#include <asm/cachectl.h>
#include <asm/mipsregs.h>
#include <asm/page.h>
#include <asm/pgtable.h>
-void
-dump_tlb(int first, int last)
+static inline const char *msg2str(unsigned int mask)
+{
+ switch (mask) {
+ case PM_4K: return "4kb";
+ case PM_16K: return "16kb";
+ case PM_64K: return "64kb";
+ case PM_256K: return "256kb";
+#ifndef CONFIG_CPU_VR41XX
+ case PM_1M: return "1Mb";
+ case PM_4M: return "4Mb";
+ case PM_16M: return "16Mb";
+ case PM_64M: return "64Mb";
+ case PM_256M: return "256Mb";
+#endif
+ }
+}
+
+void dump_tlb(int first, int last)
{
int i;
unsigned int pagemask, c0, c1, asid;
- unsigned long entryhi, entrylo0, entrylo1;
+ unsigned long long entrylo0, entrylo1;
+ unsigned long entryhi;
asid = get_entryhi() & 0xff;
- for(i=first;i<=last;i++)
- {
+ printk("\n");
+ for(i=first;i<=last;i++) {
write_32bit_cp0_register(CP0_INDEX, i);
__asm__ __volatile__(
".set\tmips3\n\t"
@@ -38,53 +56,50 @@
".set\tmips0\n\t");
pagemask = read_32bit_cp0_register(CP0_PAGEMASK);
entryhi = read_32bit_cp0_register(CP0_ENTRYHI);
- entrylo0 = read_32bit_cp0_register(CP0_ENTRYLO0);
- entrylo1 = read_32bit_cp0_register(CP0_ENTRYLO1);
+ entrylo0 = get_entrylo0();
+ entrylo1 = get_entrylo1();
- /* Unused entries have a virtual address of KSEG0. */
- if ((entryhi & 0xffffe000) != 0x80000000
+ /* Unused entries have a virtual address in KSEG0. */
+ if ((entryhi & 0xf0000000) != 0x80000000
&& (entryhi & 0xff) == asid) {
/*
* Only print entries in use
*/
- printk("Index: %2d pgmask=%08x ", i, pagemask);
+ printk("Index: %2d pgmask=%s ", i, msg2str(pagemask));
c0 = (entrylo0 >> 3) & 7;
c1 = (entrylo1 >> 3) & 7;
- printk("va=%08lx asid=%08lx"
- " [pa=%06lx c=%d d=%d v=%d g=%ld]"
- " [pa=%06lx c=%d d=%d v=%d g=%ld]\n",
- (entryhi & 0xffffe000),
- entryhi & 0xff,
- entrylo0 & PAGE_MASK, c0,
+ printk("va=%08lx asid=%02lx\n",
+ (entryhi & 0xffffe000), (entryhi & 0xff));
+ printk("\t\t\t[pa=%08Lx c=%d d=%d v=%d g=%Ld]\n",
+ (entrylo0 << 6) & PAGE_MASK, c0,
(entrylo0 & 4) ? 1 : 0,
(entrylo0 & 2) ? 1 : 0,
- (entrylo0 & 1),
- entrylo1 & PAGE_MASK, c1,
+ (entrylo0 & 1));
+ printk("\t\t\t[pa=%08Lx c=%d d=%d v=%d g=%Ld]\n",
+ (entrylo1 << 6) & PAGE_MASK, c1,
(entrylo1 & 4) ? 1 : 0,
(entrylo1 & 2) ? 1 : 0,
(entrylo1 & 1));
-
+ printk("\n");
}
}
set_entryhi(asid);
}
-void
-dump_tlb_all(void)
+void dump_tlb_all(void)
{
dump_tlb(0, mips_cpu.tlbsize - 1);
}
-void
-dump_tlb_wired(void)
+void dump_tlb_wired(void)
{
int wired;
wired = read_32bit_cp0_register(CP0_WIRED);
- printk("Num wired entries: %d\n", wired);
+ printk("Wired: %d", wired);
dump_tlb(0, read_32bit_cp0_register(CP0_WIRED));
}
@@ -138,12 +153,20 @@
addr = (unsigned int) address;
printk("Addr == %08x\n", addr);
- printk("tasks->mm.pgd == %08x\n", (unsigned int) t->mm->pgd);
+ printk("task == %08p\n", t);
+ printk("task->mm == %08p\n", t->mm);
+ //printk("tasks->mm.pgd == %08x\n", (unsigned int) t->mm->pgd);
- page_dir = pgd_offset(t->mm, 0);
+ if (addr > KSEG0)
+ page_dir = pgd_offset_k(0);
+ else
+ page_dir = pgd_offset(t->mm, 0);
printk("page_dir == %08x\n", (unsigned int) page_dir);
- pgd = pgd_offset(t->mm, addr);
+ if (addr > KSEG0)
+ pgd = pgd_offset_k(addr);
+ else
+ pgd = pgd_offset(t->mm, addr);
printk("pgd == %08x, ", (unsigned int) pgd);
pmd = pmd_offset(pgd, addr);
@@ -153,7 +176,11 @@
printk("pte == %08x, ", (unsigned int) pte);
page = *pte;
- printk("page == %08x\n", (unsigned int) pte_val(page));
+#ifdef CONFIG_64BIT_PHYS_ADDR
+ printk("page == %08Lx\n", (unsigned long long) pte_val(page));
+#else
+ printk("page == %08lx\n", (unsigned int) pte_val(page));
+#endif
val = pte_val(page);
if (val & _PAGE_PRESENT) printk("present ");
@@ -196,9 +223,11 @@
{
int i;
- for (i=0;i<8;i++) {
- printk("*%08lx == %08lx, ", (unsigned long)p, p[0]);
- printk("*%08lx == %08lx\n", (unsigned long)p, p[1]);
- p += 2;
+ for(i=0;i<8;i++)
+ {
+ printk("*%08lx == %08lx, ",
+ (unsigned long)p, (unsigned long)*p++);
+ printk("*%08lx == %08lx\n",
+ (unsigned long)p, (unsigned long)*p++);
}
}
|