1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 /* Useful ptrace() utility functions. */ 18 19 #ifndef _CORKSCREW_PTRACE_H 20 #define _CORKSCREW_PTRACE_H 21 22 #include <corkscrew/map_info.h> 23 #include <corkscrew/symbol_table.h> 24 25 #include <sys/types.h> 26 #include <stdbool.h> 27 #include <stdint.h> 28 29 #ifdef __cplusplus 30 extern "C" { 31 #endif 32 33 /* Stores information about a process that is used for several different 34 * ptrace() based operations. */ 35 typedef struct { 36 map_info_t* map_info_list; 37 } ptrace_context_t; 38 39 /* Describes how to access memory from a process. */ 40 typedef struct { 41 pid_t tid; 42 const map_info_t* map_info_list; 43 } memory_t; 44 45 #if __i386__ 46 /* ptrace() register context. */ 47 typedef struct pt_regs_x86 { 48 uint32_t ebx; 49 uint32_t ecx; 50 uint32_t edx; 51 uint32_t esi; 52 uint32_t edi; 53 uint32_t ebp; 54 uint32_t eax; 55 uint32_t xds; 56 uint32_t xes; 57 uint32_t xfs; 58 uint32_t xgs; 59 uint32_t orig_eax; 60 uint32_t eip; 61 uint32_t xcs; 62 uint32_t eflags; 63 uint32_t esp; 64 uint32_t xss; 65 } pt_regs_x86_t; 66 #endif 67 68 #if __mips__ 69 /* ptrace() GET_REGS context. */ 70 typedef struct pt_regs_mips { 71 uint64_t regs[32]; 72 uint64_t lo; 73 uint64_t hi; 74 uint64_t cp0_epc; 75 uint64_t cp0_badvaddr; 76 uint64_t cp0_status; 77 uint64_t cp0_cause; 78 } pt_regs_mips_t; 79 #endif 80 81 /* 82 * Initializes a memory structure for accessing memory from this process. 83 */ 84 void init_memory(memory_t* memory, const map_info_t* map_info_list); 85 86 /* 87 * Initializes a memory structure for accessing memory from another process 88 * using ptrace(). 89 */ 90 void init_memory_ptrace(memory_t* memory, pid_t tid); 91 92 /* 93 * Reads a word of memory safely. 94 * If the memory is local, ensures that the address is readable before dereferencing it. 95 * Returns false and a value of 0xffffffff if the word could not be read. 96 */ 97 bool try_get_word(const memory_t* memory, uintptr_t ptr, uint32_t* out_value); 98 99 /* 100 * Reads a word of memory safely using ptrace(). 101 * Returns false and a value of 0xffffffff if the word could not be read. 102 */ 103 bool try_get_word_ptrace(pid_t tid, uintptr_t ptr, uint32_t* out_value); 104 105 /* 106 * Loads information needed for examining a remote process using ptrace(). 107 * The caller must already have successfully attached to the process 108 * using ptrace(). 109 * 110 * The context can be used for any threads belonging to that process 111 * assuming ptrace() is attached to them before performing the actual 112 * unwinding. The context can continue to be used to decode backtraces 113 * even after ptrace() has been detached from the process. 114 */ 115 ptrace_context_t* load_ptrace_context(pid_t pid); 116 117 /* 118 * Frees a ptrace context. 119 */ 120 void free_ptrace_context(ptrace_context_t* context); 121 122 /* 123 * Finds a symbol using ptrace. 124 * Returns the containing map and information about the symbol, or 125 * NULL if one or the other is not available. 126 */ 127 void find_symbol_ptrace(const ptrace_context_t* context, 128 uintptr_t addr, const map_info_t** out_map_info, const symbol_t** out_symbol); 129 130 #ifdef __cplusplus 131 } 132 #endif 133 134 #endif // _CORKSCREW_PTRACE_H 135