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 <nikunj@linux.vnet.ibm.com> Reviewed-by: Richard Henderson <rth@twiddle.net> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
253ce7b2cf
commit
7f9af1abdc
8
cputlb.c
8
cputlb.c
@ -930,7 +930,13 @@ static void *atomic_mmu_lookup(CPUArchState *env, target_ulong addr,
|
|||||||
tlb_addr = tlbe->addr_write;
|
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)) {
|
if (unlikely(tlb_addr & ~TARGET_PAGE_MASK)) {
|
||||||
/* There's really nothing that can be done to
|
/* There's really nothing that can be done to
|
||||||
support this apart from stop-the-world. */
|
support this apart from stop-the-world. */
|
||||||
|
Loading…
Reference in New Issue
Block a user