1501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown/*
2501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * Copyright (C) 2011 The Android Open Source Project
3501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown *
4501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
5501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * you may not use this file except in compliance with the License.
6501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * You may obtain a copy of the License at
7501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown *
8501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
9501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown *
10501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * Unless required by applicable law or agreed to in writing, software
11501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
12501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * See the License for the specific language governing permissions and
14501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * limitations under the License.
15501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown */
16501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
17501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown/* Process memory map. */
18501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
19501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#ifndef _CORKSCREW_MAP_INFO_H
20501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#define _CORKSCREW_MAP_INFO_H
21501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
22501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#include <sys/types.h>
23501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#include <stdbool.h>
24420a7fa82d0fba6516d76d6024728de010b1cb8dElliott Hughes#include <stdint.h>
25501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
26501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#ifdef __cplusplus
27501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brownextern "C" {
28501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#endif
29501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
30501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Browntypedef struct map_info {
31501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    struct map_info* next;
32501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uintptr_t start;
33501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uintptr_t end;
34f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown    bool is_readable;
35501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    bool is_executable;
36501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    void* data; // arbitrary data associated with the map by the user, initially NULL
37501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    char name[];
38501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown} map_info_t;
39501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
40501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown/* Loads memory map from /proc/<tid>/maps. */
41501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brownmap_info_t* load_map_info_list(pid_t tid);
42501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
43501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown/* Frees memory map. */
44501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brownvoid free_map_info_list(map_info_t* milist);
45501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
46501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown/* Finds the memory map that contains the specified address. */
47501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brownconst map_info_t* find_map_info(const map_info_t* milist, uintptr_t addr);
48501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
49f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown/* Returns true if the addr is in an readable map. */
50f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brownbool is_readable_map(const map_info_t* milist, uintptr_t addr);
51f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown
52f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown/* Returns true if the addr is in an executable map. */
53f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brownbool is_executable_map(const map_info_t* milist, uintptr_t addr);
54f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown
55f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown/* Acquires a reference to the memory map for this process.
56f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown * The result is cached and refreshed automatically.
57f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown * Make sure to release the map info when done. */
58f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brownmap_info_t* acquire_my_map_info_list();
59f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown
60f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown/* Releases a reference to the map info for this process that was
61f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown * previous acquired using acquire_my_map_info_list(). */
62f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brownvoid release_my_map_info_list(map_info_t* milist);
63501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
64501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#ifdef __cplusplus
65501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown}
66501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#endif
67501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
68501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#endif // _CORKSCREW_MAP_INFO_H
69