MIPS: Sibyte: Fix M3 TLB exception handler workaround.

The M3 workaround needs to cmpare the region and VPN2 fields only.

Signed-off-by: Ralf Baechle <ralf@linux-mips.org>

+16 -6
+16 -6
arch/mips/mm/tlbex.c
··· 788 788 * create the plain linear handler 789 789 */ 790 790 if (bcm1250_m3_war()) { 791 - UASM_i_MFC0(&p, K0, C0_BADVADDR); 792 - UASM_i_MFC0(&p, K1, C0_ENTRYHI); 791 + unsigned int segbits = 44; 792 + 793 + uasm_i_dmfc0(&p, K0, C0_BADVADDR); 794 + uasm_i_dmfc0(&p, K1, C0_ENTRYHI); 793 795 uasm_i_xor(&p, K0, K0, K1); 794 - UASM_i_SRL(&p, K0, K0, PAGE_SHIFT + 1); 796 + uasm_i_dsrl32(&p, K1, K0, 62 - 32); 797 + uasm_i_dsrl(&p, K0, K0, 12 + 1); 798 + uasm_i_dsll32(&p, K0, K0, 64 + 12 + 1 - segbits - 32); 799 + uasm_i_or(&p, K0, K0, K1); 795 800 uasm_il_bnez(&p, &r, K0, label_leave); 796 801 /* No need for uasm_i_nop */ 797 802 } ··· 1317 1312 memset(relocs, 0, sizeof(relocs)); 1318 1313 1319 1314 if (bcm1250_m3_war()) { 1320 - UASM_i_MFC0(&p, K0, C0_BADVADDR); 1321 - UASM_i_MFC0(&p, K1, C0_ENTRYHI); 1315 + unsigned int segbits = 44; 1316 + 1317 + uasm_i_dmfc0(&p, K0, C0_BADVADDR); 1318 + uasm_i_dmfc0(&p, K1, C0_ENTRYHI); 1322 1319 uasm_i_xor(&p, K0, K0, K1); 1323 - UASM_i_SRL(&p, K0, K0, PAGE_SHIFT + 1); 1320 + uasm_i_dsrl32(&p, K1, K0, 62 - 32); 1321 + uasm_i_dsrl(&p, K0, K0, 12 + 1); 1322 + uasm_i_dsll32(&p, K0, K0, 64 + 12 + 1 - segbits - 32); 1323 + uasm_i_or(&p, K0, K0, K1); 1324 1324 uasm_il_bnez(&p, &r, K0, label_leave); 1325 1325 /* No need for uasm_i_nop */ 1326 1326 }