Subversion Repositories HelenOS

Rev

Rev 2823 | Rev 2826 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2823 Rev 2825
Line 22... Line 22...
22
    spinlock_lock(&TASK->lock);
22
    spinlock_lock(&TASK->lock);
23
 
23
 
24
    nsc = --TASK->not_stoppable_count;
24
    nsc = --TASK->not_stoppable_count;
25
    db_call = TASK->debug_begin_call;
25
    db_call = TASK->debug_begin_call;
26
 
26
 
27
    if (TASK->stop_request == true) {
27
    if (TASK->dt_state == UDEBUG_TS_BEGINNING) {
28
        klog_printf("udebug_stoppable_begin");
28
        klog_printf("udebug_stoppable_begin");
29
        klog_printf(" - nsc := %d", nsc);
29
        klog_printf(" - nsc := %d", nsc);
30
    }
30
    }
31
 
31
 
32
    if (TASK->stop_request == true && nsc == 0) {
32
    if (TASK->dt_state == UDEBUG_TS_BEGINNING && nsc == 0) {
33
        TASK->stop_request = false;
33
        TASK->dt_state = UDEBUG_TS_ACTIVE;
34
        TASK->debug_begin_call = NULL;
34
        TASK->debug_begin_call = NULL;
35
        spinlock_unlock(&TASK->lock);
35
        spinlock_unlock(&TASK->lock);
36
        interrupts_restore(ipl);
36
        interrupts_restore(ipl);
37
 
37
 
38
        IPC_SET_RETVAL(db_call->data, 0);
38
        IPC_SET_RETVAL(db_call->data, 0);
Line 50... Line 50...
50
 
50
 
51
restart:
51
restart:
52
    ipl = interrupts_disable();
52
    ipl = interrupts_disable();
53
    spinlock_lock(&TASK->lock);
53
    spinlock_lock(&TASK->lock);
54
 
54
 
-
 
55
    if ((TASK->dt_state == UDEBUG_TS_BEGINNING ||
-
 
56
        TASK->dt_state == UDEBUG_TS_ACTIVE) &&
55
    if (TASK->stop_request) {
57
        THREAD->debug_stop == true) {
56
        TASK->debug_begin_call = NULL;
58
        TASK->debug_begin_call = NULL;
57
        spinlock_unlock(&TASK->lock);
59
        spinlock_unlock(&TASK->lock);
58
        interrupts_restore(ipl);
60
        interrupts_restore(ipl);
59
 
61
 
60
        klog_printf("udebug_stoppable_end: waitq_sleep");
62
        klog_printf("udebug_stoppable_end: waitq_sleep");
Line 75... Line 77...
75
    ipl_t ipl;
77
    ipl_t ipl;
76
 
78
 
77
    ipl = interrupts_disable();
79
    ipl = interrupts_disable();
78
    spinlock_lock(&TASK->lock);
80
    spinlock_lock(&TASK->lock);
79
 
81
 
80
    /* being debugged + have go */
-
 
81
    if (TASK->being_debugged && !TASK->stop_request) {
82
    if (TASK->dt_state == UDEBUG_TS_ACTIVE) {
82
        klog_printf("udebug_syscall_event");
83
        klog_printf("udebug_syscall_event");
83
        call = TASK->debug_go_call;
84
        call = TASK->debug_go_call;
84
        IPC_SET_RETVAL(call->data, 0);
85
        IPC_SET_RETVAL(call->data, 0);
85
        IPC_SET_ARG1(call->data, UDEBUG_EVENT_SYSCALL);
86
        IPC_SET_ARG1(call->data, UDEBUG_EVENT_SYSCALL);
86
        IPC_SET_ARG2(call->data, id);
87
        IPC_SET_ARG2(call->data, id);
Line 92... Line 93...
92
        THREAD->syscall_args[2] = a3;
93
        THREAD->syscall_args[2] = a3;
93
        THREAD->syscall_args[3] = a4;
94
        THREAD->syscall_args[3] = a4;
94
        THREAD->syscall_args[4] = a5;
95
        THREAD->syscall_args[4] = a5;
95
        THREAD->syscall_args[5] = a6;
96
        THREAD->syscall_args[5] = a6;
96
 
97
 
-
 
98
        /*
-
 
99
         * Make sure debug_stop is true when going to sleep
-
 
100
         * in case we get woken up by DEBUG_END. (At which
-
 
101
         * point it must be back to the initial true value).
-
 
102
         */
-
 
103
        THREAD->debug_stop = true;
-
 
104
 
97
        ipc_answer(&TASK->answerbox, TASK->debug_go_call);
105
        ipc_answer(&TASK->answerbox, TASK->debug_go_call);
98
        spinlock_unlock(&TASK->lock);
106
        spinlock_unlock(&TASK->lock);
99
        interrupts_restore(ipl);
107
        interrupts_restore(ipl);
100
 
108
 
101
        waitq_sleep(&THREAD->go_wq);
109
        waitq_sleep(&THREAD->go_wq);