From: Nikunj A Dadhania Date: Thu, 27 Apr 2017 05:18:20 +0000 (+0530) Subject: cputlb: handle first atomic write to the page X-Git-Tag: v2.10.0-rc0~197^2~20 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7f9af1abdcc69fd1d3d8d2be68464329600616d6;p=thirdparty%2Fqemu.git cputlb: handle first atomic write to the page In case where the conditional write is the first write to the page, TLB_NOTDIRTY will be set and stop_the_world is triggered. Handle this as a special case and set the dirty bit. After that fall through to the actual atomic instruction below. Signed-off-by: Nikunj A Dadhania Reviewed-by: Richard Henderson Signed-off-by: David Gibson --- diff --git a/cputlb.c b/cputlb.c index f5d056cc083..743776ae190 100644 --- a/cputlb.c +++ b/cputlb.c @@ -930,7 +930,13 @@ static void *atomic_mmu_lookup(CPUArchState *env, target_ulong addr, tlb_addr = tlbe->addr_write; } - /* Notice an IO access, or a notdirty page. */ + /* Check notdirty */ + if (unlikely(tlb_addr & TLB_NOTDIRTY)) { + tlb_set_dirty(ENV_GET_CPU(env), addr); + tlb_addr = tlb_addr & ~TLB_NOTDIRTY; + } + + /* Notice an IO access */ if (unlikely(tlb_addr & ~TARGET_PAGE_MASK)) { /* There's really nothing that can be done to support this apart from stop-the-world. */