diff options
author | Daniel Rosenberg <drosen@google.com> | 2014-08-29 14:21:12 -0700 |
---|---|---|
committer | Daniel Rosenberg <drosen@google.com> | 2014-08-29 21:54:36 +0000 |
commit | 4bf06a51869f49d7ee3fb0163a2517ec5e33ba1f (patch) | |
tree | 85d17126e049f3e87fc9243505068dedb285178c | |
parent | b63632828014d3bdac0d689591532fe78bc81bc7 (diff) | |
download | extras-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.c | 12 |
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; |