#ifndef DIRTY_H #define DIRTY_H #include "compiler.h" #include "ioregs.h" #define DIRTY_PAGE_BITS 12 #define DIRTY_PAGE_SIZE (1U << DIRTY_PAGE_BITS) #define DIRTY_PAGES (1U << (SDRAM_BITS - DIRTY_PAGE_BITS)) #define DIRTY_PAGE_MASK (DIRTY_PAGES - 1) static inline size_t dirty_page_num(const void *addr) { return ((size_t)addr - SDRAM_ADDR) >> DIRTY_PAGE_BITS; } static inline volatile bool *dirty_page_reg(size_t page) { return (volatile bool *)(&DIRTY_PAGE_REG + page); } static inline bool is_dirty_page(size_t page) { volatile bool *dreg = dirty_page_reg(page); return *dreg; } static inline bool mem_dirty(const void *addr) { return is_dirty_page(dirty_page_num(addr)); } static inline bool is_dirty_page_clear(size_t page) { volatile bool *dreg = dirty_page_reg(page); bool d = *dreg; *dreg = d; return d; } static inline bool mem_dirty_clear(const void *addr) { return is_dirty_page_clear(dirty_page_num(addr)); } #endif /* DIRTY_H */