2005-04-17 02:20:36 +04:00
/*
* Dump R3000 TLB for debugging purposes .
*
* Copyright ( C ) 1994 , 1995 by Waldorf Electronics , written by Ralf Baechle .
* Copyright ( C ) 1999 by Silicon Graphics , Inc .
* Copyright ( C ) 1999 by Harald Koerfgen
*/
# include <linux/kernel.h>
# include <linux/mm.h>
# include <asm/mipsregs.h>
2014-10-30 16:07:37 +03:00
# include <asm/mmu_context.h>
2005-04-17 02:20:36 +04:00
# include <asm/page.h>
# include <asm/pgtable.h>
2007-07-11 19:51:00 +04:00
# include <asm/tlbdebug.h>
2005-04-17 02:20:36 +04:00
2015-07-15 18:17:43 +03:00
extern int r3k_have_wired_reg ;
void dump_tlb_regs ( void )
{
pr_info ( " Index : %0x \n " , read_c0_index ( ) ) ;
pr_info ( " EntryHi : %0lx \n " , read_c0_entryhi ( ) ) ;
pr_info ( " EntryLo : %0lx \n " , read_c0_entrylo0 ( ) ) ;
if ( r3k_have_wired_reg )
pr_info ( " Wired : %0x \n " , read_c0_wired ( ) ) ;
}
2007-06-01 19:30:25 +04:00
static void dump_tlb ( int first , int last )
2005-04-17 02:20:36 +04:00
{
int i ;
unsigned int asid ;
2016-05-06 16:36:23 +03:00
unsigned long entryhi , entrylo0 , asid_mask ;
2005-04-17 02:20:36 +04:00
2016-05-06 16:36:23 +03:00
asid_mask = cpu_asid_mask ( & current_cpu_data ) ;
asid = read_c0_entryhi ( ) & asid_mask ;
2005-04-17 02:20:36 +04:00
for ( i = first ; i < = last ; i + + ) {
write_c0_index ( i < < 8 ) ;
__asm__ __volatile__ (
" .set \t noreorder \n \t "
" tlbr \n \t "
" nop \n \t "
" .set \t reorder " ) ;
2013-01-22 15:59:30 +04:00
entryhi = read_c0_entryhi ( ) ;
2005-04-17 02:20:36 +04:00
entrylo0 = read_c0_entrylo0 ( ) ;
/* Unused entries have a virtual address of KSEG0. */
2015-05-19 11:50:35 +03:00
if ( ( entryhi & PAGE_MASK ) ! = KSEG0 & &
( entrylo0 & R3K_ENTRYLO_G | |
2016-05-06 16:36:23 +03:00
( entryhi & asid_mask ) = = asid ) ) {
2005-04-17 02:20:36 +04:00
/*
* Only print entries in use
*/
printk ( " Index: %2d " , i ) ;
printk ( " va=%08lx asid=%08lx "
" [pa=%06lx n=%d d=%d v=%d g=%d] " ,
2014-10-30 16:07:38 +03:00
entryhi & PAGE_MASK ,
2016-05-06 16:36:23 +03:00
entryhi & asid_mask ,
2005-04-17 02:20:36 +04:00
entrylo0 & PAGE_MASK ,
2015-05-19 11:50:34 +03:00
( entrylo0 & R3K_ENTRYLO_N ) ? 1 : 0 ,
( entrylo0 & R3K_ENTRYLO_D ) ? 1 : 0 ,
( entrylo0 & R3K_ENTRYLO_V ) ? 1 : 0 ,
( entrylo0 & R3K_ENTRYLO_G ) ? 1 : 0 ) ;
2005-04-17 02:20:36 +04:00
}
}
printk ( " \n " ) ;
write_c0_entryhi ( asid ) ;
}
void dump_tlb_all ( void )
{
dump_tlb ( 0 , current_cpu_data . tlbsize - 1 ) ;
}