1/*
2 * Copyright 2010, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include <DebugContext.h>
8
9
10BDebugContext::BDebugContext()
11{
12	fContext.team = -1;
13}
14
15
16BDebugContext::~BDebugContext()
17{
18	Uninit();
19}
20
21
22status_t
23BDebugContext::Init(team_id team, port_id nubPort)
24{
25	Uninit();
26
27	status_t error = init_debug_context(&fContext, team, nubPort);
28	if (error != B_OK) {
29		fContext.team = -1;
30		return error;
31	}
32
33	return B_OK;
34}
35
36
37void
38BDebugContext::Uninit()
39{
40	if (fContext.team >= 0) {
41		destroy_debug_context(&fContext);
42		fContext.team = -1;
43	}
44}
45
46
47status_t
48BDebugContext::SendDebugMessage(int32 messageCode, const void *message,
49	size_t messageSize, void* reply, size_t replySize)
50{
51	return send_debug_message(&fContext, messageCode, message, messageSize,
52		reply, replySize);
53}
54
55
56status_t
57BDebugContext::SetTeamDebuggingFlags(int32 flags)
58{
59	debug_nub_set_team_flags message;
60	message.flags = flags;
61
62	return SendDebugMessage(B_DEBUG_MESSAGE_SET_TEAM_FLAGS, &message,
63		sizeof(message), NULL, 0);
64}
65
66
67ssize_t
68BDebugContext::ReadMemoryPartial(const void* address, void* buffer, size_t size)
69{
70	return debug_read_memory_partial(&fContext, address, buffer, size);
71}
72
73
74ssize_t
75BDebugContext::ReadMemory(const void* address, void* buffer, size_t size)
76{
77	return debug_read_memory(&fContext, address, buffer, size);
78}
79
80
81ssize_t
82BDebugContext::ReadString(const void* address, char* buffer, size_t size)
83{
84	return debug_read_string(&fContext, address, buffer, size);
85}
86
87
88status_t
89BDebugContext::SetBreakpoint(void* address)
90{
91	debug_nub_set_breakpoint message;
92	message.reply_port = fContext.reply_port;
93	message.address = address;
94
95	debug_nub_set_breakpoint_reply reply;
96	status_t error = SendDebugMessage(B_DEBUG_MESSAGE_SET_BREAKPOINT, &message,
97		sizeof(message), &reply, sizeof(reply));
98
99	return error == B_OK ? reply.error : error;
100}
101
102
103status_t
104BDebugContext::ClearBreakpoint(void* address)
105{
106	debug_nub_clear_breakpoint message;
107	message.address = address;
108
109	return SendDebugMessage(B_DEBUG_MESSAGE_CLEAR_BREAKPOINT, &message,
110		sizeof(message), NULL, 0);
111}
112
113
114status_t
115BDebugContext::SetWatchpoint(void* address, uint32 type, int32 length)
116{
117	debug_nub_set_watchpoint message;
118	message.reply_port = fContext.reply_port;
119	message.address = address;
120	message.type = type;
121	message.length = length;
122
123	debug_nub_set_watchpoint_reply reply;
124	status_t error = SendDebugMessage(B_DEBUG_MESSAGE_SET_WATCHPOINT, &message,
125		sizeof(message), &reply, sizeof(reply));
126
127	return error == B_OK ? reply.error : error;
128}
129
130
131status_t
132BDebugContext::ClearWatchpoint(void* address)
133{
134	debug_nub_clear_watchpoint message;
135	message.address = address;
136
137	return SendDebugMessage(B_DEBUG_MESSAGE_CLEAR_WATCHPOINT, &message,
138		sizeof(message), NULL, 0);
139}
140
141
142status_t
143BDebugContext::ContinueThread(thread_id thread, bool singleStep)
144{
145	debug_nub_continue_thread message;
146	message.thread = thread;
147	message.handle_event = B_THREAD_DEBUG_HANDLE_EVENT;
148	message.single_step = singleStep;
149
150	return SendDebugMessage(B_DEBUG_MESSAGE_CONTINUE_THREAD, &message,
151		sizeof(message), NULL, 0);
152}
153
154
155status_t
156BDebugContext::SetThreadDebuggingFlags(thread_id thread, int32 flags)
157{
158	debug_nub_set_thread_flags message;
159	message.thread = thread;
160	message.flags = flags;
161
162	return SendDebugMessage(B_DEBUG_MESSAGE_SET_THREAD_FLAGS, &message,
163		sizeof(message), NULL, 0);
164}
165
166
167status_t
168BDebugContext::GetThreadCpuState(thread_id thread,
169	debug_debugger_message* _messageCode, debug_cpu_state* cpuState)
170{
171	return debug_get_cpu_state(&fContext, thread, _messageCode, cpuState);
172}
173