target/loongarch: Use correct address when flush tlb
With tlb_flush_range_by_mmuidx(), the virtual address is 64 bit. However on LoongArch TLB emulation system, virtual address is 48 bit. It is necessary to signed-extend 48 bit address to 64 bit when flush tlb, also fix address calculation issue with odd page. Signed-off-by: Bibo Mao <maobibo@loongson.cn> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
f95b970275
commit
cc78259deb
1 changed files with 3 additions and 3 deletions
|
|
@ -115,16 +115,16 @@ static void invalidate_tlb_entry(CPULoongArchState *env, int index)
|
|||
tlb_ps = FIELD_EX64(tlb->tlb_misc, TLB_MISC, PS);
|
||||
pagesize = MAKE_64BIT_MASK(tlb_ps, 1);
|
||||
mask = MAKE_64BIT_MASK(0, tlb_ps + 1);
|
||||
addr = (tlb_vppn << R_TLB_MISC_VPPN_SHIFT) & ~mask;
|
||||
addr = sextract64(addr, 0, TARGET_VIRT_ADDR_SPACE_BITS);
|
||||
|
||||
if (tlb_v0) {
|
||||
addr = (tlb_vppn << R_TLB_MISC_VPPN_SHIFT) & ~mask; /* even */
|
||||
tlb_flush_range_by_mmuidx(env_cpu(env), addr, pagesize,
|
||||
mmu_idx, TARGET_LONG_BITS);
|
||||
}
|
||||
|
||||
if (tlb_v1) {
|
||||
addr = (tlb_vppn << R_TLB_MISC_VPPN_SHIFT) & pagesize; /* odd */
|
||||
tlb_flush_range_by_mmuidx(env_cpu(env), addr, pagesize,
|
||||
tlb_flush_range_by_mmuidx(env_cpu(env), addr + pagesize, pagesize,
|
||||
mmu_idx, TARGET_LONG_BITS);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue