From 82bae0b314e42e4007d1c40cfc597b58992a0787 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Robert=20W=C4=99c=C5=82awski?= <r.weclawski@gmail.com>
Date: Sun, 17 Dec 2017 18:22:27 +0100
Subject: [PATCH] entry::set doesn't reset counter, counter mask is a const

---
 src/arch/x86_64/paging/entry.rs | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/arch/x86_64/paging/entry.rs b/src/arch/x86_64/paging/entry.rs
index 38ec68e4..f5d567fa 100644
--- a/src/arch/x86_64/paging/entry.rs
+++ b/src/arch/x86_64/paging/entry.rs
@@ -24,6 +24,7 @@ bitflags! {
 }
 
 pub const ADDRESS_MASK: usize = 0x000f_ffff_ffff_f000;
+pub const COUNTER_MASK: u64 = 0x3ff00000_00000000;
 
 impl Entry {
     /// Is the entry unused?
@@ -57,16 +58,16 @@ impl Entry {
 
     pub fn set(&mut self, frame: Frame, flags: EntryFlags) {
         debug_assert!(frame.start_address().get() & !ADDRESS_MASK == 0);
-        self.0 = (frame.start_address().get() as u64) | flags.bits();
+        self.0 = (frame.start_address().get() as u64) | flags.bits() | (self.0 & COUNTER_MASK);
     }
 
     /// Get bits 52-61 in entry, used as counter for page table
     pub fn counter_bits(&self) -> u64 {
-        (self.0 & 0x3ff00000_00000000) >> 52
+        (self.0 & COUNTER_MASK) >> 52
     }
 
     /// Set bits 52-61 in entry, used as counter for page table    
     pub fn set_counter_bits(&mut self, count: u64) {
-        self.0 = (self.0 & 0xc00fffff_ffffffff) | (count << 52);
+        self.0 = (self.0 & !COUNTER_MASK) | (count << 52);
     }
 }
-- 
GitLab