Revision f23db169 exec.c

b/exec.c
1492 1492
    tlb_protect_code1(&env->tlb_write[0][i], vaddr);
1493 1493
    tlb_protect_code1(&env->tlb_write[1][i], vaddr);
1494 1494

  
1495
    phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS] &= ~CODE_DIRTY_FLAG;
1496 1495
#ifdef USE_KQEMU
1497 1496
    if (env->kqemu_enabled) {
1498 1497
        kqemu_set_notdirty(env, ram_addr);
1499 1498
    }
1500 1499
#endif
1500
    phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS] &= ~CODE_DIRTY_FLAG;
1501 1501
    
1502 1502
#if !defined(CONFIG_SOFTMMU)
1503 1503
    /* NOTE: as we generated the code for this page, it is already at
......
1541 1541
    length = end - start;
1542 1542
    if (length == 0)
1543 1543
        return;
1544
    mask = ~dirty_flags;
1545
    p = phys_ram_dirty + (start >> TARGET_PAGE_BITS);
1546 1544
    len = length >> TARGET_PAGE_BITS;
1547
    for(i = 0; i < len; i++)
1548
        p[i] &= mask;
1549

  
1550 1545
    env = cpu_single_env;
1551 1546
#ifdef USE_KQEMU
1552 1547
    if (env->kqemu_enabled) {
1553
        for(i = 0; i < len; i++)
1554
            kqemu_set_notdirty(env, (unsigned long)i << TARGET_PAGE_BITS);
1548
        ram_addr_t addr;
1549
        addr = start;
1550
        for(i = 0; i < len; i++) {
1551
            kqemu_set_notdirty(env, addr);
1552
            addr += TARGET_PAGE_SIZE;
1553
        }
1555 1554
    }
1556 1555
#endif
1556
    mask = ~dirty_flags;
1557
    p = phys_ram_dirty + (start >> TARGET_PAGE_BITS);
1558
    for(i = 0; i < len; i++)
1559
        p[i] &= mask;
1560

  
1557 1561
    /* we modify the TLB cache so that the dirty bit will be set again
1558 1562
       when accessing the range */
1559 1563
    start1 = start + (unsigned long)phys_ram_base;
......
1633 1637
    CPUState *env = cpu_single_env;
1634 1638
    int i;
1635 1639

  
1636
    phys_ram_dirty[(addr - (unsigned long)phys_ram_base) >> TARGET_PAGE_BITS] = 0xff;
1637

  
1638 1640
    addr &= TARGET_PAGE_MASK;
1639 1641
    i = (vaddr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
1640 1642
    tlb_set_dirty1(&env->tlb_write[0][i], addr);
......
2005 2007
#endif
2006 2008
    }
2007 2009
    stb_p((uint8_t *)(long)addr, val);
2008
    /* we set the page as dirty only if the code has been flushed */
2009
    if (dirty_flags & CODE_DIRTY_FLAG)
2010
    dirty_flags |= (0xff & ~CODE_DIRTY_FLAG);
2011
    phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS] = dirty_flags;
2012
    /* we remove the notdirty callback only if the code has been
2013
       flushed */
2014
    if (dirty_flags == 0xff)
2010 2015
        tlb_set_dirty(addr, cpu_single_env->mem_write_vaddr);
2011 2016
}
2012 2017

  
......
2023 2028
#endif
2024 2029
    }
2025 2030
    stw_p((uint8_t *)(long)addr, val);
2026
    /* we set the page as dirty only if the code has been flushed */
2027
    if (dirty_flags & CODE_DIRTY_FLAG)
2031
    dirty_flags |= (0xff & ~CODE_DIRTY_FLAG);
2032
    phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS] = dirty_flags;
2033
    /* we remove the notdirty callback only if the code has been
2034
       flushed */
2035
    if (dirty_flags == 0xff)
2028 2036
        tlb_set_dirty(addr, cpu_single_env->mem_write_vaddr);
2029 2037
}
2030 2038

  
......
2041 2049
#endif
2042 2050
    }
2043 2051
    stl_p((uint8_t *)(long)addr, val);
2044
    /* we set the page as dirty only if the code has been flushed */
2045
    if (dirty_flags & CODE_DIRTY_FLAG)
2052
    dirty_flags |= (0xff & ~CODE_DIRTY_FLAG);
2053
    phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS] = dirty_flags;
2054
    /* we remove the notdirty callback only if the code has been
2055
       flushed */
2056
    if (dirty_flags == 0xff)
2046 2057
        tlb_set_dirty(addr, cpu_single_env->mem_write_vaddr);
2047 2058
}
2048 2059

  
......
2207 2218
                    /* invalidate code */
2208 2219
                    tb_invalidate_phys_page_range(addr1, addr1 + l, 0);
2209 2220
                    /* set dirty bit */
2210
                    phys_ram_dirty[addr1 >> TARGET_PAGE_BITS] = 0xff;
2221
                    phys_ram_dirty[addr1 >> TARGET_PAGE_BITS] |= 
2222
                        (0xff & ~CODE_DIRTY_FLAG);
2211 2223
                }
2212 2224
            }
2213 2225
        } else {
......
2327 2339
            /* invalidate code */
2328 2340
            tb_invalidate_phys_page_range(addr1, addr1 + 4, 0);
2329 2341
            /* set dirty bit */
2330
            phys_ram_dirty[addr1 >> TARGET_PAGE_BITS] = 0xff;
2342
            phys_ram_dirty[addr1 >> TARGET_PAGE_BITS] |=
2343
                (0xff & ~CODE_DIRTY_FLAG);
2331 2344
        }
2332 2345
    }
2333 2346
}

Also available in: Unified diff