From 4bf06a51869f49d7ee3fb0163a2517ec5e33ba1f Mon Sep 17 00:00:00 2001 From: Daniel Rosenberg Date: Fri, 29 Aug 2014 14:21:12 -0700 Subject: 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 --- libpagemap/pm_process.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'libpagemap/pm_process.c') 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; -- cgit v1.2.3