From 4ea6feac5fe663fe82de53632883ced6205f57f8 Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Sat, 14 Mar 2015 02:07:20 -0700 Subject: Check referenced/dirty bits --- v/vm.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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) -- cgit v1.1