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