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