2 * Copyright 2016, Rene Gollent, rene@gollent.com.
3 * Distributed under the terms of the MIT License.
5 #ifndef REMOTE_DEBUG_REQUEST_H
6 #define REMOTE_DEBUG_REQUEST_H
10 #include <Referenceable.h>
15 enum remote_request_type
{
17 REMOTE_REQUEST_TYPE_READ_MEMORY
= 0,
18 REMOTE_REQUEST_TYPE_WRITE_MEMORY
,
19 REMOTE_REQUEST_TYPE_SET_TEAM_FLAGS
,
20 REMOTE_REQUEST_TYPE_SET_THREAD_FLAGS
,
21 REMOTE_REQUEST_TYPE_CONTINUE_THREAD
,
22 REMOTE_REQUEST_TYPE_STOP_THREAD
,
23 REMOTE_REQUEST_TYPE_SINGLE_STEP_THREAD
,
24 REMOTE_REQUEST_TYPE_GET_CPU_STATE
,
25 REMOTE_REQUEST_TYPE_SET_CPU_STATE
,
26 REMOTE_REQUEST_TYPE_INSTALL_BREAKPOINT
,
27 REMOTE_REQUEST_TYPE_UNINSTALL_BREAKPOINT
,
28 REMOTE_REQUEST_TYPE_INSTALL_WATCHPOINT
,
29 REMOTE_REQUEST_TYPE_UNINSTALL_WATCHPOINT
,
30 REMOTE_REQUEST_TYPE_PREPARE_HANDOVER
,
31 REMOTE_REQUEST_TYPE_WRITE_CORE_FILE
,
33 // team information requests
34 REMOTE_REQUEST_TYPE_GET_TEAM_INFO
,
35 REMOTE_REQUEST_TYPE_GET_THREAD_INFOS
,
36 REMOTE_REQUEST_TYPE_GET_IMAGE_INFOS
,
37 REMOTE_REQUEST_TYPE_GET_AREA_INFOS
,
38 REMOTE_REQUEST_TYPE_GET_SEM_INFOS
,
39 REMOTE_REQUEST_TYPE_GET_SYMBOL_INFOS
,
40 REMOTE_REQUEST_TYPE_GET_SYMBOL_INFO
,
41 REMOTE_REQUEST_TYPE_GET_THREAD_INFO
,
42 REMOTE_REQUEST_TYPE_GET_MEMORY_PROPERTIES
51 class RemoteDebugRequest
: public BReferenceable
{
54 virtual ~RemoteDebugRequest();
56 virtual remote_request_type
Type() const = 0;
58 status_t
LoadFromMessage(const BMessage
& data
);
59 status_t
SaveToMessage(BMessage
& _output
) const;
61 Architecture
* GetArchitecture() const
62 { return fArchitecture
; }
63 void SetArchitecture(Architecture
* architecture
);
66 virtual status_t
LoadSpecificInfoFromMessage(
67 const BMessage
& data
) = 0;
68 virtual status_t
SaveSpecificInfoToMessage(
69 BMessage
& _output
) const = 0;
72 Architecture
* fArchitecture
;
76 class RemoteDebugResponse
: public BReferenceable
{
78 RemoteDebugResponse();
79 virtual ~RemoteDebugResponse();
81 void SetRequestInfo(RemoteDebugRequest
* request
,
84 RemoteDebugRequest
* Request() const { return fRequest
; }
85 Architecture
* GetArchitecture() const
86 { return fRequest
->GetArchitecture(); }
88 status_t
LoadFromMessage(const BMessage
& data
);
89 status_t
SaveToMessage(BMessage
& _output
) const;
91 status_t
Result() const { return fResult
; }
92 bool Succeeded() const { return fResult
== B_OK
; }
95 // for requests that respond with additional
96 // information beyond a simple success/failure,
97 // a subclass must be implemented that provides
98 // versions of the functions below to save/
99 // and restore the corresponding additional
100 // data. Requests that merely return a status
101 // code can simply instantiate the basic
102 // response class as is.
103 virtual status_t
LoadSpecificInfoFromMessage(const BMessage
& data
);
104 virtual status_t
SaveSpecificInfoToMessage(BMessage
& _output
) const;
107 RemoteDebugRequest
* fRequest
;
112 // #pragma mark - Requests
115 class RemoteDebugReadMemoryRequest
: public RemoteDebugRequest
{
117 RemoteDebugReadMemoryRequest();
118 virtual ~RemoteDebugReadMemoryRequest();
120 void SetTo(target_addr_t address
,
123 target_addr_t
Address() const { return fAddress
; }
124 target_size_t
Size() const { return fSize
; }
126 virtual remote_request_type
Type() const;
129 virtual status_t
LoadSpecificInfoFromMessage(
130 const BMessage
& data
);
131 virtual status_t
SaveSpecificInfoToMessage(
132 BMessage
& _output
) const;
135 target_addr_t fAddress
;
140 class RemoteDebugWriteMemoryRequest
: public RemoteDebugRequest
{
142 RemoteDebugWriteMemoryRequest();
143 virtual ~RemoteDebugWriteMemoryRequest();
145 status_t
SetTo(target_addr_t address
,
146 const void* data
, target_size_t size
);
148 target_addr_t
Address() const { return fAddress
; }
149 const void* Data() const { return fData
; }
150 target_size_t
Size() const { return fSize
; }
152 virtual remote_request_type
Type() const;
155 virtual status_t
LoadSpecificInfoFromMessage(
156 const BMessage
& data
);
157 virtual status_t
SaveSpecificInfoToMessage(
158 BMessage
& _output
) const;
161 target_addr_t fAddress
;
167 class RemoteDebugSetTeamFlagsRequest
: public RemoteDebugRequest
{
169 RemoteDebugSetTeamFlagsRequest();
170 virtual ~RemoteDebugSetTeamFlagsRequest();
172 void SetTo(int32 flags
);
174 int32
Flags() const { return fFlags
; }
176 virtual remote_request_type
Type() const;
179 virtual status_t
LoadSpecificInfoFromMessage(
180 const BMessage
& data
);
181 virtual status_t
SaveSpecificInfoToMessage(
182 BMessage
& _output
) const;
189 class RemoteDebugSetThreadFlagsRequest
: public RemoteDebugRequest
{
191 RemoteDebugSetThreadFlagsRequest();
192 virtual ~RemoteDebugSetThreadFlagsRequest();
194 void SetTo(thread_id thread
, int32 flags
);
196 thread_id
Thread() const { return fThread
; }
197 int32
Flags() const { return fFlags
; }
199 virtual remote_request_type
Type() const;
202 virtual status_t
LoadSpecificInfoFromMessage(
203 const BMessage
& data
);
204 virtual status_t
SaveSpecificInfoToMessage(
205 BMessage
& _output
) const;
213 // abstract base for the various thread actions, as those all
214 // take a thread ID as a parameter and have no special response
215 // requirements, with only the action to be taken differing.
216 class RemoteDebugThreadActionRequest
: public RemoteDebugRequest
{
218 RemoteDebugThreadActionRequest();
219 virtual ~RemoteDebugThreadActionRequest();
221 void SetTo(thread_id thread
);
223 thread_id
Thread() const { return fThread
; }
226 virtual status_t
LoadSpecificInfoFromMessage(
227 const BMessage
& data
);
228 virtual status_t
SaveSpecificInfoToMessage(
229 BMessage
& _output
) const;
236 class RemoteDebugContinueThreadRequest
237 : public RemoteDebugThreadActionRequest
{
239 RemoteDebugContinueThreadRequest();
240 virtual ~RemoteDebugContinueThreadRequest();
242 virtual remote_request_type
Type() const;
246 class RemoteDebugStopThreadRequest
247 : public RemoteDebugThreadActionRequest
{
249 RemoteDebugStopThreadRequest();
250 virtual ~RemoteDebugStopThreadRequest();
252 virtual remote_request_type
Type() const;
256 class RemoteDebugSingleStepThreadRequest
257 : public RemoteDebugThreadActionRequest
{
259 RemoteDebugSingleStepThreadRequest();
260 virtual ~RemoteDebugSingleStepThreadRequest();
262 virtual remote_request_type
Type() const;
266 class RemoteDebugGetCpuStateRequest
267 : public RemoteDebugThreadActionRequest
{
269 RemoteDebugGetCpuStateRequest();
270 virtual ~RemoteDebugGetCpuStateRequest();
272 virtual remote_request_type
Type() const;
276 class RemoteDebugSetCpuStateRequest
: public RemoteDebugRequest
{
278 RemoteDebugSetCpuStateRequest();
279 virtual ~RemoteDebugSetCpuStateRequest();
281 void SetTo(thread_id thread
, CpuState
* state
);
283 thread_id
Thread() const { return fThread
; }
285 virtual remote_request_type
Type() const;
288 virtual status_t
LoadSpecificInfoFromMessage(
289 const BMessage
& data
);
290 virtual status_t
SaveSpecificInfoToMessage(
291 BMessage
& _output
) const;
299 // abstract base for the various actions that influence how the CPU
300 // reacts to a particular memory address, ergo break/watchpoints.
301 class RemoteDebugAddressActionRequest
: public RemoteDebugRequest
{
303 RemoteDebugAddressActionRequest();
304 virtual ~RemoteDebugAddressActionRequest();
306 void SetTo(target_addr_t address
);
308 target_addr_t
Address() const { return fAddress
; }
311 virtual status_t
LoadSpecificInfoFromMessage(
312 const BMessage
& data
);
313 virtual status_t
SaveSpecificInfoToMessage(
314 BMessage
& _output
) const;
317 target_addr_t fAddress
;
321 class RemoteDebugInstallBreakpointRequest
322 : public RemoteDebugAddressActionRequest
{
324 RemoteDebugInstallBreakpointRequest();
325 virtual ~RemoteDebugInstallBreakpointRequest();
327 virtual remote_request_type
Type() const;
331 class RemoteDebugUninstallBreakpointRequest
332 : public RemoteDebugAddressActionRequest
{
334 RemoteDebugUninstallBreakpointRequest();
335 virtual ~RemoteDebugUninstallBreakpointRequest();
337 virtual remote_request_type
Type() const;
341 class RemoteDebugInstallWatchpointRequest
: public RemoteDebugRequest
{
343 RemoteDebugInstallWatchpointRequest();
344 virtual ~RemoteDebugInstallWatchpointRequest();
346 void SetTo(target_addr_t address
, uint32 type
,
349 target_addr_t
Address() const { return fAddress
; }
350 uint32
WatchType() const { return fWatchType
; }
351 int32
Length() const { return fLength
; }
353 virtual remote_request_type
Type() const;
356 virtual status_t
LoadSpecificInfoFromMessage(
357 const BMessage
& data
);
358 virtual status_t
SaveSpecificInfoToMessage(
359 BMessage
& _output
) const;
362 target_addr_t fAddress
;
368 class RemoteDebugUninstallWatchpointRequest
369 : public RemoteDebugAddressActionRequest
{
371 RemoteDebugUninstallWatchpointRequest();
372 virtual ~RemoteDebugUninstallWatchpointRequest();
374 virtual remote_request_type
Type() const;
378 // #pragma mark - Responses
381 class RemoteDebugReadMemoryResponse
: public RemoteDebugResponse
{
383 RemoteDebugReadMemoryResponse();
384 virtual ~RemoteDebugReadMemoryResponse();
386 void SetTo(void* data
, target_size_t size
);
388 const void* Data() const { return fData
; }
389 target_size_t
Size() const { return fSize
; }
392 virtual status_t
LoadSpecificInfoFromMessage(const BMessage
& data
);
393 virtual status_t
SaveSpecificInfoToMessage(BMessage
& _output
) const;
401 class RemoteDebugGetCpuStateResponse
: public RemoteDebugResponse
{
403 RemoteDebugGetCpuStateResponse();
404 virtual ~RemoteDebugGetCpuStateResponse();
406 void SetTo(CpuState
* state
);
408 CpuState
* GetCpuState() const { return fCpuState
; }
411 virtual status_t
LoadSpecificInfoFromMessage(const BMessage
& data
);
412 virtual status_t
SaveSpecificInfoToMessage(BMessage
& _output
) const;
419 #endif // REMOTE_DEBUG_REQUEST_H