ptrace.h revision f0c5872637a63e28e3cd314cfc915c07f76df9c6
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/* Useful ptrace() utility functions. */
18501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
19501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#ifndef _CORKSCREW_PTRACE_H
20501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#define _CORKSCREW_PTRACE_H
21501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
22501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#include <corkscrew/map_info.h>
23501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#include <corkscrew/symbol_table.h>
24501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
25501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#include <sys/types.h>
26501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#include <stdbool.h>
27501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
28501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#ifdef __cplusplus
29501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brownextern "C" {
30501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#endif
31501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
32501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown/* Stores information about a process that is used for several different
33501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * ptrace() based operations. */
34501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Browntypedef struct {
35501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    map_info_t* map_info_list;
36501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown} ptrace_context_t;
37501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
38f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown/* Describes how to access memory from a process. */
39f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Browntypedef struct {
40f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown    pid_t tid;
41f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown    const map_info_t* map_info_list;
42f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown} memory_t;
43f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown
44501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#if __i386__
45501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown/* ptrace() register context. */
46501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Browntypedef struct pt_regs_x86 {
47501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t ebx;
48501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t ecx;
49501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t edx;
50501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t esi;
51501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t edi;
52501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t ebp;
53501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t eax;
54501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t xds;
55501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t xes;
56501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t xfs;
57501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t xgs;
58501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t orig_eax;
59501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t eip;
60501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t xcs;
61501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t eflags;
62501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t esp;
63501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown    uint32_t xss;
64501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown} pt_regs_x86_t;
65501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#endif
66501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
67501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown/*
68f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown * Initializes a memory structure for accessing memory from this process.
69f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown */
70f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brownvoid init_memory(memory_t* memory, const map_info_t* map_info_list);
71f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown
72f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown/*
73f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown * Initializes a memory structure for accessing memory from another process
74f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown * using ptrace().
75f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown */
76f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brownvoid init_memory_ptrace(memory_t* memory, pid_t tid);
77f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown
78f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown/*
79501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * Reads a word of memory safely.
80f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown * If the memory is local, ensures that the address is readable before dereferencing it.
81f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown * Returns false and a value of 0xffffffff if the word could not be read.
82f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown */
83f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brownbool try_get_word(const memory_t* memory, uintptr_t ptr, uint32_t* out_value);
84f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown
85f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown/*
86f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown * Reads a word of memory safely using ptrace().
87f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown * Returns false and a value of 0xffffffff if the word could not be read.
88501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown */
89f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brownbool try_get_word_ptrace(pid_t tid, uintptr_t ptr, uint32_t* out_value);
90501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
91501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown/*
92501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * Loads information needed for examining a remote process using ptrace().
93501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * The caller must already have successfully attached to the process
94501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * using ptrace().
95501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown *
96501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * The context can be used for any threads belonging to that process
97501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * assuming ptrace() is attached to them before performing the actual
98501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * unwinding.  The context can continue to be used to decode backtraces
99501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * even after ptrace() has been detached from the process.
100501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown */
101501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brownptrace_context_t* load_ptrace_context(pid_t pid);
102501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
103501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown/*
104501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * Frees a ptrace context.
105501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown */
106501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brownvoid free_ptrace_context(ptrace_context_t* context);
107501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
108501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown/*
109501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * Finds a symbol using ptrace.
110501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * Returns the containing map and information about the symbol, or
111501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * NULL if one or the other is not available.
112501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown */
113501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brownvoid find_symbol_ptrace(const ptrace_context_t* context,
114501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown        uintptr_t addr, const map_info_t** out_map_info, const symbol_t** out_symbol);
115501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
116501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#ifdef __cplusplus
117501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown}
118501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#endif
119501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown
120501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#endif // _CORKSCREW_PTRACE_H
121