summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2015-03-14 02:07:20 -0700
committerAndrew Waterman <waterman@cs.berkeley.edu>2015-03-14 02:07:20 -0700
commit4ea6feac5fe663fe82de53632883ced6205f57f8 (patch)
tree3cba15df53bf504b0434189b98311f3d0040cad0
parentbd2090129b328fa9803275df0e52459d645e8ceb (diff)
downloadenv-4ea6feac5fe663fe82de53632883ced6205f57f8.zip
env-4ea6feac5fe663fe82de53632883ced6205f57f8.tar.gz
env-4ea6feac5fe663fe82de53632883ced6205f57f8.tar.bz2
Check referenced/dirty bits
-rw-r--r--v/vm.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/v/vm.c b/v/vm.c
index 10fc0cd..a085577 100644
--- a/v/vm.c
+++ b/v/vm.c
@@ -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)