Rev 3468 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 3468 | Rev 3620 | ||
|---|---|---|---|
| Line 71... | Line 71... | ||
| 71 | int rc; |
71 | int rc; |
| 72 | 72 | ||
| 73 | rc = udebug_begin(call); |
73 | rc = udebug_begin(call); |
| 74 | if (rc < 0) { |
74 | if (rc < 0) { |
| 75 | IPC_SET_RETVAL(call->data, rc); |
75 | IPC_SET_RETVAL(call->data, rc); |
| 76 | ipc_answer(&TASK->kernel_box, call); |
76 | ipc_answer(&TASK->kb.box, call); |
| 77 | return; |
77 | return; |
| 78 | } |
78 | } |
| 79 | 79 | ||
| 80 | /* |
80 | /* |
| 81 | * If the initialization of the debugging session has finished, |
81 | * If the initialization of the debugging session has finished, |
| 82 | * send a reply. |
82 | * send a reply. |
| 83 | */ |
83 | */ |
| 84 | if (rc != 0) { |
84 | if (rc != 0) { |
| 85 | IPC_SET_RETVAL(call->data, 0); |
85 | IPC_SET_RETVAL(call->data, 0); |
| 86 | ipc_answer(&TASK->kernel_box, call); |
86 | ipc_answer(&TASK->kb.box, call); |
| 87 | } |
87 | } |
| 88 | } |
88 | } |
| 89 | 89 | ||
| 90 | /** Process an END call. |
90 | /** Process an END call. |
| 91 | * |
91 | * |
| Line 97... | Line 97... | ||
| 97 | int rc; |
97 | int rc; |
| 98 | 98 | ||
| 99 | rc = udebug_end(); |
99 | rc = udebug_end(); |
| 100 | 100 | ||
| 101 | IPC_SET_RETVAL(call->data, rc); |
101 | IPC_SET_RETVAL(call->data, rc); |
| 102 | ipc_answer(&TASK->kernel_box, call); |
102 | ipc_answer(&TASK->kb.box, call); |
| 103 | } |
103 | } |
| 104 | 104 | ||
| 105 | /** Process a SET_EVMASK call. |
105 | /** Process a SET_EVMASK call. |
| 106 | * |
106 | * |
| 107 | * Sets an event mask for the current debugging session. |
107 | * Sets an event mask for the current debugging session. |
| Line 114... | Line 114... | ||
| 114 | 114 | ||
| 115 | mask = IPC_GET_ARG2(call->data); |
115 | mask = IPC_GET_ARG2(call->data); |
| 116 | rc = udebug_set_evmask(mask); |
116 | rc = udebug_set_evmask(mask); |
| 117 | 117 | ||
| 118 | IPC_SET_RETVAL(call->data, rc); |
118 | IPC_SET_RETVAL(call->data, rc); |
| 119 | ipc_answer(&TASK->kernel_box, call); |
119 | ipc_answer(&TASK->kb.box, call); |
| 120 | } |
120 | } |
| 121 | 121 | ||
| 122 | 122 | ||
| 123 | /** Process a GO call. |
123 | /** Process a GO call. |
| 124 | * |
124 | * |
| Line 133... | Line 133... | ||
| 133 | t = (thread_t *)IPC_GET_ARG2(call->data); |
133 | t = (thread_t *)IPC_GET_ARG2(call->data); |
| 134 | 134 | ||
| 135 | rc = udebug_go(t, call); |
135 | rc = udebug_go(t, call); |
| 136 | if (rc < 0) { |
136 | if (rc < 0) { |
| 137 | IPC_SET_RETVAL(call->data, rc); |
137 | IPC_SET_RETVAL(call->data, rc); |
| 138 | ipc_answer(&TASK->kernel_box, call); |
138 | ipc_answer(&TASK->kb.box, call); |
| 139 | return; |
139 | return; |
| 140 | } |
140 | } |
| 141 | } |
141 | } |
| 142 | 142 | ||
| 143 | /** Process a STOP call. |
143 | /** Process a STOP call. |
| Line 152... | Line 152... | ||
| 152 | 152 | ||
| 153 | t = (thread_t *)IPC_GET_ARG2(call->data); |
153 | t = (thread_t *)IPC_GET_ARG2(call->data); |
| 154 | 154 | ||
| 155 | rc = udebug_stop(t, call); |
155 | rc = udebug_stop(t, call); |
| 156 | IPC_SET_RETVAL(call->data, rc); |
156 | IPC_SET_RETVAL(call->data, rc); |
| 157 | ipc_answer(&TASK->kernel_box, call); |
157 | ipc_answer(&TASK->kb.box, call); |
| 158 | } |
158 | } |
| 159 | 159 | ||
| 160 | /** Process a THREAD_READ call. |
160 | /** Process a THREAD_READ call. |
| 161 | * |
161 | * |
| 162 | * Reads the list of hashes of the (userspace) threads in the current task. |
162 | * Reads the list of hashes of the (userspace) threads in the current task. |
| Line 180... | Line 180... | ||
| 180 | * of threads times thread-id size. |
180 | * of threads times thread-id size. |
| 181 | */ |
181 | */ |
| 182 | rc = udebug_thread_read(&buffer, buf_size, &n); |
182 | rc = udebug_thread_read(&buffer, buf_size, &n); |
| 183 | if (rc < 0) { |
183 | if (rc < 0) { |
| 184 | IPC_SET_RETVAL(call->data, rc); |
184 | IPC_SET_RETVAL(call->data, rc); |
| 185 | ipc_answer(&TASK->kernel_box, call); |
185 | ipc_answer(&TASK->kb.box, call); |
| 186 | return; |
186 | return; |
| 187 | } |
187 | } |
| 188 | 188 | ||
| 189 | total_bytes = n; |
189 | total_bytes = n; |
| 190 | 190 | ||
| Line 207... | Line 207... | ||
| 207 | IPC_SET_ARG2(call->data, to_copy); |
207 | IPC_SET_ARG2(call->data, to_copy); |
| 208 | 208 | ||
| 209 | IPC_SET_ARG3(call->data, total_bytes); |
209 | IPC_SET_ARG3(call->data, total_bytes); |
| 210 | call->buffer = buffer; |
210 | call->buffer = buffer; |
| 211 | 211 | ||
| 212 | ipc_answer(&TASK->kernel_box, call); |
212 | ipc_answer(&TASK->kb.box, call); |
| 213 | } |
213 | } |
| 214 | 214 | ||
| 215 | /** Process an ARGS_READ call. |
215 | /** Process an ARGS_READ call. |
| 216 | * |
216 | * |
| 217 | * Reads the argument of a current syscall event (SYSCALL_B or SYSCALL_E). |
217 | * Reads the argument of a current syscall event (SYSCALL_B or SYSCALL_E). |
| Line 227... | Line 227... | ||
| 227 | t = (thread_t *)IPC_GET_ARG2(call->data); |
227 | t = (thread_t *)IPC_GET_ARG2(call->data); |
| 228 | 228 | ||
| 229 | rc = udebug_args_read(t, &buffer); |
229 | rc = udebug_args_read(t, &buffer); |
| 230 | if (rc != EOK) { |
230 | if (rc != EOK) { |
| 231 | IPC_SET_RETVAL(call->data, rc); |
231 | IPC_SET_RETVAL(call->data, rc); |
| 232 | ipc_answer(&TASK->kernel_box, call); |
232 | ipc_answer(&TASK->kb.box, call); |
| 233 | return; |
233 | return; |
| 234 | } |
234 | } |
| 235 | 235 | ||
| 236 | /* |
236 | /* |
| 237 | * Make use of call->buffer to transfer data to caller's userspace |
237 | * Make use of call->buffer to transfer data to caller's userspace |
| Line 245... | Line 245... | ||
| 245 | (no way to distinguish method in answer) */ |
245 | (no way to distinguish method in answer) */ |
| 246 | IPC_SET_ARG1(call->data, uspace_addr); |
246 | IPC_SET_ARG1(call->data, uspace_addr); |
| 247 | IPC_SET_ARG2(call->data, 6 * sizeof(unative_t)); |
247 | IPC_SET_ARG2(call->data, 6 * sizeof(unative_t)); |
| 248 | call->buffer = buffer; |
248 | call->buffer = buffer; |
| 249 | 249 | ||
| 250 | ipc_answer(&TASK->kernel_box, call); |
250 | ipc_answer(&TASK->kb.box, call); |
| 251 | } |
251 | } |
| 252 | 252 | ||
| 253 | /** Process an MEM_READ call. |
253 | /** Process an MEM_READ call. |
| 254 | * |
254 | * |
| 255 | * Reads memory of the current (debugged) task. |
255 | * Reads memory of the current (debugged) task. |
| Line 268... | Line 268... | ||
| 268 | size = IPC_GET_ARG4(call->data); |
268 | size = IPC_GET_ARG4(call->data); |
| 269 | 269 | ||
| 270 | rc = udebug_mem_read(uspace_src, size, &buffer); |
270 | rc = udebug_mem_read(uspace_src, size, &buffer); |
| 271 | if (rc < 0) { |
271 | if (rc < 0) { |
| 272 | IPC_SET_RETVAL(call->data, rc); |
272 | IPC_SET_RETVAL(call->data, rc); |
| 273 | ipc_answer(&TASK->kernel_box, call); |
273 | ipc_answer(&TASK->kb.box, call); |
| 274 | return; |
274 | return; |
| 275 | } |
275 | } |
| 276 | 276 | ||
| 277 | IPC_SET_RETVAL(call->data, 0); |
277 | IPC_SET_RETVAL(call->data, 0); |
| 278 | /* ARG1=dest, ARG2=size as in IPC_M_DATA_READ so that |
278 | /* ARG1=dest, ARG2=size as in IPC_M_DATA_READ so that |
| Line 280... | Line 280... | ||
| 280 | (no way to distinguish method in answer) */ |
280 | (no way to distinguish method in answer) */ |
| 281 | IPC_SET_ARG1(call->data, uspace_dst); |
281 | IPC_SET_ARG1(call->data, uspace_dst); |
| 282 | IPC_SET_ARG2(call->data, size); |
282 | IPC_SET_ARG2(call->data, size); |
| 283 | call->buffer = buffer; |
283 | call->buffer = buffer; |
| 284 | 284 | ||
| 285 | ipc_answer(&TASK->kernel_box, call); |
285 | ipc_answer(&TASK->kb.box, call); |
| 286 | } |
286 | } |
| 287 | 287 | ||
| 288 | /** Handle a debug call received on the kernel answerbox. |
288 | /** Handle a debug call received on the kernel answerbox. |
| 289 | * |
289 | * |
| 290 | * This is called by the kbox servicing thread. Verifies that the sender |
290 | * This is called by the kbox servicing thread. Verifies that the sender |
| Line 304... | Line 304... | ||
| 304 | * and the sender can be safely considered valid until |
304 | * and the sender can be safely considered valid until |
| 305 | * control exits this function. |
305 | * control exits this function. |
| 306 | */ |
306 | */ |
| 307 | if (TASK->udebug.debugger != call->sender) { |
307 | if (TASK->udebug.debugger != call->sender) { |
| 308 | IPC_SET_RETVAL(call->data, EINVAL); |
308 | IPC_SET_RETVAL(call->data, EINVAL); |
| 309 | ipc_answer(&TASK->kernel_box, call); |
309 | ipc_answer(&TASK->kb.box, call); |
| 310 | return; |
310 | return; |
| 311 | } |
311 | } |
| 312 | } |
312 | } |
| 313 | 313 | ||
| 314 | switch (debug_method) { |
314 | switch (debug_method) { |