OLD | NEW |
| (Empty) |
1 #include "GdbProxy.h" | |
2 #include "third_party/nacl/native_client/src/trusted/debug_stub/debug_host.h" | |
3 #include <string> | |
4 | |
5 using System::String; | |
6 using System::Byte; | |
7 using System::Int32; | |
8 using System::UInt32; | |
9 using System::UInt64; | |
10 using System::IntPtr; | |
11 using System::Collections::Generic::Dictionary; | |
12 using System::Diagnostics::Debug; | |
13 using System::Runtime::InteropServices::Marshal; | |
14 using System::Runtime::InteropServices::GCHandle; | |
15 using System::Runtime::InteropServices::GCHandleType; | |
16 using System::Runtime::InteropServices::OutAttribute; | |
17 | |
18 using nacl_debug_conn::DebugHost; | |
19 using std::string; | |
20 | |
21 namespace NaClVsx { namespace DebugHelpers { | |
22 | |
23 ref class ClosureMap { | |
24 public: | |
25 static int AddClosure(GdbProxy::AsyncResponse^ closure, bool remove) { | |
26 int id = nextId_++; | |
27 closureHandleMap_[id] = closure; | |
28 closureRemovalMap_[id] = remove; | |
29 return id; | |
30 } | |
31 | |
32 static GdbProxy::AsyncResponse^ GetClosure(int id) { | |
33 GdbProxy::AsyncResponse^ result = closureHandleMap_[id]; | |
34 if (closureRemovalMap_[id]) { | |
35 closureHandleMap_[id] = nullptr; | |
36 } | |
37 return result; | |
38 } | |
39 private: | |
40 static Dictionary<int,GdbProxy::AsyncResponse^> closureHandleMap_; | |
41 static Dictionary<int,bool> closureRemovalMap_; | |
42 static int nextId_ = 0; | |
43 }; | |
44 | |
45 struct GdbProxyImpl { | |
46 DebugHost *pHost; | |
47 | |
48 static void __stdcall DHAsync(DebugHost::DHResult res, void *obj); | |
49 static void __stdcall DHAsyncStr(DebugHost::DHResult res, | |
50 void *obj, | |
51 const char *str); | |
52 static void __stdcall DHAsyncMem(DebugHost::DHResult res, | |
53 void *obj, | |
54 void* data, | |
55 uint32_t len); | |
56 }; | |
57 | |
58 void __stdcall GdbProxyImpl::DHAsync(DebugHost::DHResult res, void *obj) | |
59 { | |
60 GdbProxy::AsyncResponse^ closure = | |
61 ClosureMap::GetClosure(reinterpret_cast<int>(obj)); | |
62 if (closure != nullptr) { | |
63 closure((GdbProxy::ResultCode) res, nullptr, nullptr); | |
64 } | |
65 } | |
66 | |
67 void __stdcall GdbProxyImpl::DHAsyncStr(DebugHost::DHResult res, void *obj, cons
t char *str) | |
68 { | |
69 GdbProxy::AsyncResponse^ closure = | |
70 ClosureMap::GetClosure(reinterpret_cast<int>(obj)); | |
71 closure((GdbProxy::ResultCode) res, gcnew String(str), nullptr); | |
72 } | |
73 | |
74 void __stdcall GdbProxyImpl::DHAsyncMem(DebugHost::DHResult res, void *obj, void
* data, uint32_t len) | |
75 { | |
76 GdbProxy::AsyncResponse^ closure = | |
77 ClosureMap::GetClosure(reinterpret_cast<int>(obj)); | |
78 array<Byte>^ managedData = gcnew array<Byte>(len); | |
79 Marshal::Copy(IntPtr(data), managedData, 0, len); | |
80 closure((GdbProxy::ResultCode) res, nullptr, managedData); | |
81 | |
82 } | |
83 GdbProxy::GdbProxy(void) : pimpl_(new GdbProxyImpl) | |
84 { | |
85 } | |
86 | |
87 GdbProxy::~GdbProxy() { | |
88 delete pimpl_; | |
89 } | |
90 | |
91 bool GdbProxy::CanConnect(String^ connectionString) | |
92 { | |
93 Debug::WriteLine(String::Format("TransportImpl::CanConnect({0})", | |
94 connectionString)); | |
95 | |
96 return true; | |
97 } | |
98 | |
99 void GdbProxy::Open(String^ connectionString) | |
100 { | |
101 Debug::WriteLine(String::Format("Transport::Open({0})", | |
102 connectionString)); | |
103 | |
104 IntPtr hString = Marshal::StringToHGlobalAnsi(connectionString); | |
105 pimpl_->pHost = DebugHost::SocketConnect( | |
106 (char*)hString.ToPointer()); | |
107 Marshal::FreeHGlobal(hString); | |
108 | |
109 if(!pimpl_->pHost) { | |
110 throw gcnew System::IO::IOException( | |
111 String::Format("Failed to connect to {0}",connectionString)); | |
112 } | |
113 | |
114 connectionString_ = connectionString; | |
115 } | |
116 | |
117 void GdbProxy::Close() | |
118 { | |
119 Debug::WriteLine(String::Format("Transport::Close")); | |
120 | |
121 | |
122 delete pimpl_->pHost; | |
123 pimpl_->pHost = NULL; | |
124 } | |
125 | |
126 bool GdbProxy::IsRunning() | |
127 { | |
128 return pimpl_->pHost->IsRunning(); | |
129 } | |
130 | |
131 void GdbProxy::SetOutputAsync( AsyncResponse^ reply ) | |
132 { | |
133 pimpl_->pHost->SetOutputAsync( | |
134 &GdbProxyImpl::DHAsyncStr, | |
135 reinterpret_cast<void*>(ClosureMap::AddClosure(reply,false))); | |
136 } | |
137 | |
138 void GdbProxy::SetStopAsync( AsyncResponse^ reply ) | |
139 { | |
140 pimpl_->pHost->SetStopAsync( | |
141 &GdbProxyImpl::DHAsync, | |
142 reinterpret_cast<void*>(ClosureMap::AddClosure(reply,false))); | |
143 } | |
144 | |
145 | |
146 | |
147 GdbProxy::ResultCode GdbProxy::GetPath(AsyncResponse^ reply) | |
148 { | |
149 return static_cast<ResultCode>(pimpl_->pHost->GetPathAsync( | |
150 &GdbProxyImpl::DHAsyncStr, | |
151 reinterpret_cast<void*>(ClosureMap::AddClosure(reply, true)))); | |
152 } | |
153 | |
154 GdbProxy::ResultCode GdbProxy::GetArch(AsyncResponse^ reply) | |
155 { | |
156 return static_cast<ResultCode>(pimpl_->pHost->GetArchAsync( | |
157 &GdbProxyImpl::DHAsyncStr, | |
158 reinterpret_cast<void*>(ClosureMap::AddClosure(reply, true)))); | |
159 | |
160 } | |
161 | |
162 GdbProxy::ResultCode GdbProxy::GetThreads(AsyncResponse^ reply) | |
163 { | |
164 return static_cast<ResultCode>(pimpl_->pHost->GetThreadsAsync( | |
165 &GdbProxyImpl::DHAsyncStr, | |
166 reinterpret_cast<void*>(ClosureMap::AddClosure(reply, true)))); | |
167 | |
168 } | |
169 | |
170 GdbProxy::ResultCode GdbProxy::GetLastSig([Out]int% sig) | |
171 { | |
172 int lastSig = 0; | |
173 ResultCode result = ResultCode::DHR_FAILED; | |
174 result = static_cast<ResultCode>(pimpl_->pHost->GetLastSig(&lastSig)); | |
175 sig = lastSig; | |
176 return result; | |
177 } | |
178 | |
179 GdbProxy::ResultCode GdbProxy::GetMemory(System::UInt64 offs, System::Object^ da
ta) | |
180 { | |
181 Int32 size = Marshal::SizeOf(data->GetType()); | |
182 GCHandle^ hData = GCHandle::Alloc(data,GCHandleType::Pinned); | |
183 IntPtr pData = hData->AddrOfPinnedObject(); | |
184 ResultCode result = static_cast<ResultCode>( | |
185 pimpl_->pHost->GetMemory(offs, pData.ToPointer(), size)); | |
186 hData->Free(); | |
187 | |
188 return result; | |
189 } | |
190 | |
191 GdbProxy::ResultCode GdbProxy::GetMemory( System::UInt64 offs, System::Array^ da
ta, System::UInt32 count ) | |
192 { | |
193 Int32 size = data->Length * Marshal::SizeOf(data->GetType()->GetElementType())
; | |
194 Debug::Assert((UInt32)size >= count); | |
195 GCHandle^ hData = GCHandle::Alloc(data,GCHandleType::Pinned); | |
196 IntPtr pData = hData->AddrOfPinnedObject(); | |
197 ResultCode result = static_cast<ResultCode>( | |
198 pimpl_->pHost->GetMemory(offs, pData.ToPointer(), count)); | |
199 hData->Free(); | |
200 | |
201 return result; | |
202 } | |
203 | |
204 GdbProxy::ResultCode GdbProxy::SetMemory( System::UInt64 offs, System::Array^ da
ta, System::UInt32 count ) | |
205 { | |
206 Int32 size = data->Length * Marshal::SizeOf(data->GetType()->GetElementType())
; | |
207 Debug::Assert((UInt32)size >= count); | |
208 GCHandle^ hData = GCHandle::Alloc(data,GCHandleType::Pinned); | |
209 IntPtr pData = hData->AddrOfPinnedObject(); | |
210 ResultCode result = static_cast<ResultCode>( | |
211 pimpl_->pHost->SetMemory(offs, pData.ToPointer(), count)); | |
212 hData->Free(); | |
213 | |
214 return result; | |
215 | |
216 } | |
217 | |
218 GdbProxy::ResultCode GdbProxy::GetRegisters(RegsX86_64^% registers) | |
219 { | |
220 Int32 size = Marshal::SizeOf(registers->GetType()); | |
221 GCHandle^ hRegisters = GCHandle::Alloc(registers,GCHandleType::Pinned); | |
222 IntPtr pRegisters = hRegisters->AddrOfPinnedObject(); | |
223 ResultCode result = static_cast<ResultCode>(pimpl_->pHost->GetRegisters(pRegis
ters.ToPointer(),size)); | |
224 hRegisters->Free(); | |
225 | |
226 return result; | |
227 } | |
228 | |
229 GdbProxy::ResultCode GdbProxy::SetRegisters(void *, System::UInt32 ) | |
230 { | |
231 return ResultCode::DHR_FAILED; | |
232 } | |
233 | |
234 GdbProxy::ResultCode GdbProxy::RequestBreak() | |
235 { | |
236 return static_cast<ResultCode>(pimpl_->pHost->RequestBreak()); | |
237 } | |
238 | |
239 GdbProxy::ResultCode GdbProxy::RequestContinueBackground() | |
240 { | |
241 return static_cast<ResultCode>(pimpl_->pHost->RequestContinueBackground()); | |
242 } | |
243 | |
244 GdbProxy::ResultCode GdbProxy::RequestContinue() | |
245 { | |
246 return static_cast<ResultCode>(pimpl_->pHost->RequestContinue()); | |
247 } | |
248 | |
249 GdbProxy::ResultCode GdbProxy::RequestStep() | |
250 { | |
251 return static_cast<ResultCode>(pimpl_->pHost->RequestStep()); | |
252 } | |
253 | |
254 bool GdbProxy::HasBreakpoint( System::UInt64 offs ) | |
255 { | |
256 return pimpl_->pHost->HasBreakpoint(offs); | |
257 } | |
258 | |
259 GdbProxy::ResultCode GdbProxy::AddBreakpoint( System::UInt64 offs ) | |
260 { | |
261 return (GdbProxy::ResultCode)pimpl_->pHost->AddBreakpoint(offs); | |
262 } | |
263 | |
264 GdbProxy::ResultCode GdbProxy::RemoveBreakpoint( System::UInt64 offs ) | |
265 { | |
266 return (GdbProxy::ResultCode)pimpl_->pHost->RemoveBreakpoint(offs); | |
267 } | |
268 | |
269 <<<<<<< c:\hg\nvs\src/NaClVsx.DebugHelpers/GdbProxy.cpp | |
270 GdbProxy::ResultCode GdbProxy::EnableBreakpoint( System::UInt64 offs ) | |
271 { | |
272 return (GdbProxy::ResultCode)pimpl_->pHost->EnableBreakpoint(offs); | |
273 } | |
274 | |
275 GdbProxy::ResultCode GdbProxy::DisableBreakpoint( System::UInt64 offs ) | |
276 { | |
277 return (GdbProxy::ResultCode)pimpl_->pHost->DisableBreakpoint(offs); | |
278 } | |
279 | |
280 GdbProxy::ResultCode GdbProxy::SuspendBreakpoint( System::UInt64 offs ) | |
281 { | |
282 return (GdbProxy::ResultCode)pimpl_->pHost->SuspendBreakpoint(offs); | |
283 } | |
284 | |
285 GdbProxy::ResultCode GdbProxy::ResumeBreakpoint( System::UInt64 offs ) | |
286 { | |
287 return (GdbProxy::ResultCode)pimpl_->pHost->ResumeBreakpoint(offs); | |
288 } | |
289 | |
290 bool GdbProxy::QueryBreakpoint( System::UInt64 offs ) | |
291 { | |
292 DebugHost::BreakpointRecord dummy; | |
293 return (pimpl_->pHost->QueryBreakpoint(offs, &dummy) == DebugHost::DHR_OK); | |
294 } | |
295 | |
296 | |
297 | |
298 | |
299 ======= | |
300 >>>>>>> c:\users\ilewis\appdata\local\temp\GdbProxy.cpp~other.-xjb9k | |
301 }} // namespace NaClVsx.DebugHelpers | |
OLD | NEW |