tcg: Check for watchpoints in probe_write()
Let size > 0 indicate a promise to write to those bytes. Check for write watchpoints in the probed range. Suggested-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: David Hildenbrand <david@redhat.com> Message-Id: <20190823100741.9621-10-david@redhat.com> [rth: Recompute index after tlb_fill; check TLB_WATCHPOINT.] Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
50b107c5d6
commit
03a981893c
@ -1086,13 +1086,24 @@ void probe_write(CPUArchState *env, target_ulong addr, int size, int mmu_idx,
|
|||||||
{
|
{
|
||||||
uintptr_t index = tlb_index(env, mmu_idx, addr);
|
uintptr_t index = tlb_index(env, mmu_idx, addr);
|
||||||
CPUTLBEntry *entry = tlb_entry(env, mmu_idx, addr);
|
CPUTLBEntry *entry = tlb_entry(env, mmu_idx, addr);
|
||||||
|
target_ulong tlb_addr = tlb_addr_write(entry);
|
||||||
|
|
||||||
if (!tlb_hit(tlb_addr_write(entry), addr)) {
|
if (unlikely(!tlb_hit(tlb_addr, addr))) {
|
||||||
/* TLB entry is for a different page */
|
|
||||||
if (!VICTIM_TLB_HIT(addr_write, addr)) {
|
if (!VICTIM_TLB_HIT(addr_write, addr)) {
|
||||||
tlb_fill(env_cpu(env), addr, size, MMU_DATA_STORE,
|
tlb_fill(env_cpu(env), addr, size, MMU_DATA_STORE,
|
||||||
mmu_idx, retaddr);
|
mmu_idx, retaddr);
|
||||||
|
/* TLB resize via tlb_fill may have moved the entry. */
|
||||||
|
index = tlb_index(env, mmu_idx, addr);
|
||||||
|
entry = tlb_entry(env, mmu_idx, addr);
|
||||||
}
|
}
|
||||||
|
tlb_addr = tlb_addr_write(entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle watchpoints. */
|
||||||
|
if ((tlb_addr & TLB_WATCHPOINT) && size > 0) {
|
||||||
|
cpu_check_watchpoint(env_cpu(env), addr, size,
|
||||||
|
env_tlb(env)->d[mmu_idx].iotlb[index].attrs,
|
||||||
|
BP_MEM_WRITE, retaddr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user