diff options
Diffstat (limited to 'arch/mips/lib/dump_tlb.c')
| -rw-r--r-- | arch/mips/lib/dump_tlb.c | 27 | 
1 files changed, 21 insertions, 6 deletions
diff --git a/arch/mips/lib/dump_tlb.c b/arch/mips/lib/dump_tlb.c index 92a37319efbe..0f80b936e75e 100644 --- a/arch/mips/lib/dump_tlb.c +++ b/arch/mips/lib/dump_tlb.c @@ -19,6 +19,8 @@ void dump_tlb_regs(void)  	pr_info("Index    : %0x\n", read_c0_index());  	pr_info("PageMask : %0x\n", read_c0_pagemask()); +	if (cpu_has_guestid) +		pr_info("GuestCtl1: %0x\n", read_c0_guestctl1());  	pr_info("EntryHi  : %0*lx\n", field, read_c0_entryhi());  	pr_info("EntryLo0 : %0*lx\n", field, read_c0_entrylo0());  	pr_info("EntryLo1 : %0*lx\n", field, read_c0_entrylo1()); @@ -72,7 +74,10 @@ static void dump_tlb(int first, int last)  {  	unsigned long s_entryhi, entryhi, asid;  	unsigned long long entrylo0, entrylo1, pa; -	unsigned int s_index, s_pagemask, pagemask, c0, c1, i; +	unsigned int s_index, s_pagemask, s_guestctl1 = 0; +	unsigned int pagemask, guestctl1 = 0, c0, c1, i; +	unsigned long asidmask = cpu_asid_mask(¤t_cpu_data); +	int asidwidth = DIV_ROUND_UP(ilog2(asidmask) + 1, 4);  #ifdef CONFIG_32BIT  	bool xpa = cpu_has_xpa && (read_c0_pagegrain() & PG_ELPA);  	int pwidth = xpa ? 11 : 8; @@ -86,7 +91,9 @@ static void dump_tlb(int first, int last)  	s_pagemask = read_c0_pagemask();  	s_entryhi = read_c0_entryhi();  	s_index = read_c0_index(); -	asid = s_entryhi & 0xff; +	asid = s_entryhi & asidmask; +	if (cpu_has_guestid) +		s_guestctl1 = read_c0_guestctl1();  	for (i = first; i <= last; i++) {  		write_c0_index(i); @@ -97,6 +104,8 @@ static void dump_tlb(int first, int last)  		entryhi	 = read_c0_entryhi();  		entrylo0 = read_c0_entrylo0();  		entrylo1 = read_c0_entrylo1(); +		if (cpu_has_guestid) +			guestctl1 = read_c0_guestctl1();  		/* EHINV bit marks entire entry as invalid */  		if (cpu_has_tlbinv && entryhi & MIPS_ENTRYHI_EHINV) @@ -115,7 +124,7 @@ static void dump_tlb(int first, int last)  		 * due to duplicate TLB entry.  		 */  		if (!((entrylo0 | entrylo1) & ENTRYLO_G) && -		    (entryhi & 0xff) != asid) +		    (entryhi & asidmask) != asid)  			continue;  		/* @@ -126,15 +135,19 @@ static void dump_tlb(int first, int last)  		c0 = (entrylo0 & ENTRYLO_C) >> ENTRYLO_C_SHIFT;  		c1 = (entrylo1 & ENTRYLO_C) >> ENTRYLO_C_SHIFT; -		printk("va=%0*lx asid=%02lx\n", +		printk("va=%0*lx asid=%0*lx",  		       vwidth, (entryhi & ~0x1fffUL), -		       entryhi & 0xff); +		       asidwidth, entryhi & asidmask); +		if (cpu_has_guestid) +			printk(" gid=%02lx", +			       (guestctl1 & MIPS_GCTL1_RID) +					>> MIPS_GCTL1_RID_SHIFT);  		/* RI/XI are in awkward places, so mask them off separately */  		pa = entrylo0 & ~(MIPS_ENTRYLO_RI | MIPS_ENTRYLO_XI);  		if (xpa)  			pa |= (unsigned long long)readx_c0_entrylo0() << 30;  		pa = (pa << 6) & PAGE_MASK; -		printk("\t["); +		printk("\n\t[");  		if (cpu_has_rixi)  			printk("ri=%d xi=%d ",  			       (entrylo0 & MIPS_ENTRYLO_RI) ? 1 : 0, @@ -164,6 +177,8 @@ static void dump_tlb(int first, int last)  	write_c0_entryhi(s_entryhi);  	write_c0_index(s_index);  	write_c0_pagemask(s_pagemask); +	if (cpu_has_guestid) +		write_c0_guestctl1(s_guestctl1);  }  void dump_tlb_all(void)  |