1e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/*
2e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *
4e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * you may not use this file except in compliance with the License.
6e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * You may obtain a copy of the License at
7e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *
8e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *
10e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * See the License for the specific language governing permissions and
14e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * limitations under the License.
15e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project */
16e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
17e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#ifndef _PAGEMAP_PAGEMAP_H
18e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define _PAGEMAP_PAGEMAP_H
19e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
20e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdint.h>
21e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdio.h>
22e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <sys/types.h>
23e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
24e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projecttypedef struct pm_memusage pm_memusage_t;
25e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
26e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Holds the various metrics for memory usage of a process or a mapping. */
27e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstruct pm_memusage {
28e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    size_t vss;
29e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    size_t rss;
30e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    size_t pss;
31e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    size_t uss;
32e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project};
33e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
34e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Clears a memusage. */
35e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectvoid pm_memusage_zero(pm_memusage_t *mu);
36e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Adds one memusage (a) to another (b). */
37e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectvoid pm_memusage_add(pm_memusage_t *a, pm_memusage_t *b);
38e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
39e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projecttypedef struct pm_kernel   pm_kernel_t;
40e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projecttypedef struct pm_process  pm_process_t;
41e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projecttypedef struct pm_map      pm_map_t;
42e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
43e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* pm_kernel_t holds the state necessary to interface to the kernel's pagemap
44e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * system on a global level. */
45e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstruct pm_kernel {
46e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    int kpagecount_fd;
47e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    int kpageflags_fd;
48e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
49e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    int pagesize;
50e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project};
51e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
52e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* pm_process_t holds the state necessary to interface to a particular process'
53e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * pagemap. */
54e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstruct pm_process {
55e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pm_kernel_t *ker;
56e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
57e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pid_t pid;
58e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
59e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pm_map_t **maps;
60e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    int num_maps;
61e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
62e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    int pagemap_fd;
63e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project};
64e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
65e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* pm_map_t holds the state necessary to access information about a particular
66e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * mapping in a particular process. */
67e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstruct pm_map {
68e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    pm_process_t *proc;
69e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
70e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    unsigned long start;
71e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    unsigned long end;
72e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    unsigned long offset;
73e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    int flags;
74e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
75e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    char *name;
76e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project};
77e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
78e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Create a pm_kernel_t. */
79e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_kernel_create(pm_kernel_t **ker_out);
80e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
81e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define pm_kernel_pagesize(ker) ((ker)->pagesize)
82e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
83e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Get a list of probably-existing PIDs (returned through *pids_out).
84e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Length of the array (in sizeof(pid_t) units) is returned through *len.
85e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * The array should be freed by the caller. */
86e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_kernel_pids(pm_kernel_t *ker, pid_t **pids_out, size_t *len);
87e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
88e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Get the map count (from /proc/kpagecount) of a physical frame.
89e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * The count is returned through *count_out. */
90e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_kernel_count(pm_kernel_t *ker, unsigned long pfn, uint64_t *count_out);
91e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
92e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Get the page flags (from /proc/kpageflags) of a physical frame.
93e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * The count is returned through *flags_out. */
94e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_kernel_flags(pm_kernel_t *ker, unsigned long pfn, uint64_t *flags_out);
95e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
96e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGE_LOCKED     (1 <<  0)
97e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGE_ERROR      (1 <<  1)
98e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGE_REFERENCED (1 <<  2)
99e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGE_UPTODATE   (1 <<  3)
100e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGE_DIRTY      (1 <<  4)
101e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGE_LRU        (1 <<  5)
102e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGE_ACTIVE     (1 <<  6)
103e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGE_SLAB       (1 <<  7)
104e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGE_WRITEBACK  (1 <<  8)
105e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGE_RECLAIM    (1 <<  9)
106e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGE_BUDDY      (1 << 10)
107e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
108e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Destroy a pm_kernel_t. */
109e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_kernel_destroy(pm_kernel_t *ker);
110e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
111e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Get the PID of a pm_process_t. */
112e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define pm_process_pid(proc) ((proc)->pid)
113e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
114e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Create a pm_process_t and returns it through *proc_out.
115e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Takes a pm_kernel_t, and the PID of the process. */
116e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_process_create(pm_kernel_t *ker, pid_t pid, pm_process_t **proc_out);
117e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
118e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Get the total memory usage of a process and store in *usage_out. */
119e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_process_usage(pm_process_t *proc, pm_memusage_t *usage_out);
120e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
121e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Get the working set of a process (if ws_out != NULL), and reset it
122e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * (if reset != 0). */
123e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_process_workingset(pm_process_t *proc, pm_memusage_t *ws_out, int reset);
124e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
125e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Get the PFNs corresponding to a range of virtual addresses.
126e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * The array of PFNs is returned through *range_out, and the caller has the
127e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * responsibility to free it. */
128e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_process_pagemap_range(pm_process_t *proc,
129e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                             unsigned long low, unsigned long hi,
130e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                             uint64_t **range_out, size_t *len);
131e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
13276e6cb55fed01824e44306aa0485a3f8f122b228Selim Gurun#define _BITS(x, offset, bits) (((x) >> offset) & ((1LL << (bits)) - 1))
133e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
134e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGEMAP_PRESENT(x)     (_BITS(x, 63, 1))
13576e6cb55fed01824e44306aa0485a3f8f122b228Selim Gurun#define PM_PAGEMAP_SWAPPED(x)     (_BITS(x, 62, 1))
136e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGEMAP_SHIFT(x)       (_BITS(x, 55, 6))
137e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGEMAP_PFN(x)         (_BITS(x, 0, 55))
138e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGEMAP_SWAP_OFFSET(x) (_BITS(x, 5, 50))
139e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_PAGEMAP_SWAP_TYPE(x)   (_BITS(x, 0,  5))
140e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
141e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Get the maps in the virtual address space of this process.
142e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Returns an array of pointers to pm_map_t through *maps.
143e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * The array should be freed by the caller, but the maps should not be
144e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * modified or destroyed. */
145e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_process_maps(pm_process_t *proc, pm_map_t ***maps_out, size_t *len);
146e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
147e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Destroy a pm_process_t. */
148e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_process_destroy(pm_process_t *proc);
149e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
150e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Get the name, flags, start/end address, or offset of a map. */
151e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define pm_map_name(map)   ((map)->name)
152e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define pm_map_flags(map)  ((map)->flags)
153e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_MAP_READ  1
154e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_MAP_WRITE 2
155e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define PM_MAP_EXEC  4
156e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define pm_map_start(map)  ((map)->start)
157e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define pm_map_end(map)    ((map)->end)
158e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#define pm_map_offset(map) ((map)->offset)
159e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
160e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Get the PFNs of the pages in the virtual address space of this map.
161e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Array of PFNs is returned through *pagemap_out, and should be freed by the
162e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * caller. */
163e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_map_pagemap(pm_map_t *map, uint64_t **pagemap_out, size_t *len);
164e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
165e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Get the memory usage of this map alone. */
166e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_map_usage(pm_map_t *map, pm_memusage_t *usage_out);
167e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
168e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* Get the working set of this map alone. */
169e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint pm_map_workingset(pm_map_t *map, pm_memusage_t *ws_out);
170e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
171e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif
172