Commit 73bc0bd4 authored by Richard Henderson's avatar Richard Henderson
Browse files

cputlb: Handle TLB_NOTDIRTY in probe_access



We can use notdirty_write for the write and return a valid host
pointer for this case.

Reviewed-by: default avatarDavid Hildenbrand <david@redhat.com>
Reviewed-by: default avatarAlex Bennée <alex.bennee@linaro.org>
Signed-off-by: default avatarRichard Henderson <richard.henderson@linaro.org>
parent 707526ad
Loading
Loading
Loading
Loading
+17 −9
Original line number Diff line number Diff line
@@ -1168,16 +1168,24 @@ void *probe_access(CPUArchState *env, target_ulong addr, int size,
        return NULL;
    }

    if (unlikely(tlb_addr & TLB_FLAGS_MASK)) {
        CPUIOTLBEntry *iotlbentry = &env_tlb(env)->d[mmu_idx].iotlb[index];

        /* Reject I/O access, or other required slow-path.  */
        if (tlb_addr & (TLB_MMIO | TLB_BSWAP | TLB_DISCARD_WRITE)) {
            return NULL;
        }

        /* Handle watchpoints.  */
        if (tlb_addr & TLB_WATCHPOINT) {
            cpu_check_watchpoint(env_cpu(env), addr, size,
                             env_tlb(env)->d[mmu_idx].iotlb[index].attrs,
                             wp_access, retaddr);
                                 iotlbentry->attrs, wp_access, retaddr);
        }

    /* Reject I/O access, or other required slow-path.  */
    if (tlb_addr & (TLB_NOTDIRTY | TLB_MMIO | TLB_BSWAP | TLB_DISCARD_WRITE)) {
        return NULL;
        /* Handle clean RAM pages.  */
        if (tlb_addr & TLB_NOTDIRTY) {
            notdirty_write(env_cpu(env), addr, size, iotlbentry, retaddr);
        }
    }

    return (void *)((uintptr_t)addr + entry->addend);