| .. | .. |
|---|
| 10 | 10 | |
|---|
| 11 | 11 | #include <asm/hazards.h> |
|---|
| 12 | 12 | #include <asm/mipsregs.h> |
|---|
| 13 | +#include <asm/mmu_context.h> |
|---|
| 13 | 14 | #include <asm/page.h> |
|---|
| 14 | | -#include <asm/pgtable.h> |
|---|
| 15 | 15 | #include <asm/tlbdebug.h> |
|---|
| 16 | 16 | |
|---|
| 17 | 17 | void dump_tlb_regs(void) |
|---|
| .. | .. |
|---|
| 73 | 73 | |
|---|
| 74 | 74 | static void dump_tlb(int first, int last) |
|---|
| 75 | 75 | { |
|---|
| 76 | | - unsigned long s_entryhi, entryhi, asid; |
|---|
| 76 | + unsigned long s_entryhi, entryhi, asid, mmid; |
|---|
| 77 | 77 | unsigned long long entrylo0, entrylo1, pa; |
|---|
| 78 | 78 | unsigned int s_index, s_pagemask, s_guestctl1 = 0; |
|---|
| 79 | 79 | unsigned int pagemask, guestctl1 = 0, c0, c1, i; |
|---|
| 80 | 80 | unsigned long asidmask = cpu_asid_mask(¤t_cpu_data); |
|---|
| 81 | 81 | int asidwidth = DIV_ROUND_UP(ilog2(asidmask) + 1, 4); |
|---|
| 82 | + unsigned long s_mmid; |
|---|
| 82 | 83 | #ifdef CONFIG_32BIT |
|---|
| 83 | 84 | bool xpa = cpu_has_xpa && (read_c0_pagegrain() & PG_ELPA); |
|---|
| 84 | 85 | int pwidth = xpa ? 11 : 8; |
|---|
| .. | .. |
|---|
| 92 | 93 | s_pagemask = read_c0_pagemask(); |
|---|
| 93 | 94 | s_entryhi = read_c0_entryhi(); |
|---|
| 94 | 95 | s_index = read_c0_index(); |
|---|
| 95 | | - asid = s_entryhi & asidmask; |
|---|
| 96 | + |
|---|
| 97 | + if (cpu_has_mmid) |
|---|
| 98 | + asid = s_mmid = read_c0_memorymapid(); |
|---|
| 99 | + else |
|---|
| 100 | + asid = s_entryhi & asidmask; |
|---|
| 101 | + |
|---|
| 96 | 102 | if (cpu_has_guestid) |
|---|
| 97 | 103 | s_guestctl1 = read_c0_guestctl1(); |
|---|
| 98 | 104 | |
|---|
| .. | .. |
|---|
| 105 | 111 | entryhi = read_c0_entryhi(); |
|---|
| 106 | 112 | entrylo0 = read_c0_entrylo0(); |
|---|
| 107 | 113 | entrylo1 = read_c0_entrylo1(); |
|---|
| 114 | + |
|---|
| 115 | + if (cpu_has_mmid) |
|---|
| 116 | + mmid = read_c0_memorymapid(); |
|---|
| 117 | + else |
|---|
| 118 | + mmid = entryhi & asidmask; |
|---|
| 119 | + |
|---|
| 108 | 120 | if (cpu_has_guestid) |
|---|
| 109 | 121 | guestctl1 = read_c0_guestctl1(); |
|---|
| 110 | 122 | |
|---|
| .. | .. |
|---|
| 124 | 136 | * leave only a single G bit set after a machine check exception |
|---|
| 125 | 137 | * due to duplicate TLB entry. |
|---|
| 126 | 138 | */ |
|---|
| 127 | | - if (!((entrylo0 | entrylo1) & ENTRYLO_G) && |
|---|
| 128 | | - (entryhi & asidmask) != asid) |
|---|
| 139 | + if (!((entrylo0 | entrylo1) & ENTRYLO_G) && (mmid != asid)) |
|---|
| 129 | 140 | continue; |
|---|
| 130 | 141 | |
|---|
| 131 | 142 | /* |
|---|
| .. | .. |
|---|
| 138 | 149 | |
|---|
| 139 | 150 | pr_cont("va=%0*lx asid=%0*lx", |
|---|
| 140 | 151 | vwidth, (entryhi & ~0x1fffUL), |
|---|
| 141 | | - asidwidth, entryhi & asidmask); |
|---|
| 152 | + asidwidth, mmid); |
|---|
| 142 | 153 | if (cpu_has_guestid) |
|---|
| 143 | 154 | pr_cont(" gid=%02lx", |
|---|
| 144 | 155 | (guestctl1 & MIPS_GCTL1_RID) |
|---|