summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Rosenberg <drosen@google.com>2014-08-29 14:21:12 -0700
committerDaniel Rosenberg <drosen@google.com>2014-08-29 21:54:36 +0000
commit4bf06a51869f49d7ee3fb0163a2517ec5e33ba1f (patch)
tree85d17126e049f3e87fc9243505068dedb285178c
parentb63632828014d3bdac0d689591532fe78bc81bc7 (diff)
downloadextras-4bf06a51869f49d7ee3fb0163a2517ec5e33ba1f.tar.gz
libpagemap: Mask off page shift to get page frame number
see comment above pagemap_read() from the kernel Bug: 17332389 Change-Id: Iaec9a2c8d2783f5c1e7ba06d9c7156305abe0453 Signed-off-by: Daniel Rosenberg <drosen@google.com>
-rw-r--r--libpagemap/pm_process.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/libpagemap/pm_process.c b/libpagemap/pm_process.c
index 50791ef9..0994cede 100644
--- a/libpagemap/pm_process.c
+++ b/libpagemap/pm_process.c
@@ -30,6 +30,8 @@ static int read_maps(pm_process_t *proc);
#define MAX_FILENAME 64
+#define PFN_MASK 0x7fffffffffffff
+
int pm_process_create(pm_kernel_t *ker, pid_t pid, pm_process_t **proc_out) {
pm_process_t *proc;
char filename[MAX_FILENAME];
@@ -100,6 +102,11 @@ int pm_process_usage(pm_process_t *proc, pm_memusage_t *usage_out) {
return pm_process_usage_flags(proc, usage_out, 0, 0);
}
+static inline uint64_t get_pfn(uint64_t p)
+{
+ return p & PFN_MASK;
+}
+
int pm_process_pagemap_range(pm_process_t *proc,
uint64_t low, uint64_t high,
uint64_t **range_out, size_t *len) {
@@ -107,6 +114,7 @@ int pm_process_pagemap_range(pm_process_t *proc,
uint64_t numpages;
uint64_t *range;
off64_t off;
+ uint64_t i;
int error;
if (!proc || (low > high) || !range_out || !len)
@@ -144,6 +152,10 @@ int pm_process_pagemap_range(pm_process_t *proc,
return error;
}
+ for(i = 0; i < numpages; i++) {
+ range[i] = get_pfn(range[i]);
+ }
+
*range_out = range;
*len = numpages;