+void Process::reset_soft_dirty()
+{
+ if (this->clear_refs_fd_ < 0) {
+ this->clear_refs_fd_ = open_process_file(pid_, "clear_refs", O_WRONLY|O_CLOEXEC);
+ if (this->clear_refs_fd_ < 0)
+ xbt_die("Could not open clear_refs file for soft-dirty tracking. Run as root?");
+ }
+ if(::write(this->clear_refs_fd_, "4\n", 2) != 2)
+ xbt_die("Could not reset softdirty bits");
+}
+
+void Process::read_pagemap(uint64_t* pagemap, size_t page_start, size_t page_count)
+{
+ if (pagemap_fd_ < 0) {
+ pagemap_fd_ = open_process_file(pid_, "pagemap", O_RDONLY|O_CLOEXEC);
+ if (pagemap_fd_ < 0)
+ xbt_die("Could not open pagemap file for soft-dirty tracking. Run as root?");
+ }
+ ssize_t bytesize = sizeof(uint64_t) * page_count;
+ off_t offset = sizeof(uint64_t) * page_start;
+ if (pread_whole(pagemap_fd_, pagemap, bytesize, offset) != bytesize)
+ xbt_die("Could not read pagemap");
+}
+