Rev 2851 | Rev 2870 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2851 | Rev 2866 | ||
|---|---|---|---|
| Line 51... | Line 51... | ||
| 51 | * |
51 | * |
| 52 | * This will return a pointer to the task to which the phone |
52 | * This will return a pointer to the task to which the phone |
| 53 | * is connected. It will lock the task, making sure it exists. |
53 | * is connected. It will lock the task, making sure it exists. |
| 54 | * |
54 | * |
| 55 | * Interrupts must be already disabled. |
55 | * Interrupts must be already disabled. |
| 56 | * |
- | |
| 57 | * (TODO: make sure the udebug-cleanup of the task hasn't |
- | |
| 58 | * started yet) |
- | |
| 59 | */ |
56 | */ |
| 60 | static task_t *get_lock_callee_task(phone_t *phone) |
57 | static task_t *get_lock_callee_task(phone_t *phone) |
| 61 | { |
58 | { |
| 62 | task_t *ta; |
59 | task_t *ta; |
| 63 | task_id_t taskid; |
60 | task_id_t taskid; |
| Line 257... | Line 254... | ||
| 257 | 254 | ||
| 258 | /* Only process userspace threads */ |
255 | /* Only process userspace threads */ |
| 259 | if ((flags & THREAD_FLAG_USPACE) != 0) { |
256 | if ((flags & THREAD_FLAG_USPACE) != 0) { |
| 260 | /* Prevent any further debug activity in thread */ |
257 | /* Prevent any further debug activity in thread */ |
| 261 | t->debug_active = false; |
258 | t->debug_active = false; |
| - | 259 | t->cur_event = 0; /* none */ |
|
| 262 | 260 | ||
| 263 | /* Still has go? */ |
261 | /* Still has go? */ |
| 264 | if (t->debug_stop == false) { |
262 | if (t->debug_stop == false) { |
| 265 | /* |
263 | /* |
| 266 | * Yes, so clear go. As debug_active == false, |
264 | * Yes, so clear go. As debug_active == false, |
| Line 321... | Line 319... | ||
| 321 | return rc; |
319 | return rc; |
| 322 | } |
320 | } |
| 323 | 321 | ||
| 324 | t->debug_go_call = call; |
322 | t->debug_go_call = call; |
| 325 | t->debug_stop = false; |
323 | t->debug_stop = false; |
| - | 324 | t->cur_event = 0; /* none */ |
|
| 326 | 325 | ||
| 327 | /* |
326 | /* |
| 328 | * Neither t's lock nor threads_lock may be held during wakeup |
327 | * Neither t's lock nor threads_lock may be held during wakeup |
| 329 | */ |
328 | */ |
| 330 | waitq_wakeup(&t->go_wq, WAKEUP_FIRST); |
329 | waitq_wakeup(&t->go_wq, WAKEUP_FIRST); |
| Line 354... | Line 353... | ||
| 354 | if (rc != EOK) { |
353 | if (rc != EOK) { |
| 355 | interrupts_restore(ipl); |
354 | interrupts_restore(ipl); |
| 356 | return rc; |
355 | return rc; |
| 357 | } |
356 | } |
| 358 | 357 | ||
| 359 | //FIXME: additionally we need to verify that we are inside a syscall |
358 | /* Additionally we need to verify that we are inside a syscall */ |
| - | 359 | if (t->cur_event != UDEBUG_EVENT_SYSCALL) { |
|
| - | 360 | _thread_op_end(t); |
|
| - | 361 | interrupts_restore(ipl); |
|
| - | 362 | return EINVAL; |
|
| - | 363 | } |
|
| 360 | 364 | ||
| 361 | /* Copy to a local buffer before releasing the lock */ |
365 | /* Copy to a local buffer before releasing the lock */ |
| 362 | memcpy(buffer, t->syscall_args, 6 * sizeof(unative_t)); |
366 | memcpy(buffer, t->syscall_args, 6 * sizeof(unative_t)); |
| 363 | 367 | ||
| 364 | _thread_op_end(t); |
368 | _thread_op_end(t); |