diff options
| author | Atsushi Nemoto <anemo@mba.ocn.ne.jp> | 2007-06-02 00:21:30 +0900 | 
|---|---|---|
| committer | Ralf Baechle <ralf@linux-mips.org> | 2007-07-10 17:32:56 +0100 | 
| commit | 4becef1d85a48ea4294c962c2cbacb6074f0dd58 (patch) | |
| tree | beea6b8fa8a861035385e5800ef3b2ed2301f1f2 | |
| parent | f6e2373ad6148476464fc7bb2610c6450c18cd2a (diff) | |
| download | olio-linux-3.10-4becef1d85a48ea4294c962c2cbacb6074f0dd58.tar.xz olio-linux-3.10-4becef1d85a48ea4294c962c2cbacb6074f0dd58.zip  | |
[MIPS] Unify dump_tlb
Unify lib-{32,64}/dump_tlb.c into lib/dump_tlb.c and move
lib-32/r3k_dump_tlb.c to lib directory.
Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
| -rw-r--r-- | arch/mips/lib-32/Makefile | 18 | ||||
| -rw-r--r-- | arch/mips/lib-32/dump_tlb.c | 242 | ||||
| -rw-r--r-- | arch/mips/lib-64/Makefile | 18 | ||||
| -rw-r--r-- | arch/mips/lib/Makefile | 18 | ||||
| -rw-r--r-- | arch/mips/lib/dump_tlb.c (renamed from arch/mips/lib-64/dump_tlb.c) | 58 | ||||
| -rw-r--r-- | arch/mips/lib/r3k_dump_tlb.c (renamed from arch/mips/lib-32/r3k_dump_tlb.c) | 0 | 
6 files changed, 60 insertions, 294 deletions
diff --git a/arch/mips/lib-32/Makefile b/arch/mips/lib-32/Makefile index 8b94d4cc5a3..7bae849e544 100644 --- a/arch/mips/lib-32/Makefile +++ b/arch/mips/lib-32/Makefile @@ -3,21 +3,3 @@  #  lib-y	+= watch.o - -obj-$(CONFIG_CPU_MIPS32)	+= dump_tlb.o -obj-$(CONFIG_CPU_MIPS64)	+= dump_tlb.o -obj-$(CONFIG_CPU_NEVADA)	+= dump_tlb.o -obj-$(CONFIG_CPU_R10000)	+= dump_tlb.o -obj-$(CONFIG_CPU_R3000)		+= r3k_dump_tlb.o -obj-$(CONFIG_CPU_R4300)		+= dump_tlb.o -obj-$(CONFIG_CPU_R4X00)		+= dump_tlb.o -obj-$(CONFIG_CPU_R5000)		+= dump_tlb.o -obj-$(CONFIG_CPU_R5432)		+= dump_tlb.o -obj-$(CONFIG_CPU_R6000)		+= -obj-$(CONFIG_CPU_R8000)		+= -obj-$(CONFIG_CPU_RM7000)	+= dump_tlb.o -obj-$(CONFIG_CPU_RM9000)	+= dump_tlb.o -obj-$(CONFIG_CPU_SB1)		+= dump_tlb.o -obj-$(CONFIG_CPU_TX39XX)	+= r3k_dump_tlb.o -obj-$(CONFIG_CPU_TX49XX)	+= dump_tlb.o -obj-$(CONFIG_CPU_VR41XX)	+= dump_tlb.o diff --git a/arch/mips/lib-32/dump_tlb.c b/arch/mips/lib-32/dump_tlb.c deleted file mode 100644 index 6a68deb51aa..00000000000 --- a/arch/mips/lib-32/dump_tlb.c +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Dump R4x00 TLB for debugging purposes. - * - * Copyright (C) 1994, 1995 by Waldorf Electronics, written by Ralf Baechle. - * Copyright (C) 1999 by Silicon Graphics, Inc. - */ -#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/mipsregs.h> -#include <asm/page.h> -#include <asm/pgtable.h> - -static inline const char *msk2str(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 -	} - -	return "unknown"; -} - -#define BARRIER()					\ -	__asm__ __volatile__(				\ -		".set\tnoreorder\n\t"			\ -		"nop;nop;nop;nop;nop;nop;nop\n\t"	\ -		".set\treorder"); - -void dump_tlb(int first, int last) -{ -	unsigned int pagemask, c0, c1, asid; -	unsigned long long entrylo0, entrylo1; -	unsigned long entryhi; -	int i; - -	asid = read_c0_entryhi() & 0xff; - -	printk("\n"); -	for (i = first; i <= last; i++) { -		write_c0_index(i); -		BARRIER(); -		tlb_read(); -		BARRIER(); -		pagemask = read_c0_pagemask(); -		entryhi = read_c0_entryhi(); -		entrylo0 = read_c0_entrylo0(); -		entrylo1 = read_c0_entrylo1(); - -		/* Unused entries have a virtual address in KSEG0.  */ -		if ((entryhi & 0xf0000000) != 0x80000000 -		    && (entryhi & 0xff) == asid) { -			/* -			 * Only print entries in use -			 */ -			printk("Index: %2d pgmask=%s ", i, msk2str(pagemask)); - -			c0 = (entrylo0 >> 3) & 7; -			c1 = (entrylo1 >> 3) & 7; - -			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)); -			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"); -		} -	} - -	write_c0_entryhi(asid); -} - -void dump_tlb_all(void) -{ -	dump_tlb(0, current_cpu_data.tlbsize - 1); -} - -void dump_tlb_wired(void) -{ -	int wired; - -	wired = read_c0_wired(); -	printk("Wired: %d", wired); -	dump_tlb(0, read_c0_wired()); -} - -void dump_tlb_addr(unsigned long addr) -{ -	unsigned int flags, oldpid; -	int index; - -	local_irq_save(flags); -	oldpid = read_c0_entryhi() & 0xff; -	BARRIER(); -	write_c0_entryhi((addr & PAGE_MASK) | oldpid); -	BARRIER(); -	tlb_probe(); -	BARRIER(); -	index = read_c0_index(); -	write_c0_entryhi(oldpid); -	local_irq_restore(flags); - -	if (index < 0) { -		printk("No entry for address 0x%08lx in TLB\n", addr); -		return; -	} - -	printk("Entry %d maps address 0x%08lx\n", index, addr); -	dump_tlb(index, index); -} - -void dump_tlb_nonwired(void) -{ -	dump_tlb(read_c0_wired(), current_cpu_data.tlbsize - 1); -} - -void dump_list_process(struct task_struct *t, void *address) -{ -	pgd_t *page_dir, *pgd; -	pud_t *pud; -	pmd_t *pmd; -	pte_t *pte, page; -	unsigned long addr, val; - -	addr = (unsigned long) address; - -	printk("Addr                 == %08lx\n", addr); -	printk("task                 == %8p\n", t); -	printk("task->mm             == %8p\n", t->mm); -	//printk("tasks->mm.pgd        == %08x\n", (unsigned int) t->mm->pgd); - -	if (addr > KSEG0) { -		page_dir = pgd_offset_k(0); -		pgd = pgd_offset_k(addr); -	} else if (t->mm) { -		page_dir = pgd_offset(t->mm, 0); -		pgd = pgd_offset(t->mm, addr); -	} else { -		printk("Current thread has no mm\n"); -		return; -	} -	printk("page_dir == %08x\n", (unsigned int) page_dir); -	printk("pgd == %08x, ", (unsigned int) pgd); -	pud = pud_offset(pgd, addr); -	printk("pud == %08x, ", (unsigned int) pud); - -	pmd = pmd_offset(pud, addr); -	printk("pmd == %08x, ", (unsigned int) pmd); - -	pte = pte_offset(pmd, addr); -	printk("pte == %08x, ", (unsigned int) pte); - -	page = *pte; -#ifdef CONFIG_64BIT_PHYS_ADDR -	printk("page == %08Lx\n", pte_val(page)); -#else -	printk("page == %08lx\n", pte_val(page)); -#endif - -	val = pte_val(page); -	if (val & _PAGE_PRESENT) -		printk("present "); -	if (val & _PAGE_READ) -		printk("read "); -	if (val & _PAGE_WRITE) -		printk("write "); -	if (val & _PAGE_ACCESSED) -		printk("accessed "); -	if (val & _PAGE_MODIFIED) -		printk("modified "); -	if (val & _PAGE_R4KBUG) -		printk("r4kbug "); -	if (val & _PAGE_GLOBAL) -		printk("global "); -	if (val & _PAGE_VALID) -		printk("valid "); -	printk("\n"); -} - -void dump_list_current(void *address) -{ -	dump_list_process(current, address); -} - -unsigned int vtop(void *address) -{ -	pgd_t *pgd; -	pud_t *pud; -	pmd_t *pmd; -	pte_t *pte; -	unsigned int addr, paddr; - -	addr = (unsigned long) address; -	pgd = pgd_offset(current->mm, addr); -	pud = pud_offset(pgd, addr); -	pmd = pmd_offset(pud, addr); -	pte = pte_offset(pmd, addr); -	paddr = (KSEG1 | (unsigned int) pte_val(*pte)) & PAGE_MASK; -	paddr |= (addr & ~PAGE_MASK); - -	return paddr; -} - -void dump16(unsigned long *p) -{ -	int i; - -	for (i = 0; i < 8; i++) { -		printk("*%08lx == %08lx, ", (unsigned long) p, *p); -		p++; -		printk("*%08lx == %08lx\n", (unsigned long) p, *p); -		p++; -	} -} diff --git a/arch/mips/lib-64/Makefile b/arch/mips/lib-64/Makefile index 8b94d4cc5a3..7bae849e544 100644 --- a/arch/mips/lib-64/Makefile +++ b/arch/mips/lib-64/Makefile @@ -3,21 +3,3 @@  #  lib-y	+= watch.o - -obj-$(CONFIG_CPU_MIPS32)	+= dump_tlb.o -obj-$(CONFIG_CPU_MIPS64)	+= dump_tlb.o -obj-$(CONFIG_CPU_NEVADA)	+= dump_tlb.o -obj-$(CONFIG_CPU_R10000)	+= dump_tlb.o -obj-$(CONFIG_CPU_R3000)		+= r3k_dump_tlb.o -obj-$(CONFIG_CPU_R4300)		+= dump_tlb.o -obj-$(CONFIG_CPU_R4X00)		+= dump_tlb.o -obj-$(CONFIG_CPU_R5000)		+= dump_tlb.o -obj-$(CONFIG_CPU_R5432)		+= dump_tlb.o -obj-$(CONFIG_CPU_R6000)		+= -obj-$(CONFIG_CPU_R8000)		+= -obj-$(CONFIG_CPU_RM7000)	+= dump_tlb.o -obj-$(CONFIG_CPU_RM9000)	+= dump_tlb.o -obj-$(CONFIG_CPU_SB1)		+= dump_tlb.o -obj-$(CONFIG_CPU_TX39XX)	+= r3k_dump_tlb.o -obj-$(CONFIG_CPU_TX49XX)	+= dump_tlb.o -obj-$(CONFIG_CPU_VR41XX)	+= dump_tlb.o diff --git a/arch/mips/lib/Makefile b/arch/mips/lib/Makefile index 1c1aa9f92f6..1a484e430b3 100644 --- a/arch/mips/lib/Makefile +++ b/arch/mips/lib/Makefile @@ -8,5 +8,23 @@ lib-y	+= csum_partial.o memcpy.o memcpy-inatomic.o memset.o strlen_user.o \  obj-y			+= iomap.o  obj-$(CONFIG_PCI)	+= iomap-pci.o +obj-$(CONFIG_CPU_MIPS32)	+= dump_tlb.o +obj-$(CONFIG_CPU_MIPS64)	+= dump_tlb.o +obj-$(CONFIG_CPU_NEVADA)	+= dump_tlb.o +obj-$(CONFIG_CPU_R10000)	+= dump_tlb.o +obj-$(CONFIG_CPU_R3000)		+= r3k_dump_tlb.o +obj-$(CONFIG_CPU_R4300)		+= dump_tlb.o +obj-$(CONFIG_CPU_R4X00)		+= dump_tlb.o +obj-$(CONFIG_CPU_R5000)		+= dump_tlb.o +obj-$(CONFIG_CPU_R5432)		+= dump_tlb.o +obj-$(CONFIG_CPU_R6000)		+= +obj-$(CONFIG_CPU_R8000)		+= +obj-$(CONFIG_CPU_RM7000)	+= dump_tlb.o +obj-$(CONFIG_CPU_RM9000)	+= dump_tlb.o +obj-$(CONFIG_CPU_SB1)		+= dump_tlb.o +obj-$(CONFIG_CPU_TX39XX)	+= r3k_dump_tlb.o +obj-$(CONFIG_CPU_TX49XX)	+= dump_tlb.o +obj-$(CONFIG_CPU_VR41XX)	+= dump_tlb.o +  # libgcc-style stuff needed in the kernel  obj-y += ashldi3.o ashrdi3.o lshrdi3.o ucmpdi2.o diff --git a/arch/mips/lib-64/dump_tlb.c b/arch/mips/lib/dump_tlb.c index 594df1a05ec..fbf4b72f430 100644 --- a/arch/mips/lib-64/dump_tlb.c +++ b/arch/mips/lib/dump_tlb.c @@ -31,8 +31,7 @@ static inline const char *msk2str(unsigned int mask)  	case PM_256M:	return "256Mb";  #endif  	} - -	return "unknown"; +	return "";  }  #define BARRIER()					\ @@ -43,7 +42,8 @@ static inline const char *msk2str(unsigned int mask)  void dump_tlb(int first, int last)  { -	unsigned long s_entryhi, entryhi, entrylo0, entrylo1, asid; +	unsigned long s_entryhi, entryhi, asid; +	unsigned long long entrylo0, entrylo1;  	unsigned int s_index, pagemask, c0, c1, i;  	s_entryhi = read_c0_entryhi(); @@ -63,6 +63,11 @@ void dump_tlb(int first, int last)  		/* Unused entries have a virtual address of CKSEG0.  */  		if ((entryhi & ~0x1ffffUL) != CKSEG0  		    && (entryhi & 0xff) == asid) { +#ifdef CONFIG_32BIT +			int width = 8; +#else +			int width = 11; +#endif  			/*  			 * Only print entries in use  			 */ @@ -71,19 +76,21 @@ void dump_tlb(int first, int last)  			c0 = (entrylo0 >> 3) & 7;  			c1 = (entrylo1 >> 3) & 7; -			printk("va=%011lx asid=%02lx\n", -			       (entryhi & ~0x1fffUL), +			printk("va=%0*lx asid=%02lx\n", +			       width, (entryhi & ~0x1fffUL),  			       entryhi & 0xff); -			printk("\t[pa=%011lx c=%d d=%d v=%d g=%ld] ", +			printk("\t[pa=%0*llx c=%d d=%d v=%d g=%d] ", +			       width,  			       (entrylo0 << 6) & PAGE_MASK, c0,  			       (entrylo0 & 4) ? 1 : 0,  			       (entrylo0 & 2) ? 1 : 0, -			       (entrylo0 & 1)); -			printk("[pa=%011lx c=%d d=%d v=%d g=%ld]\n", +			       (entrylo0 & 1) ? 1 : 0); +			printk("[pa=%0*llx c=%d d=%d v=%d g=%d]\n", +			       width,  			       (entrylo1 << 6) & PAGE_MASK, c1,  			       (entrylo1 & 4) ? 1 : 0,  			       (entrylo1 & 2) ? 1 : 0, -			       (entrylo1 & 1)); +			       (entrylo1 & 1) ? 1 : 0);  		}  	}  	printk("\n"); @@ -143,29 +150,48 @@ void dump_list_process(struct task_struct *t, void *address)  	pmd_t	*pmd;  	pte_t	*pte, page;  	unsigned long addr, val; +	int width = sizeof(long) * 2;  	addr = (unsigned long) address;  	printk("Addr                 == %08lx\n", addr); +#ifdef CONFIG_64BIT  	printk("tasks->mm.pgd        == %08lx\n", (unsigned long) t->mm->pgd); +#endif +#ifdef CONFIG_64BIT  	page_dir = pgd_offset(t->mm, 0UL); -	printk("page_dir == %016lx\n", (unsigned long) page_dir); -  	pgd = pgd_offset(t->mm, addr); -	printk("pgd == %016lx\n", (unsigned long) pgd); +#else +	if (addr > KSEG0) { +		page_dir = pgd_offset_k(0); +		pgd = pgd_offset_k(addr); +	} else if (t->mm) { +		page_dir = pgd_offset(t->mm, 0); +		pgd = pgd_offset(t->mm, addr); +	} else { +		printk("Current thread has no mm\n"); +		return; +	} +#endif +	printk("page_dir == %0*lx\n", width, (unsigned long) page_dir); +	printk("pgd == %0*lx\n", width, (unsigned long) pgd);  	pud = pud_offset(pgd, addr); -	printk("pud == %016lx\n", (unsigned long) pud); +	printk("pud == %0*lx\n", width, (unsigned long) pud);  	pmd = pmd_offset(pud, addr); -	printk("pmd == %016lx\n", (unsigned long) pmd); +	printk("pmd == %0*lx\n", width, (unsigned long) pmd);  	pte = pte_offset(pmd, addr); -	printk("pte == %016lx\n", (unsigned long) pte); +	printk("pte == %0*lx\n", width, (unsigned long) pte);  	page = *pte; -	printk("page == %08lx\n", pte_val(page)); +#ifdef CONFIG_64BIT_PHYS_ADDR +	printk("page == %08Lx\n", pte_val(page)); +#else +	printk("page == %0*lx\n", width, pte_val(page)); +#endif  	val = pte_val(page);  	if (val & _PAGE_PRESENT) printk("present "); diff --git a/arch/mips/lib-32/r3k_dump_tlb.c b/arch/mips/lib/r3k_dump_tlb.c index 4f2cb74f076..4f2cb74f076 100644 --- a/arch/mips/lib-32/r3k_dump_tlb.c +++ b/arch/mips/lib/r3k_dump_tlb.c  |