summaryrefslogtreecommitdiff
path: root/v/vm.c
diff options
context:
space:
mode:
Diffstat (limited to 'v/vm.c')
-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)