|
@@ -1872,8 +1872,16 @@ build_r4000_tlbchange_handler_head(u32 **p, struct uasm_label **l,
|
|
|
uasm_l_smp_pgtable_change(l, *p);
|
|
uasm_l_smp_pgtable_change(l, *p);
|
|
|
#endif
|
|
#endif
|
|
|
iPTE_LW(p, wr.r1, wr.r2); /* get even pte */
|
|
iPTE_LW(p, wr.r1, wr.r2); /* get even pte */
|
|
|
- if (!m4kc_tlbp_war())
|
|
|
|
|
|
|
+ if (!m4kc_tlbp_war()) {
|
|
|
build_tlb_probe_entry(p);
|
|
build_tlb_probe_entry(p);
|
|
|
|
|
+ if (cpu_has_htw) {
|
|
|
|
|
+ /* race condition happens, leaving */
|
|
|
|
|
+ uasm_i_ehb(p);
|
|
|
|
|
+ uasm_i_mfc0(p, wr.r3, C0_INDEX);
|
|
|
|
|
+ uasm_il_bltz(p, r, wr.r3, label_leave);
|
|
|
|
|
+ uasm_i_nop(p);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
return wr;
|
|
return wr;
|
|
|
}
|
|
}
|
|
|
|
|
|