Rev 3611 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3611 | Rev 3623 | ||
---|---|---|---|
Line 130... | Line 130... | ||
130 | int rc; |
130 | int rc; |
131 | 131 | ||
132 | rc = udebug_begin(call); |
132 | rc = udebug_begin(call); |
133 | if (rc < 0) { |
133 | if (rc < 0) { |
134 | IPC_SET_RETVAL(call->data, rc); |
134 | IPC_SET_RETVAL(call->data, rc); |
135 | ipc_answer(&TASK->kernel_box, call); |
135 | ipc_answer(&TASK->kb.box, call); |
136 | return; |
136 | return; |
137 | } |
137 | } |
138 | 138 | ||
139 | /* |
139 | /* |
140 | * If the initialization of the debugging session has finished, |
140 | * If the initialization of the debugging session has finished, |
141 | * send a reply. |
141 | * send a reply. |
142 | */ |
142 | */ |
143 | if (rc != 0) { |
143 | if (rc != 0) { |
144 | IPC_SET_RETVAL(call->data, 0); |
144 | IPC_SET_RETVAL(call->data, 0); |
145 | ipc_answer(&TASK->kernel_box, call); |
145 | ipc_answer(&TASK->kb.box, call); |
146 | } |
146 | } |
147 | } |
147 | } |
148 | 148 | ||
149 | /** Process an END call. |
149 | /** Process an END call. |
150 | * |
150 | * |
Line 156... | Line 156... | ||
156 | int rc; |
156 | int rc; |
157 | 157 | ||
158 | rc = udebug_end(); |
158 | rc = udebug_end(); |
159 | 159 | ||
160 | IPC_SET_RETVAL(call->data, rc); |
160 | IPC_SET_RETVAL(call->data, rc); |
161 | ipc_answer(&TASK->kernel_box, call); |
161 | ipc_answer(&TASK->kb.box, call); |
162 | } |
162 | } |
163 | 163 | ||
164 | /** Process a SET_EVMASK call. |
164 | /** Process a SET_EVMASK call. |
165 | * |
165 | * |
166 | * Sets an event mask for the current debugging session. |
166 | * Sets an event mask for the current debugging session. |
Line 173... | Line 173... | ||
173 | 173 | ||
174 | mask = IPC_GET_ARG2(call->data); |
174 | mask = IPC_GET_ARG2(call->data); |
175 | rc = udebug_set_evmask(mask); |
175 | rc = udebug_set_evmask(mask); |
176 | 176 | ||
177 | IPC_SET_RETVAL(call->data, rc); |
177 | IPC_SET_RETVAL(call->data, rc); |
178 | ipc_answer(&TASK->kernel_box, call); |
178 | ipc_answer(&TASK->kb.box, call); |
179 | } |
179 | } |
180 | 180 | ||
181 | 181 | ||
182 | /** Process a GO call. |
182 | /** Process a GO call. |
183 | * |
183 | * |
Line 192... | Line 192... | ||
192 | t = (thread_t *)IPC_GET_ARG2(call->data); |
192 | t = (thread_t *)IPC_GET_ARG2(call->data); |
193 | 193 | ||
194 | rc = udebug_go(t, call); |
194 | rc = udebug_go(t, call); |
195 | if (rc < 0) { |
195 | if (rc < 0) { |
196 | IPC_SET_RETVAL(call->data, rc); |
196 | IPC_SET_RETVAL(call->data, rc); |
197 | ipc_answer(&TASK->kernel_box, call); |
197 | ipc_answer(&TASK->kb.box, call); |
198 | return; |
198 | return; |
199 | } |
199 | } |
200 | } |
200 | } |
201 | 201 | ||
202 | /** Process a STOP call. |
202 | /** Process a STOP call. |
Line 211... | Line 211... | ||
211 | 211 | ||
212 | t = (thread_t *)IPC_GET_ARG2(call->data); |
212 | t = (thread_t *)IPC_GET_ARG2(call->data); |
213 | 213 | ||
214 | rc = udebug_stop(t, call); |
214 | rc = udebug_stop(t, call); |
215 | IPC_SET_RETVAL(call->data, rc); |
215 | IPC_SET_RETVAL(call->data, rc); |
216 | ipc_answer(&TASK->kernel_box, call); |
216 | ipc_answer(&TASK->kb.box, call); |
217 | } |
217 | } |
218 | 218 | ||
219 | /** Process a THREAD_READ call. |
219 | /** Process a THREAD_READ call. |
220 | * |
220 | * |
221 | * Reads the list of hashes of the (userspace) threads in the current task. |
221 | * Reads the list of hashes of the (userspace) threads in the current task. |
Line 239... | Line 239... | ||
239 | * of threads times thread-id size. |
239 | * of threads times thread-id size. |
240 | */ |
240 | */ |
241 | rc = udebug_thread_read(&buffer, buf_size, &n); |
241 | rc = udebug_thread_read(&buffer, buf_size, &n); |
242 | if (rc < 0) { |
242 | if (rc < 0) { |
243 | IPC_SET_RETVAL(call->data, rc); |
243 | IPC_SET_RETVAL(call->data, rc); |
244 | ipc_answer(&TASK->kernel_box, call); |
244 | ipc_answer(&TASK->kb.box, call); |
245 | return; |
245 | return; |
246 | } |
246 | } |
247 | 247 | ||
248 | total_bytes = n; |
248 | total_bytes = n; |
249 | 249 | ||
Line 266... | Line 266... | ||
266 | IPC_SET_ARG2(call->data, to_copy); |
266 | IPC_SET_ARG2(call->data, to_copy); |
267 | 267 | ||
268 | IPC_SET_ARG3(call->data, total_bytes); |
268 | IPC_SET_ARG3(call->data, total_bytes); |
269 | call->buffer = buffer; |
269 | call->buffer = buffer; |
270 | 270 | ||
271 | ipc_answer(&TASK->kernel_box, call); |
271 | ipc_answer(&TASK->kb.box, call); |
272 | } |
272 | } |
273 | 273 | ||
274 | /** Process an ARGS_READ call. |
274 | /** Process an ARGS_READ call. |
275 | * |
275 | * |
276 | * Reads the argument of a current syscall event (SYSCALL_B or SYSCALL_E). |
276 | * Reads the argument of a current syscall event (SYSCALL_B or SYSCALL_E). |
Line 286... | Line 286... | ||
286 | t = (thread_t *)IPC_GET_ARG2(call->data); |
286 | t = (thread_t *)IPC_GET_ARG2(call->data); |
287 | 287 | ||
288 | rc = udebug_args_read(t, &buffer); |
288 | rc = udebug_args_read(t, &buffer); |
289 | if (rc != EOK) { |
289 | if (rc != EOK) { |
290 | IPC_SET_RETVAL(call->data, rc); |
290 | IPC_SET_RETVAL(call->data, rc); |
291 | ipc_answer(&TASK->kernel_box, call); |
291 | ipc_answer(&TASK->kb.box, call); |
292 | return; |
292 | return; |
293 | } |
293 | } |
294 | 294 | ||
295 | /* |
295 | /* |
296 | * Make use of call->buffer to transfer data to caller's userspace |
296 | * Make use of call->buffer to transfer data to caller's userspace |
Line 304... | Line 304... | ||
304 | (no way to distinguish method in answer) */ |
304 | (no way to distinguish method in answer) */ |
305 | IPC_SET_ARG1(call->data, uspace_addr); |
305 | IPC_SET_ARG1(call->data, uspace_addr); |
306 | IPC_SET_ARG2(call->data, 6 * sizeof(unative_t)); |
306 | IPC_SET_ARG2(call->data, 6 * sizeof(unative_t)); |
307 | call->buffer = buffer; |
307 | call->buffer = buffer; |
308 | 308 | ||
309 | ipc_answer(&TASK->kernel_box, call); |
309 | ipc_answer(&TASK->kb.box, call); |
310 | } |
310 | } |
311 | 311 | ||
312 | static void udebug_receive_regs_read(call_t *call) |
312 | static void udebug_receive_regs_read(call_t *call) |
313 | { |
313 | { |
314 | thread_t *t; |
314 | thread_t *t; |
Line 323... | Line 323... | ||
323 | buffer = malloc(sizeof(istate_t), 0); |
323 | buffer = malloc(sizeof(istate_t), 0); |
324 | 324 | ||
325 | rc = udebug_regs_read(t, buffer); |
325 | rc = udebug_regs_read(t, buffer); |
326 | if (rc < 0) { |
326 | if (rc < 0) { |
327 | IPC_SET_RETVAL(call->data, rc); |
327 | IPC_SET_RETVAL(call->data, rc); |
328 | ipc_answer(&TASK->kernel_box, call); |
328 | ipc_answer(&TASK->kb.box, call); |
329 | return; |
329 | return; |
330 | } |
330 | } |
331 | 331 | ||
332 | /* |
332 | /* |
333 | * Make use of call->buffer to transfer data to caller's userspace |
333 | * Make use of call->buffer to transfer data to caller's userspace |
Line 343... | Line 343... | ||
343 | IPC_SET_ARG1(call->data, uspace_addr); |
343 | IPC_SET_ARG1(call->data, uspace_addr); |
344 | IPC_SET_ARG2(call->data, to_copy); |
344 | IPC_SET_ARG2(call->data, to_copy); |
345 | 345 | ||
346 | call->buffer = buffer; |
346 | call->buffer = buffer; |
347 | 347 | ||
348 | ipc_answer(&TASK->kernel_box, call); |
348 | ipc_answer(&TASK->kb.box, call); |
349 | } |
349 | } |
350 | 350 | ||
351 | static void udebug_receive_regs_write(call_t *call) |
351 | static void udebug_receive_regs_write(call_t *call) |
352 | { |
352 | { |
353 | thread_t *t; |
353 | thread_t *t; |
Line 358... | Line 358... | ||
358 | uspace_data = (void *)IPC_GET_ARG3(call->data); |
358 | uspace_data = (void *)IPC_GET_ARG3(call->data); |
359 | 359 | ||
360 | rc = udebug_regs_write(t, call->buffer); |
360 | rc = udebug_regs_write(t, call->buffer); |
361 | if (rc < 0) { |
361 | if (rc < 0) { |
362 | IPC_SET_RETVAL(call->data, rc); |
362 | IPC_SET_RETVAL(call->data, rc); |
363 | ipc_answer(&TASK->kernel_box, call); |
363 | ipc_answer(&TASK->kb.box, call); |
364 | return; |
364 | return; |
365 | } |
365 | } |
366 | 366 | ||
367 | /* Set answer values */ |
367 | /* Set answer values */ |
368 | 368 | ||
369 | IPC_SET_RETVAL(call->data, 0); |
369 | IPC_SET_RETVAL(call->data, 0); |
370 | free(call->buffer); |
370 | free(call->buffer); |
371 | call->buffer = NULL; |
371 | call->buffer = NULL; |
372 | 372 | ||
373 | ipc_answer(&TASK->kernel_box, call); |
373 | ipc_answer(&TASK->kb.box, call); |
374 | } |
374 | } |
375 | 375 | ||
376 | /** Process an MEM_READ call. |
376 | /** Process an MEM_READ call. |
377 | * |
377 | * |
378 | * Reads memory of the current (debugged) task. |
378 | * Reads memory of the current (debugged) task. |
Line 391... | Line 391... | ||
391 | size = IPC_GET_ARG4(call->data); |
391 | size = IPC_GET_ARG4(call->data); |
392 | 392 | ||
393 | rc = udebug_mem_read(uspace_src, size, &buffer); |
393 | rc = udebug_mem_read(uspace_src, size, &buffer); |
394 | if (rc < 0) { |
394 | if (rc < 0) { |
395 | IPC_SET_RETVAL(call->data, rc); |
395 | IPC_SET_RETVAL(call->data, rc); |
396 | ipc_answer(&TASK->kernel_box, call); |
396 | ipc_answer(&TASK->kb.box, call); |
397 | return; |
397 | return; |
398 | } |
398 | } |
399 | 399 | ||
400 | IPC_SET_RETVAL(call->data, 0); |
400 | IPC_SET_RETVAL(call->data, 0); |
401 | /* ARG1=dest, ARG2=size as in IPC_M_DATA_READ so that |
401 | /* ARG1=dest, ARG2=size as in IPC_M_DATA_READ so that |
Line 403... | Line 403... | ||
403 | (no way to distinguish method in answer) */ |
403 | (no way to distinguish method in answer) */ |
404 | IPC_SET_ARG1(call->data, uspace_dst); |
404 | IPC_SET_ARG1(call->data, uspace_dst); |
405 | IPC_SET_ARG2(call->data, size); |
405 | IPC_SET_ARG2(call->data, size); |
406 | call->buffer = buffer; |
406 | call->buffer = buffer; |
407 | 407 | ||
408 | ipc_answer(&TASK->kernel_box, call); |
408 | ipc_answer(&TASK->kb.box, call); |
409 | } |
409 | } |
410 | 410 | ||
411 | static void udebug_receive_mem_write(call_t *call) |
411 | static void udebug_receive_mem_write(call_t *call) |
412 | { |
412 | { |
413 | unative_t uspace_dst; |
413 | unative_t uspace_dst; |
Line 420... | Line 420... | ||
420 | size = IPC_GET_ARG4(call->data); |
420 | size = IPC_GET_ARG4(call->data); |
421 | 421 | ||
422 | rc = udebug_mem_write(uspace_dst, call->buffer, size); |
422 | rc = udebug_mem_write(uspace_dst, call->buffer, size); |
423 | if (rc < 0) { |
423 | if (rc < 0) { |
424 | IPC_SET_RETVAL(call->data, rc); |
424 | IPC_SET_RETVAL(call->data, rc); |
425 | ipc_answer(&TASK->kernel_box, call); |
425 | ipc_answer(&TASK->kb.box, call); |
426 | return; |
426 | return; |
427 | } |
427 | } |
428 | 428 | ||
429 | IPC_SET_RETVAL(call->data, 0); |
429 | IPC_SET_RETVAL(call->data, 0); |
430 | free(call->buffer); |
430 | free(call->buffer); |
431 | call->buffer = NULL; |
431 | call->buffer = NULL; |
432 | 432 | ||
433 | ipc_answer(&TASK->kernel_box, call); |
433 | ipc_answer(&TASK->kb.box, call); |
434 | } |
434 | } |
435 | 435 | ||
436 | 436 | ||
437 | /** Handle a debug call received on the kernel answerbox. |
437 | /** Handle a debug call received on the kernel answerbox. |
438 | * |
438 | * |
Line 453... | Line 453... | ||
453 | * and the sender can be safely considered valid until |
453 | * and the sender can be safely considered valid until |
454 | * control exits this function. |
454 | * control exits this function. |
455 | */ |
455 | */ |
456 | if (TASK->udebug.debugger != call->sender) { |
456 | if (TASK->udebug.debugger != call->sender) { |
457 | IPC_SET_RETVAL(call->data, EINVAL); |
457 | IPC_SET_RETVAL(call->data, EINVAL); |
458 | ipc_answer(&TASK->kernel_box, call); |
458 | ipc_answer(&TASK->kb.box, call); |
459 | return; |
459 | return; |
460 | } |
460 | } |
461 | } |
461 | } |
462 | 462 | ||
463 | switch (debug_method) { |
463 | switch (debug_method) { |