Rev 3623 | Rev 4377 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 3623 | Rev 3684 | ||
|---|---|---|---|
| Line 70... | Line 70... | ||
| 70 | 70 | ||
| 71 | ut->go_call = NULL; |
71 | ut->go_call = NULL; |
| 72 | ut->uspace_state = NULL; |
72 | ut->uspace_state = NULL; |
| 73 | ut->go = false; |
73 | ut->go = false; |
| 74 | ut->stoppable = true; |
74 | ut->stoppable = true; |
| 75 | ut->debug_active = false; |
75 | ut->active = false; |
| 76 | ut->cur_event = 0; /* none */ |
76 | ut->cur_event = 0; /* none */ |
| 77 | } |
77 | } |
| 78 | 78 | ||
| 79 | /** Wait for a GO message. |
79 | /** Wait for a GO message. |
| 80 | * |
80 | * |
| Line 110... | Line 110... | ||
| 110 | static bool udebug_thread_precheck(void) |
110 | static bool udebug_thread_precheck(void) |
| 111 | { |
111 | { |
| 112 | bool res; |
112 | bool res; |
| 113 | 113 | ||
| 114 | mutex_lock(&THREAD->udebug.lock); |
114 | mutex_lock(&THREAD->udebug.lock); |
| 115 | res = THREAD->udebug.debug_active; |
115 | res = THREAD->udebug.active; |
| 116 | mutex_unlock(&THREAD->udebug.lock); |
116 | mutex_unlock(&THREAD->udebug.lock); |
| 117 | 117 | ||
| 118 | return res; |
118 | return res; |
| 119 | } |
119 | } |
| 120 | 120 | ||
| Line 168... | Line 168... | ||
| 168 | } else if (TASK->udebug.dt_state == UDEBUG_TS_ACTIVE) { |
168 | } else if (TASK->udebug.dt_state == UDEBUG_TS_ACTIVE) { |
| 169 | /* |
169 | /* |
| 170 | * Active debugging session |
170 | * Active debugging session |
| 171 | */ |
171 | */ |
| 172 | 172 | ||
| 173 | if (THREAD->udebug.debug_active == true && |
173 | if (THREAD->udebug.active == true && |
| 174 | THREAD->udebug.go == false) { |
174 | THREAD->udebug.go == false) { |
| 175 | /* |
175 | /* |
| 176 | * Thread was requested to stop - answer go call |
176 | * Thread was requested to stop - answer go call |
| 177 | */ |
177 | */ |
| 178 | 178 | ||
| Line 208... | Line 208... | ||
| 208 | 208 | ||
| 209 | restart: |
209 | restart: |
| 210 | mutex_lock(&TASK->udebug.lock); |
210 | mutex_lock(&TASK->udebug.lock); |
| 211 | mutex_lock(&THREAD->udebug.lock); |
211 | mutex_lock(&THREAD->udebug.lock); |
| 212 | 212 | ||
| 213 | if (THREAD->udebug.debug_active && |
- | |
| 214 | THREAD->udebug.go == false) { |
213 | if (THREAD->udebug.active && THREAD->udebug.go == false) { |
| 215 | TASK->udebug.begin_call = NULL; |
214 | TASK->udebug.begin_call = NULL; |
| 216 | mutex_unlock(&THREAD->udebug.lock); |
215 | mutex_unlock(&THREAD->udebug.lock); |
| 217 | mutex_unlock(&TASK->udebug.lock); |
216 | mutex_unlock(&TASK->udebug.lock); |
| 218 | 217 | ||
| 219 | udebug_wait_for_go(&THREAD->udebug.go_wq); |
218 | udebug_wait_for_go(&THREAD->udebug.go_wq); |
| Line 262... | Line 261... | ||
| 262 | 261 | ||
| 263 | mutex_lock(&TASK->udebug.lock); |
262 | mutex_lock(&TASK->udebug.lock); |
| 264 | mutex_lock(&THREAD->udebug.lock); |
263 | mutex_lock(&THREAD->udebug.lock); |
| 265 | 264 | ||
| 266 | /* Must only generate events when in debugging session and is go. */ |
265 | /* Must only generate events when in debugging session and is go. */ |
| 267 | if (THREAD->udebug.debug_active != true || |
- | |
| 268 | THREAD->udebug.go == false || |
266 | if (THREAD->udebug.active != true || THREAD->udebug.go == false || |
| 269 | (TASK->udebug.evmask & UDEBUG_EVMASK(etype)) == 0) { |
267 | (TASK->udebug.evmask & UDEBUG_EVMASK(etype)) == 0) { |
| 270 | mutex_unlock(&THREAD->udebug.lock); |
268 | mutex_unlock(&THREAD->udebug.lock); |
| 271 | mutex_unlock(&TASK->udebug.lock); |
269 | mutex_unlock(&TASK->udebug.lock); |
| 272 | return; |
270 | return; |
| 273 | } |
271 | } |
| Line 332... | Line 330... | ||
| 332 | 330 | ||
| 333 | LOG("udebug_thread_b_event\n"); |
331 | LOG("udebug_thread_b_event\n"); |
| 334 | LOG("- check state\n"); |
332 | LOG("- check state\n"); |
| 335 | 333 | ||
| 336 | /* Must only generate events when in debugging session */ |
334 | /* Must only generate events when in debugging session */ |
| 337 | if (THREAD->udebug.debug_active != true) { |
335 | if (THREAD->udebug.active != true) { |
| 338 | LOG("- debug_active: %s, udebug.go: %s\n", |
336 | LOG("- udebug.active: %s, udebug.go: %s\n", |
| 339 | THREAD->udebug.debug_active ? "yes(+)" : "no(-)", |
337 | THREAD->udebug.active ? "yes(+)" : "no(-)", |
| 340 | THREAD->udebug.go ? "yes(-)" : "no(+)"); |
338 | THREAD->udebug.go ? "yes(-)" : "no(+)"); |
| 341 | mutex_unlock(&THREAD->udebug.lock); |
339 | mutex_unlock(&THREAD->udebug.lock); |
| 342 | mutex_unlock(&TASK->udebug.lock); |
340 | mutex_unlock(&TASK->udebug.lock); |
| 343 | return; |
341 | return; |
| 344 | } |
342 | } |
| Line 382... | Line 380... | ||
| 382 | 380 | ||
| 383 | LOG("udebug_thread_e_event\n"); |
381 | LOG("udebug_thread_e_event\n"); |
| 384 | LOG("- check state\n"); |
382 | LOG("- check state\n"); |
| 385 | 383 | ||
| 386 | /* Must only generate events when in debugging session. */ |
384 | /* Must only generate events when in debugging session. */ |
| 387 | if (THREAD->udebug.debug_active != true) { |
385 | if (THREAD->udebug.active != true) { |
| 388 | /* printf("- debug_active: %s, udebug.go: %s\n", |
386 | /* printf("- udebug.active: %s, udebug.go: %s\n", |
| 389 | THREAD->udebug.debug_active ? "yes(+)" : "no(-)", |
387 | THREAD->udebug.active ? "yes(+)" : "no(-)", |
| 390 | THREAD->udebug.go ? "yes(-)" : "no(+)");*/ |
388 | THREAD->udebug.go ? "yes(-)" : "no(+)");*/ |
| 391 | mutex_unlock(&THREAD->udebug.lock); |
389 | mutex_unlock(&THREAD->udebug.lock); |
| 392 | mutex_unlock(&TASK->udebug.lock); |
390 | mutex_unlock(&TASK->udebug.lock); |
| 393 | return; |
391 | return; |
| 394 | } |
392 | } |
| Line 399... | Line 397... | ||
| 399 | THREAD->udebug.go_call = NULL; |
397 | THREAD->udebug.go_call = NULL; |
| 400 | IPC_SET_RETVAL(call->data, 0); |
398 | IPC_SET_RETVAL(call->data, 0); |
| 401 | IPC_SET_ARG1(call->data, UDEBUG_EVENT_THREAD_E); |
399 | IPC_SET_ARG1(call->data, UDEBUG_EVENT_THREAD_E); |
| 402 | 400 | ||
| 403 | /* Prevent any further debug activity in thread. */ |
401 | /* Prevent any further debug activity in thread. */ |
| 404 | THREAD->udebug.debug_active = false; |
402 | THREAD->udebug.active = false; |
| 405 | THREAD->udebug.cur_event = 0; /* none */ |
403 | THREAD->udebug.cur_event = 0; /* none */ |
| 406 | THREAD->udebug.go = false; /* set to initial value */ |
404 | THREAD->udebug.go = false; /* set to initial value */ |
| 407 | 405 | ||
| 408 | ipc_answer(&TASK->answerbox, call); |
406 | ipc_answer(&TASK->answerbox, call); |
| 409 | 407 | ||
| Line 422... | Line 420... | ||
| 422 | 420 | ||
| 423 | mutex_lock(&TASK->udebug.lock); |
421 | mutex_lock(&TASK->udebug.lock); |
| 424 | mutex_lock(&THREAD->udebug.lock); |
422 | mutex_lock(&THREAD->udebug.lock); |
| 425 | 423 | ||
| 426 | /* Must only generate events when in debugging session and have go. */ |
424 | /* Must only generate events when in debugging session and have go. */ |
| 427 | if (THREAD->udebug.debug_active != true || |
- | |
| 428 | THREAD->udebug.go == false) { |
425 | if (THREAD->udebug.active != true || THREAD->udebug.go == false) { |
| 429 | mutex_unlock(&THREAD->udebug.lock); |
426 | mutex_unlock(&THREAD->udebug.lock); |
| 430 | mutex_unlock(&TASK->udebug.lock); |
427 | mutex_unlock(&TASK->udebug.lock); |
| 431 | return; |
428 | return; |
| 432 | } |
429 | } |
| 433 | 430 | ||
| Line 514... | Line 511... | ||
| 514 | interrupts_restore(ipl); |
511 | interrupts_restore(ipl); |
| 515 | 512 | ||
| 516 | /* Only process userspace threads. */ |
513 | /* Only process userspace threads. */ |
| 517 | if ((flags & THREAD_FLAG_USPACE) != 0) { |
514 | if ((flags & THREAD_FLAG_USPACE) != 0) { |
| 518 | /* Prevent any further debug activity in thread. */ |
515 | /* Prevent any further debug activity in thread. */ |
| 519 | t->udebug.debug_active = false; |
516 | t->udebug.active = false; |
| 520 | t->udebug.cur_event = 0; /* none */ |
517 | t->udebug.cur_event = 0; /* none */ |
| 521 | 518 | ||
| 522 | /* Is the thread still go? */ |
519 | /* Is the thread still go? */ |
| 523 | if (t->udebug.go == true) { |
520 | if (t->udebug.go == true) { |
| 524 | /* |
521 | /* |
| 525 | * Yes, so clear go. As debug_active == false, |
522 | * Yes, so clear go. As active == false, |
| 526 | * this doesn't affect anything. |
523 | * this doesn't affect anything. |
| 527 | */ |
524 | */ |
| 528 | t->udebug.go = false; |
525 | t->udebug.go = false; |
| 529 | 526 | ||
| 530 | /* Answer GO call */ |
527 | /* Answer GO call */ |