diff options
author | Andrew Waterman <waterman@cs.berkeley.edu> | 2015-03-14 02:07:20 -0700 |
---|---|---|
committer | Andrew Waterman <waterman@cs.berkeley.edu> | 2015-03-14 02:07:20 -0700 |
commit | 4ea6feac5fe663fe82de53632883ced6205f57f8 (patch) | |
tree | 3cba15df53bf504b0434189b98311f3d0040cad0 /v | |
parent | bd2090129b328fa9803275df0e52459d645e8ceb (diff) | |
download | env-4ea6feac5fe663fe82de53632883ced6205f57f8.zip env-4ea6feac5fe663fe82de53632883ced6205f57f8.tar.gz env-4ea6feac5fe663fe82de53632883ced6205f57f8.tar.bz2 |
Check referenced/dirty bits
Diffstat (limited to 'v')
-rw-r--r-- | v/vm.c | 8 |
1 files changed, 7 insertions, 1 deletions
@@ -65,7 +65,13 @@ void evict(unsigned long addr) freelist_t* node = &user_mapping[addr/PGSIZE]; if (node->addr) { - memcpy((void*)addr, (void*)node->addr, PGSIZE); + // check referenced and dirty bits + assert(l3pt[addr/PGSIZE] & PTE_R); + if (memcmp((void*)addr, (void*)node->addr, PGSIZE)) { + assert(l3pt[addr/PGSIZE] & PTE_D); + memcpy((void*)addr, (void*)node->addr, PGSIZE); + } + user_mapping[addr/PGSIZE].addr = 0; if (freelist_tail == 0) |