Fix instrumentation regressions for libc-2.29 on ARM (#653)
[dyninst.git] / dyninstAPI_RT / h / dyninstAPI_RT.h
1 /*
2  * See the dyninst/COPYRIGHT file for copyright information.
3  * 
4  * We provide the Paradyn Tools (below described as "Paradyn")
5  * on an AS IS basis, and do not warrant its validity or performance.
6  * We reserve the right to update, modify, or discontinue this
7  * software at any time.  We shall have no obligation to supply such
8  * updates or modifications or any other form of support to you.
9  * 
10  * By your use of Paradyn, you understand and agree that we (or any
11  * other person or entity with proprietary rights in Paradyn) are
12  * under no obligation to provide either maintenance services,
13  * update services, notices of latent defects, or correction of
14  * defects for Paradyn.
15  * 
16  * This library is free software; you can redistribute it and/or
17  * modify it under the terms of the GNU Lesser General Public
18  * License as published by the Free Software Foundation; either
19  * version 2.1 of the License, or (at your option) any later version.
20  * 
21  * This library is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24  * Lesser General Public License for more details.
25  * 
26  * You should have received a copy of the GNU Lesser General Public
27  * License along with this library; if not, write to the Free Software
28  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29  */
30
31 /*
32  * $Id: dyninstAPI_RT.h,v 1.45 2008/04/15 16:43:43 roundy Exp $
33  * This file contains the standard instrumentation functions that are provided
34  *   by the run-time instrumentation layer.
35  */
36
37 #ifndef _DYNINSTAPI_RT_H
38 #define _DYNINSTAPI_RT_H
39
40 /*
41  * Define the size of the per process data area.
42  *
43  *  This should be a power of two to reduce paging and caching shifts.
44  *  Note that larger sizes may result in requiring longjumps within
45  *  mini-trampolines to reach within this area.
46  */
47
48 #if !defined(target_smallmem)
49 #define SYN_INST_BUF_SIZE (1024*1024*4)
50 #else
51 #define SYN_INST_BUF_SIZE (1024*1024*1)
52 #endif
53
54 #define DYNINST_BREAKPOINT_SIGNUM (SIGRTMIN+4)
55
56 #include <stdio.h>
57 #include "dyninstRTExport.h"
58 #include "common/src/Types.h"
59
60 /* If we must make up a boolean type, we should make it unique */
61 typedef unsigned char RT_Boolean;
62 static const RT_Boolean RT_TRUE=1;
63 static const RT_Boolean RT_FALSE=0;
64
65 DLLEXPORT extern char gLoadLibraryErrorString[];
66 extern void *gBRKptr;
67
68 struct DYNINST_bootstrapStruct {
69    int event; /* "event" values:
70                  0 --> nothing
71                  1 --> end of DYNINSTinit (normal)
72                  2 --> end of DYNINSTinit (forked process)
73                  3 --> start of DYNINSTexec (before exec) 
74               */
75    int pid;
76    int ppid; /* parent of forked process */
77 };
78
79 typedef enum {DSE_undefined, DSE_forkEntry, DSE_forkExit, DSE_execEntry, DSE_execExit, DSE_exitEntry, DSE_loadLibrary, DSE_lwpExit, DSE_snippetBreakpoint, DSE_stopThread,
80 DSE_userMessage, DSE_dynFuncCall } DYNINST_synch_event_t;
81
82 extern int DYNINSTdebugPrintRT; /* control run-time lib debug/trace prints */
83 #if !defined(RTprintf)
84 #define RTprintf                if (DYNINSTdebugPrintRT) printf
85 #endif
86
87 #define TARGET_CACHE_WIDTH 128
88 #define TARGET_CACHE_WAYS 2
89
90 #define THREAD_AWAITING_DELETION -2
91
92 #define ERROR_STRING_LENGTH 256
93 typedef enum {
94   rtBPatch_nullEvent,
95   rtBPatch_newConnectionEvent,
96   rtBPatch_internalShutDownEvent,
97   rtBPatch_threadCreateEvent,
98   rtBPatch_threadDestroyEvent,
99   rtBPatch_dynamicCallEvent,
100   rtBPatch_userEvent
101 } rtBPatch_asyncEventType;
102 char *asyncEventType2str(rtBPatch_asyncEventType);
103
104 typedef struct {
105   unsigned int pid;
106   rtBPatch_asyncEventType type;
107   unsigned int event_fd;
108   unsigned int size;
109 } rtBPatch_asyncEventRecord;
110
111
112 typedef struct {
113   void *call_site_addr;
114   void *call_target;
115 } BPatch_dynamicCallRecord;
116
117 typedef struct {
118    int ppid;         /*Parent process's pid*/
119    dyntid_t tid;     /*Thread library ID for thread*/
120    int lwp;          /*OS id for thread*/
121    int index;        /*The dyninst index for this thread*/
122    void *stack_addr; /*The top of this thread's stack*/
123    void *start_pc;   /*The pc of this threads initial function*/
124 } BPatch_newThreadEventRecord;
125
126 #if defined(arch_x86_64) /* cannot use MUTATEE_32 here b/c libdyninstAPI.so compiles this */
127 /*these are the 32 bit structures for use with 32 bit mutatees on AMD64*/
128 typedef struct {
129   unsigned int call_site_addr;
130   unsigned int call_target;
131 } BPatch_dynamicCallRecord32;
132
133 typedef struct {
134    int ppid;         /*Parent process's pid*/
135    unsigned int tid;     /*Thread library ID for thread*/
136    int lwp;          /*OS id for thread*/
137    int index;        /*The dyninst index for this thread*/
138    unsigned int stack_addr; /*The top of this thread's stack*/
139    unsigned int start_pc;   /*The pc of this threads initial function*/
140 } BPatch_newThreadEventRecord32;
141 #endif
142
143
144 typedef struct {
145    int index;        /*Index of the dead thread*/
146 } BPatch_deleteThreadEventRecord;
147
148 /* Let's define some constants for, well, everything.... */
149 /* These should be different to avoid unexpected collisions */
150
151 #if !defined(DYNINST_SINGLETHREADED)
152 #define DYNINST_SINGLETHREADED -128
153 #endif
154 #define DYNINST_TRACEPIPE_ERRVAL -1
155 #define DYNINST_PRINTF_ERRVAL -2
156
157 #define DYNINST_NOT_IN_HASHTABLE ((unsigned)-1)
158
159 DLLEXPORT extern int DYNINST_break_point_event;
160
161 typedef struct {
162    void *source;
163    void *target;
164 } trapMapping_t;
165
166 #define TRAP_HEADER_SIG 0x759191D6
167 #define DT_DYNINST 0x6D191957
168
169 #if defined(_MSC_VER)
170 #pragma warning(disable:4200)
171 #endif
172 struct trap_mapping_header {
173    uint32_t signature;
174    uint32_t num_entries;
175    int32_t pos;
176   uint32_t padding;
177    uint64_t low_entry;
178    uint64_t high_entry;
179    trapMapping_t traps[]; //Don't change this to a pointer, despite any compiler warnings
180 };
181
182 #define MAX_MEMORY_MAPPER_ELEMENTS 1024
183
184 typedef struct {
185     long start;
186     long size;
187 } MemoryMapperCopyElement;
188
189 typedef struct {
190    unsigned long lo;
191    unsigned long hi;
192    long shift;
193    MemoryMapperCopyElement *copyList;
194 } MemoryMapperElement;
195
196 struct MemoryMapper {
197    int guard1;
198    int guard2;
199    int size;
200    int padding;
201    MemoryMapperElement elements[MAX_MEMORY_MAPPER_ELEMENTS];
202 };
203
204 /* 32/64 bit versions for the mutator */
205
206 typedef struct {
207    uint32_t lo;
208    uint32_t hi;
209    uint32_t shift;
210    void *copyList;
211 } MemoryMapperElement32;
212
213 typedef struct {
214    uint64_t lo;
215    uint64_t hi;
216    uint64_t shift;
217    void *copyList;
218 } MemoryMapperElement64;
219
220 struct MemoryMapper32 {
221    int guard1;
222    int guard2;
223    int size;
224    int padding;
225    MemoryMapperElement32 elements[MAX_MEMORY_MAPPER_ELEMENTS];
226 };
227
228 struct MemoryMapper64 {
229    int guard1;
230    int guard2;
231    int size;
232    int padding;
233    MemoryMapperElement64 elements[MAX_MEMORY_MAPPER_ELEMENTS];
234 };
235
236 DLLEXPORT extern struct MemoryMapper RTmemoryMapper;
237
238 extern int RTuntranslatedEntryCounter;
239
240 #include "dyninstRTExport.h"
241 #endif /* _DYNINSTAPI_RT_H */