Skip to content
  • Peter Maydell's avatar
    34d49937
    accel/tcg: Handle atomic accesses to notdirty memory correctly · 34d49937
    Peter Maydell authored
    
    
    To do a write to memory that is marked as notdirty, we need
    to invalidate any TBs we have cached for that memory, and
    update the cpu physical memory dirty flags for VGA and migration.
    The slowpath code in notdirty_mem_write() does all this correctly,
    but the new atomic handling code in atomic_mmu_lookup() doesn't
    do anything at all, it just clears the dirty bit in the TLB.
    
    The effect of this bug is that if the first write to a notdirty
    page for which we have cached TBs is by a guest atomic access,
    we fail to invalidate the TBs and subsequently will execute
    incorrect code. This can be seen by trying to run 'javac' on AArch64.
    
    Use the new notdirty_call_before() and notdirty_call_after()
    functions to correctly handle the update to notdirty memory
    in the atomic codepath.
    
    Cc: qemu-stable@nongnu.org
    Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
    Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Reviewed-by: default avatarRichard Henderson <richard.henderson@linaro.org>
    Message-id: 1511201308-23580-3-git-send-email-peter.maydell@linaro.org
    34d49937
    accel/tcg: Handle atomic accesses to notdirty memory correctly
    Peter Maydell authored
    
    
    To do a write to memory that is marked as notdirty, we need
    to invalidate any TBs we have cached for that memory, and
    update the cpu physical memory dirty flags for VGA and migration.
    The slowpath code in notdirty_mem_write() does all this correctly,
    but the new atomic handling code in atomic_mmu_lookup() doesn't
    do anything at all, it just clears the dirty bit in the TLB.
    
    The effect of this bug is that if the first write to a notdirty
    page for which we have cached TBs is by a guest atomic access,
    we fail to invalidate the TBs and subsequently will execute
    incorrect code. This can be seen by trying to run 'javac' on AArch64.
    
    Use the new notdirty_call_before() and notdirty_call_after()
    functions to correctly handle the update to notdirty memory
    in the atomic codepath.
    
    Cc: qemu-stable@nongnu.org
    Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
    Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Reviewed-by: default avatarRichard Henderson <richard.henderson@linaro.org>
    Message-id: 1511201308-23580-3-git-send-email-peter.maydell@linaro.org
Loading