Rev 3600 | Rev 3604 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3600 | Rev 3601 | ||
---|---|---|---|
Line 93... | Line 93... | ||
93 | * At the beginning the thread is stoppable, so int_lock be set, too. |
93 | * At the beginning the thread is stoppable, so int_lock be set, too. |
94 | */ |
94 | */ |
95 | atomic_set(&ut->int_lock, 1); |
95 | atomic_set(&ut->int_lock, 1); |
96 | 96 | ||
97 | ut->go_call = NULL; |
97 | ut->go_call = NULL; |
98 | ut->stop = true; |
98 | ut->go = false; |
99 | ut->stoppable = true; |
99 | ut->stoppable = true; |
100 | ut->debug_active = false; |
100 | ut->debug_active = false; |
101 | ut->cur_event = 0; /* none */ |
101 | ut->cur_event = 0; /* none */ |
102 | } |
102 | } |
103 | 103 | ||
Line 196... | Line 196... | ||
196 | } else if (TASK->udebug.dt_state == UDEBUG_TS_ACTIVE) { |
196 | } else if (TASK->udebug.dt_state == UDEBUG_TS_ACTIVE) { |
197 | /* |
197 | /* |
198 | * Active debugging session |
198 | * Active debugging session |
199 | */ |
199 | */ |
200 | 200 | ||
201 | if (THREAD->udebug.debug_active && THREAD->udebug.stop) { |
201 | if (THREAD->udebug.debug_active == true && |
- | 202 | THREAD->udebug.go == false) { |
|
202 | /* |
203 | /* |
203 | * Thread was requested to stop - answer go call |
204 | * Thread was requested to stop - answer go call |
204 | */ |
205 | */ |
205 | 206 | ||
206 | /* Make sure nobody takes this call away from us */ |
207 | /* Make sure nobody takes this call away from us */ |
Line 237... | Line 238... | ||
237 | restart: |
238 | restart: |
238 | mutex_lock(&TASK->udebug.lock); |
239 | mutex_lock(&TASK->udebug.lock); |
239 | mutex_lock(&THREAD->udebug.lock); |
240 | mutex_lock(&THREAD->udebug.lock); |
240 | 241 | ||
241 | if (THREAD->udebug.debug_active && |
242 | if (THREAD->udebug.debug_active && |
242 | THREAD->udebug.stop == true) { |
243 | THREAD->udebug.go == false) { |
243 | TASK->udebug.begin_call = NULL; |
244 | TASK->udebug.begin_call = NULL; |
244 | mutex_unlock(&THREAD->udebug.lock); |
245 | mutex_unlock(&THREAD->udebug.lock); |
245 | mutex_unlock(&TASK->udebug.lock); |
246 | mutex_unlock(&TASK->udebug.lock); |
246 | 247 | ||
247 | udebug_wait_for_go(&THREAD->udebug.go_wq); |
248 | udebug_wait_for_go(&THREAD->udebug.go_wq); |
Line 321... | Line 322... | ||
321 | mutex_lock(&TASK->udebug.lock); |
322 | mutex_lock(&TASK->udebug.lock); |
322 | mutex_lock(&THREAD->udebug.lock); |
323 | mutex_lock(&THREAD->udebug.lock); |
323 | 324 | ||
324 | /* Must only generate events when in debugging session and is go. */ |
325 | /* Must only generate events when in debugging session and is go. */ |
325 | if (THREAD->udebug.debug_active != true || |
326 | if (THREAD->udebug.debug_active != true || |
326 | THREAD->udebug.stop == true || |
327 | THREAD->udebug.go == false || |
327 | (TASK->udebug.evmask & UDEBUG_EVMASK(etype)) == 0) { |
328 | (TASK->udebug.evmask & UDEBUG_EVMASK(etype)) == 0) { |
328 | mutex_unlock(&THREAD->udebug.lock); |
329 | mutex_unlock(&THREAD->udebug.lock); |
329 | mutex_unlock(&TASK->udebug.lock); |
330 | mutex_unlock(&TASK->udebug.lock); |
330 | return; |
331 | return; |
331 | } |
332 | } |
Line 346... | Line 347... | ||
346 | THREAD->udebug.syscall_args[3] = a4; |
347 | THREAD->udebug.syscall_args[3] = a4; |
347 | THREAD->udebug.syscall_args[4] = a5; |
348 | THREAD->udebug.syscall_args[4] = a5; |
348 | THREAD->udebug.syscall_args[5] = a6; |
349 | THREAD->udebug.syscall_args[5] = a6; |
349 | 350 | ||
350 | /* |
351 | /* |
351 | * Make sure udebug.stop is true when going to sleep |
352 | * Make sure udebug.go is false when going to sleep |
352 | * in case we get woken up by DEBUG_END. (At which |
353 | * in case we get woken up by DEBUG_END. (At which |
353 | * point it must be back to the initial true value). |
354 | * point it must be back to the initial true value). |
354 | */ |
355 | */ |
355 | THREAD->udebug.stop = true; |
356 | THREAD->udebug.go = false; |
356 | THREAD->udebug.cur_event = etype; |
357 | THREAD->udebug.cur_event = etype; |
357 | 358 | ||
358 | ipc_answer(&TASK->answerbox, call); |
359 | ipc_answer(&TASK->answerbox, call); |
359 | 360 | ||
360 | mutex_unlock(&THREAD->udebug.lock); |
361 | mutex_unlock(&THREAD->udebug.lock); |
Line 385... | Line 386... | ||
385 | LOG("udebug_thread_b_event\n"); |
386 | LOG("udebug_thread_b_event\n"); |
386 | LOG("- check state\n"); |
387 | LOG("- check state\n"); |
387 | 388 | ||
388 | /* Must only generate events when in debugging session */ |
389 | /* Must only generate events when in debugging session */ |
389 | if (THREAD->udebug.debug_active != true) { |
390 | if (THREAD->udebug.debug_active != true) { |
390 | LOG("- debug_active: %s, udebug.stop: %s\n", |
391 | LOG("- debug_active: %s, udebug.go: %s\n", |
391 | THREAD->udebug.debug_active ? "yes(+)" : "no(-)", |
392 | THREAD->udebug.debug_active ? "yes(+)" : "no(-)", |
392 | THREAD->udebug.stop ? "yes(-)" : "no(+)"); |
393 | THREAD->udebug.go ? "yes(-)" : "no(+)"); |
393 | mutex_unlock(&THREAD->udebug.lock); |
394 | mutex_unlock(&THREAD->udebug.lock); |
394 | mutex_unlock(&TASK->udebug.lock); |
395 | mutex_unlock(&TASK->udebug.lock); |
395 | return; |
396 | return; |
396 | } |
397 | } |
397 | 398 | ||
Line 402... | Line 403... | ||
402 | IPC_SET_RETVAL(call->data, 0); |
403 | IPC_SET_RETVAL(call->data, 0); |
403 | IPC_SET_ARG1(call->data, UDEBUG_EVENT_THREAD_B); |
404 | IPC_SET_ARG1(call->data, UDEBUG_EVENT_THREAD_B); |
404 | IPC_SET_ARG2(call->data, (unative_t)t); |
405 | IPC_SET_ARG2(call->data, (unative_t)t); |
405 | 406 | ||
406 | /* |
407 | /* |
407 | * Make sure udebug.stop is true when going to sleep |
408 | * Make sure udebug.go is false when going to sleep |
408 | * in case we get woken up by DEBUG_END. (At which |
409 | * in case we get woken up by DEBUG_END. (At which |
409 | * point it must be back to the initial true value). |
410 | * point it must be back to the initial true value). |
410 | */ |
411 | */ |
411 | THREAD->udebug.stop = true; |
412 | THREAD->udebug.go = false; |
412 | THREAD->udebug.cur_event = UDEBUG_EVENT_THREAD_B; |
413 | THREAD->udebug.cur_event = UDEBUG_EVENT_THREAD_B; |
413 | 414 | ||
414 | ipc_answer(&TASK->answerbox, call); |
415 | ipc_answer(&TASK->answerbox, call); |
415 | 416 | ||
416 | mutex_unlock(&THREAD->udebug.lock); |
417 | mutex_unlock(&THREAD->udebug.lock); |
Line 439... | Line 440... | ||
439 | LOG("udebug_thread_e_event\n"); |
440 | LOG("udebug_thread_e_event\n"); |
440 | LOG("- check state\n"); |
441 | LOG("- check state\n"); |
441 | 442 | ||
442 | /* Must only generate events when in debugging session. */ |
443 | /* Must only generate events when in debugging session. */ |
443 | if (THREAD->udebug.debug_active != true) { |
444 | if (THREAD->udebug.debug_active != true) { |
444 | /* printf("- debug_active: %s, udebug.stop: %s\n", |
445 | /* printf("- debug_active: %s, udebug.go: %s\n", |
445 | THREAD->udebug.debug_active ? "yes(+)" : "no(-)", |
446 | THREAD->udebug.debug_active ? "yes(+)" : "no(-)", |
446 | THREAD->udebug.stop ? "yes(-)" : "no(+)");*/ |
447 | THREAD->udebug.go ? "yes(-)" : "no(+)");*/ |
447 | mutex_unlock(&THREAD->udebug.lock); |
448 | mutex_unlock(&THREAD->udebug.lock); |
448 | mutex_unlock(&TASK->udebug.lock); |
449 | mutex_unlock(&TASK->udebug.lock); |
449 | return; |
450 | return; |
450 | } |
451 | } |
451 | 452 | ||
Line 457... | Line 458... | ||
457 | IPC_SET_ARG1(call->data, UDEBUG_EVENT_THREAD_E); |
458 | IPC_SET_ARG1(call->data, UDEBUG_EVENT_THREAD_E); |
458 | 459 | ||
459 | /* Prevent any further debug activity in thread. */ |
460 | /* Prevent any further debug activity in thread. */ |
460 | THREAD->udebug.debug_active = false; |
461 | THREAD->udebug.debug_active = false; |
461 | THREAD->udebug.cur_event = 0; /* none */ |
462 | THREAD->udebug.cur_event = 0; /* none */ |
462 | THREAD->udebug.stop = true; /* set to initial value */ |
463 | THREAD->udebug.go = false; /* set to initial value */ |
463 | 464 | ||
464 | ipc_answer(&TASK->answerbox, call); |
465 | ipc_answer(&TASK->answerbox, call); |
465 | 466 | ||
466 | mutex_unlock(&THREAD->udebug.lock); |
467 | mutex_unlock(&THREAD->udebug.lock); |
467 | mutex_unlock(&TASK->udebug.lock); |
468 | mutex_unlock(&TASK->udebug.lock); |
Line 517... | Line 518... | ||
517 | /* Prevent any further debug activity in thread. */ |
518 | /* Prevent any further debug activity in thread. */ |
518 | t->udebug.debug_active = false; |
519 | t->udebug.debug_active = false; |
519 | t->udebug.cur_event = 0; /* none */ |
520 | t->udebug.cur_event = 0; /* none */ |
520 | 521 | ||
521 | /* Is the thread still go? */ |
522 | /* Is the thread still go? */ |
522 | if (t->udebug.stop == false) { |
523 | if (t->udebug.go == true) { |
523 | /* |
524 | /* |
524 | * Yes, so clear go. As debug_active == false, |
525 | * Yes, so clear go. As debug_active == false, |
525 | * this doesn't affect anything. |
526 | * this doesn't affect anything. |
526 | */ |
527 | */ |
527 | t->udebug.stop = true; |
528 | t->udebug.go = false; |
528 | 529 | ||
529 | /* Answer GO call */ |
530 | /* Answer GO call */ |
530 | LOG("answer GO call with EVENT_FINISHED\n"); |
531 | LOG("answer GO call with EVENT_FINISHED\n"); |
531 | IPC_SET_RETVAL(t->udebug.go_call->data, 0); |
532 | IPC_SET_RETVAL(t->udebug.go_call->data, 0); |
532 | IPC_SET_ARG1(t->udebug.go_call->data, |
533 | IPC_SET_ARG1(t->udebug.go_call->data, |