|
@@ -1062,6 +1062,7 @@ static void build_update_entries(u32 **p, unsigned int tmp, unsigned int ptep)
|
|
|
struct mips_huge_tlb_info {
|
|
|
int huge_pte;
|
|
|
int restore_scratch;
|
|
|
+ bool need_reload_pte;
|
|
|
};
|
|
|
|
|
|
static struct mips_huge_tlb_info
|
|
@@ -1076,6 +1077,7 @@ build_fast_tlb_refill_handler (u32 **p, struct uasm_label **l,
|
|
|
|
|
|
rv.huge_pte = scratch;
|
|
|
rv.restore_scratch = 0;
|
|
|
+ rv.need_reload_pte = false;
|
|
|
|
|
|
if (check_for_high_segbits) {
|
|
|
UASM_i_MFC0(p, tmp, C0_BADVADDR);
|
|
@@ -1264,6 +1266,7 @@ static void build_r4000_tlb_refill_handler(void)
|
|
|
} else {
|
|
|
htlb_info.huge_pte = K0;
|
|
|
htlb_info.restore_scratch = 0;
|
|
|
+ htlb_info.need_reload_pte = true;
|
|
|
vmalloc_mode = refill_noscratch;
|
|
|
/*
|
|
|
* create the plain linear handler
|
|
@@ -1300,7 +1303,8 @@ static void build_r4000_tlb_refill_handler(void)
|
|
|
}
|
|
|
#ifdef CONFIG_MIPS_HUGE_TLB_SUPPORT
|
|
|
uasm_l_tlb_huge_update(&l, p);
|
|
|
- UASM_i_LW(&p, K0, 0, K1);
|
|
|
+ if (htlb_info.need_reload_pte)
|
|
|
+ UASM_i_LW(&p, htlb_info.huge_pte, 0, K1);
|
|
|
build_huge_update_entries(&p, htlb_info.huge_pte, K1);
|
|
|
build_huge_tlb_write_entry(&p, &l, &r, K0, tlb_random,
|
|
|
htlb_info.restore_scratch);
|