Merge branch 'dyn_pc_integration' of ssh://wasabi.cs.wisc.edu/p/paradyn/development...
[dyninst.git] / proccontrol / src / freebsd.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 #if !defined(FREEBSD_H_)
32 #define FREEBSD_H_
33
34 #include "proccontrol/h/Generator.h"
35 #include "proccontrol/h/Event.h"
36 #include "proccontrol/h/Decoder.h"
37 #include "proccontrol/h/Handler.h"
38 #include "proccontrol/src/int_process.h"
39 #include "proccontrol/src/int_thread_db.h"
40 #include "proccontrol/src/unix.h"
41 #include "proccontrol/src/sysv.h"
42 #include "proccontrol/src/arch_process.h"
43
44 #include "common/h/dthread.h"
45
46 using namespace Dyninst;
47 using namespace ProcControlAPI;
48
49 class GeneratorFreeBSD : public GeneratorMT
50 {
51 public:
52     GeneratorFreeBSD();
53     virtual ~GeneratorFreeBSD();
54
55     virtual bool initialize();
56     virtual bool canFastHandle();
57     virtual ArchEvent *getEvent(bool block);
58 };
59
60 class ArchEventFreeBSD : public ArchEvent
61 {
62 public:
63     int status;
64     pid_t pid;
65     lwpid_t lwp;
66     bool interrupted;
67     int error;
68
69     ArchEventFreeBSD(bool inter_);
70     ArchEventFreeBSD(pid_t p, lwpid_t l, int s);
71     ArchEventFreeBSD(int e);
72
73     virtual ~ArchEventFreeBSD();
74 };
75
76 class DecoderFreeBSD : public Decoder
77 {
78 public:
79     DecoderFreeBSD();
80     virtual ~DecoderFreeBSD();
81     virtual unsigned getPriority() const;
82     virtual bool decode(ArchEvent *ae, std::vector<Event::ptr> &events);
83     Dyninst::Address adjustTrapAddr(Dyninst::Address address, Dyninst::Architecture arch);
84 };
85
86 class freebsd_process : public thread_db_process, public sysv_process, public unix_process, public arch_process
87 {
88 public:
89     freebsd_process(Dyninst::PID p, std::string e, std::vector<std::string> a, 
90             std::vector<std::string> envp, std::map<int, int> f);
91     freebsd_process(Dyninst::PID pid_, int_process *p);
92     virtual ~freebsd_process();
93
94     virtual bool plat_create();
95     virtual bool plat_attach();
96     virtual bool plat_forked();
97     virtual bool plat_execed();
98     virtual bool plat_detach();
99     virtual bool plat_terminate(bool &needs_sync);
100
101     virtual bool plat_readMem(int_thread *thr, void *local,
102                               Dyninst::Address remote, size_t size);
103     virtual bool plat_writeMem(int_thread *thr, const void *local,
104                                Dyninst::Address remote, size_t size);
105
106     virtual bool needIndividualThreadAttach();
107     virtual bool getThreadLWPs(std::vector<Dyninst::LWP> &lwps);
108     virtual Dyninst::Architecture getTargetArch();
109     virtual bool plat_individualRegAccess();
110     virtual bool plat_contProcess();
111     virtual bool plat_getOSRunningState(Dyninst::LWP lwp) const;
112
113     virtual bool post_attach();
114     virtual bool post_create();
115     virtual int getEventQueue();
116     virtual bool initKQueueEvents();
117     virtual SymbolReaderFactory *plat_defaultSymReader();
118
119     /* thread_db_process methods */
120     virtual const char *getThreadLibName(const char *symName);
121     virtual bool isSupportedThreadLib(string libName);
122     virtual bool plat_getLWPInfo(lwpid_t lwp, void *lwpInfo);
123     
124 protected:
125     string libThreadName;
126 };
127
128 class freebsd_thread : public thread_db_thread
129 {
130 public:
131     freebsd_thread(int_process *p, Dyninst::THR_ID t, Dyninst::LWP l);
132
133     freebsd_thread();
134     virtual ~freebsd_thread();
135
136     virtual bool plat_cont();
137     virtual bool plat_stop();
138     virtual bool plat_getAllRegisters(int_registerPool &reg);
139     virtual bool plat_getRegister(Dyninst::MachRegister reg, Dyninst::MachRegisterVal &val);
140     virtual bool plat_setAllRegisters(int_registerPool &reg);
141     virtual bool plat_setRegister(Dyninst::MachRegister reg, Dyninst::MachRegisterVal val);
142     virtual bool attach();
143     virtual bool plat_suspend();
144     virtual bool plat_resume();
145     virtual bool plat_needsEmulatedSingleStep(vector<Dyninst::Address> &) { return true; }
146     virtual bool plat_needsPCSaveBeforeSingleStep() { return false; }
147
148     /* FreeBSD-specific */
149     virtual bool plat_setStep();
150     void setBootstrapStop(bool b);
151     bool hasBootstrapStop() const;
152     void setPCBugCondition(bool b);
153     bool hasPCBugCondition() const;
154     void setPendingPCBugSignal(bool b);
155     bool hasPendingPCBugSignal() const;
156     void setSignalStopped(bool b);
157     bool isSignalStopped() const;
158
159 protected:
160     bool bootstrapStop;
161     bool pcBugCondition;
162     bool pendingPCBugSignal;
163     bool signalStopped;
164 };
165
166 class FreeBSDStopHandler : public Handler
167 {
168 public:
169     FreeBSDStopHandler();
170     virtual ~FreeBSDStopHandler();
171     virtual Handler::handler_ret_t handleEvent(Event::ptr ev);
172     virtual int getPriority() const;
173     void getEventTypesHandled(std::vector<EventType> &etypes);
174 };
175
176 #if defined(bug_freebsd_mt_suspend)
177 class FreeBSDPostStopHandler : public Handler
178 {
179 public:
180     FreeBSDPostStopHandler();
181     virtual ~FreeBSDPostStopHandler();
182     virtual Handler::handler_ret_t handleEvent(Event::ptr ev);
183     virtual int getPriority() const;
184     void getEventTypesHandled(std::vector<EventType> &etypes);
185 };
186
187 class FreeBSDBootstrapHandler : public Handler
188 {
189 public:
190     FreeBSDBootstrapHandler();
191     virtual ~FreeBSDBootstrapHandler();
192     virtual Handler::handler_ret_t handleEvent(Event::ptr ev);
193     virtual int getPriority() const;
194     void getEventTypesHandled(std::vector<EventType> &etypes);
195 };
196 #endif
197
198 #if defined(bug_freebsd_change_pc)
199 class FreeBSDChangePCHandler : public Handler
200 {
201 public:
202     FreeBSDChangePCHandler();
203     virtual ~FreeBSDChangePCHandler();
204     virtual Handler::handler_ret_t handleEvent(Event::ptr ev);
205     virtual int getPriority() const;
206     void getEventTypesHandled(std::vector<EventType> &etypes);
207 };
208 #endif
209
210 #endif