|
@@ -760,7 +760,8 @@ static void build_huge_update_entries(u32 **p, unsigned int pte,
|
|
|
static void build_huge_handler_tail(u32 **p, struct uasm_reloc **r,
|
|
|
struct uasm_label **l,
|
|
|
unsigned int pte,
|
|
|
- unsigned int ptr)
|
|
|
+ unsigned int ptr,
|
|
|
+ unsigned int flush)
|
|
|
{
|
|
|
#ifdef CONFIG_SMP
|
|
|
UASM_i_SC(p, pte, 0, ptr);
|
|
@@ -769,6 +770,22 @@ static void build_huge_handler_tail(u32 **p, struct uasm_reloc **r,
|
|
|
#else
|
|
|
UASM_i_SW(p, pte, 0, ptr);
|
|
|
#endif
|
|
|
+ if (cpu_has_ftlb && flush) {
|
|
|
+ BUG_ON(!cpu_has_tlbinv);
|
|
|
+
|
|
|
+ UASM_i_MFC0(p, ptr, C0_ENTRYHI);
|
|
|
+ uasm_i_ori(p, ptr, ptr, MIPS_ENTRYHI_EHINV);
|
|
|
+ UASM_i_MTC0(p, ptr, C0_ENTRYHI);
|
|
|
+ build_tlb_write_entry(p, l, r, tlb_indexed);
|
|
|
+
|
|
|
+ uasm_i_xori(p, ptr, ptr, MIPS_ENTRYHI_EHINV);
|
|
|
+ UASM_i_MTC0(p, ptr, C0_ENTRYHI);
|
|
|
+ build_huge_update_entries(p, pte, ptr);
|
|
|
+ build_huge_tlb_write_entry(p, l, r, pte, tlb_random, 0);
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
build_huge_update_entries(p, pte, ptr);
|
|
|
build_huge_tlb_write_entry(p, l, r, pte, tlb_indexed, 0);
|
|
|
}
|
|
@@ -2199,7 +2216,7 @@ static void build_r4000_tlb_load_handler(void)
|
|
|
uasm_l_tlbl_goaround2(&l, p);
|
|
|
}
|
|
|
uasm_i_ori(&p, wr.r1, wr.r1, (_PAGE_ACCESSED | _PAGE_VALID));
|
|
|
- build_huge_handler_tail(&p, &r, &l, wr.r1, wr.r2);
|
|
|
+ build_huge_handler_tail(&p, &r, &l, wr.r1, wr.r2, 1);
|
|
|
#endif
|
|
|
|
|
|
uasm_l_nopage_tlbl(&l, p);
|
|
@@ -2254,7 +2271,7 @@ static void build_r4000_tlb_store_handler(void)
|
|
|
build_tlb_probe_entry(&p);
|
|
|
uasm_i_ori(&p, wr.r1, wr.r1,
|
|
|
_PAGE_ACCESSED | _PAGE_MODIFIED | _PAGE_VALID | _PAGE_DIRTY);
|
|
|
- build_huge_handler_tail(&p, &r, &l, wr.r1, wr.r2);
|
|
|
+ build_huge_handler_tail(&p, &r, &l, wr.r1, wr.r2, 1);
|
|
|
#endif
|
|
|
|
|
|
uasm_l_nopage_tlbs(&l, p);
|
|
@@ -2310,7 +2327,7 @@ static void build_r4000_tlb_modify_handler(void)
|
|
|
build_tlb_probe_entry(&p);
|
|
|
uasm_i_ori(&p, wr.r1, wr.r1,
|
|
|
_PAGE_ACCESSED | _PAGE_MODIFIED | _PAGE_VALID | _PAGE_DIRTY);
|
|
|
- build_huge_handler_tail(&p, &r, &l, wr.r1, wr.r2);
|
|
|
+ build_huge_handler_tail(&p, &r, &l, wr.r1, wr.r2, 0);
|
|
|
#endif
|
|
|
|
|
|
uasm_l_nopage_tlbm(&l, p);
|