Update copyright to LGPL on all files
[dyninst.git] / dyninstAPI / src / linux.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 // $Id: linux.h,v 1.37 2007/12/04 18:05:24 legendre Exp $
33
34 #if !defined(os_linux)
35 #error "invalid architecture-os inclusion"
36 #endif
37
38
39 #ifndef LINUX_PD_HDR
40 #define LINUX_PD_HDR
41
42 class process;
43
44 #include <sys/param.h>
45 #include <pthread.h>
46 #include "common/h/Types.h"
47 #include "common/h/Vector.h"
48
49 #if !defined( ia64_unknown_linux2_4 )
50 #define BYTES_TO_SAVE   256
51 #else
52 /* More than the number of bundles necessary for loadDYNINSTlib()'s code. */
53 #define CODE_BUFFER_SIZE        512
54 #define BYTES_TO_SAVE           (CODE_BUFFER_SIZE * 16)
55 #endif
56
57 #define EXIT_NAME "_exit"
58
59 #if !defined(arch_x86_64)
60 #define SIGNAL_HANDLER   "__restore"
61 #else
62 #define SIGNAL_HANDLER   "__restore_rt"
63 #endif
64
65 #if defined(arch_x86) || defined(arch_x86_64)
66 //Constant values used for the registers in the vsyscall page.
67 #define DW_CFA  0
68 #define DW_ESP 4
69 #define DW_EBP 5
70 #define DW_PC  8
71 #if 0
72 #define DW_RSP 7
73 #define DW_RBP 6
74 #define DW_PC  16
75 #endif
76
77 #define MAX_DW_VALUE 17
78
79 Address getRegValueAtFrame(void *ehf, Address pc, int reg, 
80                            Address *reg_map,
81                            process *p, bool *error);
82 #endif
83
84 typedef int handleT; // a /proc file descriptor
85
86 #if defined( ia64_unknown_linux2_4 )
87 #include "linux-ia64.h"
88 #elif defined(i386_unknown_linux2_0) \
89    || defined(x86_64_unknown_linux2_4)
90 #include "linux-x86.h"
91 #elif defined(os_linux) && defined(arch_power)
92 #include "linux-power.h"
93 #else
94 #error Invalid or unknown architecture-os inclusion
95 #endif
96
97 #include "unix.h"
98
99 class process;
100
101 /* For linux.C */
102 void printRegs( void * save );
103 Address findFunctionToHijack( process * p );
104
105 #ifndef WNOWAIT
106 #define WNOWAIT WNOHANG
107 #endif
108 bool get_linux_version(int &major, int &minor, int &subvers);
109 bool get_linux_version(int &major, int &minor, int &subvers, int &subsubvers);
110
111 bool attachToChild(int pid);
112
113 void calcVSyscallFrame(process *p);
114 struct maps_entries *getLinuxMaps(int pid, unsigned &maps_size);
115
116 //  no /proc, dummy function
117 typedef int procProcStatus_t;
118
119 #define PREMS_PRIVATE (1 << 4)
120 #define PREMS_SHARED  (1 << 3)
121 #define PREMS_READ    (1 << 2)
122 #define PREMS_WRITE   (1 << 1)
123 #define PREMS_EXEC    (1 << 0)
124
125 #define INDEPENDENT_LWP_CONTROL true
126
127 class SignalGenerator;
128 class eventLock;
129
130 typedef struct waitpid_ret_pair {
131    int pid;
132    int status;
133 } waitpid_ret_pair_t;
134
135 typedef struct pid_generator_pair {
136    int pid;
137    SignalGenerator *sg;
138 } pid_generator_pair_t;
139
140 class WaitpidMux {
141
142   public:
143    int waitpid(SignalGenerator *me, int *status);
144    
145    bool registerProcess(SignalGenerator *me); 
146    bool registerLWP(unsigned lwp_id, SignalGenerator *me);
147    bool unregisterLWP(unsigned lwp_id, SignalGenerator *me);
148    bool unregisterProcess(SignalGenerator *me);
149    void forceWaitpidReturn();
150    bool suppressWaitpidActivity();
151    bool resumeWaitpidActivity();
152    int enqueueWaitpidValue(waitpid_ret_pair ev, SignalGenerator *event_owner);
153
154    pthread_mutex_t waiter_mutex;
155    pthread_cond_t waiter_condvar;
156
157    WaitpidMux() :
158      isInWaitpid(false),
159      isInWaitLock(false),
160      waitpid_thread_id(0L),
161      forcedExit(false),
162      pause_flag(false),
163      waiter_exists(0)
164    {}
165
166   private:
167    bool isInWaitpid;
168    bool isInWaitLock;
169    unsigned long waitpid_thread_id;
170    bool forcedExit;
171    bool pause_flag;
172    pdvector<waitpid_ret_pair> unassigned_events;
173    pdvector<SignalGenerator *> first_timers;
174
175    volatile int waiter_exists;
176    pdvector<pid_generator_pair_t> pidgens;
177    void addPidGen(int pid, SignalGenerator *sg);
178    void removePidGen(int pid, SignalGenerator *sg);
179    void removePidGen(SignalGenerator *sg);
180    bool hasFirstTimer(SignalGenerator *me);
181 };
182
183 #endif