Subversion Repositories HelenOS

Rev

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

Rev 2833 Rev 2834
Line 116... Line 116...
116
        rc ? "backsend" : "stoppability wait");
116
        rc ? "backsend" : "stoppability wait");
117
 
117
 
118
    return rc;
118
    return rc;
119
}
119
}
120
 
120
 
-
 
121
static int udebug_rp_end(call_t *call, phone_t *phone)
-
 
122
{
-
 
123
    task_t *ta;
-
 
124
    ipl_t ipl;
-
 
125
 
-
 
126
    thread_t *t;
-
 
127
    link_t *cur;
-
 
128
 
-
 
129
    klog_printf("udebug_rp_end()");
-
 
130
 
-
 
131
    ipl = interrupts_disable();
-
 
132
    ta = get_lock_callee_task(phone);
-
 
133
    klog_printf("task %llu", ta->taskid);
-
 
134
 
-
 
135
    //TODO: UDEBUG_TS_BEGINNING
-
 
136
    if (ta->dt_state != UDEBUG_TS_ACTIVE) {
-
 
137
        spinlock_unlock(&ta->lock);
-
 
138
        interrupts_restore(ipl);
-
 
139
        klog_printf("udebug_rp_begin(): task not in TS_BEGINNING");
-
 
140
        return EINVAL;
-
 
141
    }
-
 
142
 
-
 
143
    /* Clear debug_active from all of the task's userspace threads */
-
 
144
 
-
 
145
    for (cur = ta->th_head.next; cur != &ta->th_head; cur = cur->next) {
-
 
146
        t = list_get_instance(cur, thread_t, th_link);
-
 
147
 
-
 
148
        spinlock_lock(&t->lock);
-
 
149
        if ((t->flags & THREAD_FLAG_USPACE) != 0)
-
 
150
            t->debug_active = true;
-
 
151
        spinlock_unlock(&t->lock);
-
 
152
    }
-
 
153
 
-
 
154
    /* Now respond to unanswered GO calls and reset thread states */
-
 
155
    for (cur = ta->th_head.next; cur != &ta->th_head; cur = cur->next) {
-
 
156
        t = list_get_instance(cur, thread_t, th_link);
-
 
157
 
-
 
158
        spinlock_lock(&t->lock);
-
 
159
 
-
 
160
        /* Still has go? */
-
 
161
        if ((t->flags & THREAD_FLAG_USPACE) != 0 &&
-
 
162
            t->debug_stop == false) {
-
 
163
            /*
-
 
164
             * Yes, so clear go. As debug_active == false,
-
 
165
             * this doesn't affect anything.
-
 
166
             */
-
 
167
            t->debug_stop = true;  
-
 
168
 
-
 
169
            /* Answer GO call */
-
 
170
            ipc_answer(&ta->answerbox, t->debug_go_call);
-
 
171
        } else {
-
 
172
            /*
-
 
173
             * Debug_stop is already at initial value.
-
 
174
             * Yet this means the thread needs waking up.
-
 
175
             */
-
 
176
            waitq_wakeup(&t->go_wq, WAKEUP_FIRST);
-
 
177
        }
-
 
178
        spinlock_unlock(&t->lock);
-
 
179
    }
-
 
180
 
-
 
181
    ta->dt_state = UDEBUG_TS_INACTIVE;
-
 
182
 
-
 
183
    spinlock_unlock(&ta->lock);
-
 
184
    interrupts_restore(ipl);
-
 
185
 
-
 
186
    klog_printf("udebug_rp_end() done\n");
-
 
187
 
-
 
188
    return 1;
-
 
189
}
-
 
190
 
-
 
191
 
121
static int udebug_rp_go(call_t *call, phone_t *phone)
192
static int udebug_rp_go(call_t *call, phone_t *phone)
122
{
193
{
123
    thread_t *t;
194
    thread_t *t;
124
    task_t *ta;
195
    task_t *ta;
125
    ipl_t ipl;
196
    ipl_t ipl;
Line 471... Line 542...
471
 
542
 
472
    switch (IPC_GET_ARG1(call->data)) {
543
    switch (IPC_GET_ARG1(call->data)) {
473
    case UDEBUG_M_BEGIN:
544
    case UDEBUG_M_BEGIN:
474
        rc = udebug_rp_begin(call, phone);
545
        rc = udebug_rp_begin(call, phone);
475
        return rc;
546
        return rc;
-
 
547
    case UDEBUG_M_END:
-
 
548
        rc = udebug_rp_end(call, phone);
-
 
549
        return rc;
476
    case UDEBUG_M_GO:
550
    case UDEBUG_M_GO:
477
        rc = udebug_rp_go(call, phone);
551
        rc = udebug_rp_go(call, phone);
478
        return rc;
552
        return rc;
479
    case UDEBUG_M_ARGS_READ:
553
    case UDEBUG_M_ARGS_READ:
480
        rc = udebug_rp_args_read(call, phone);
554
        rc = udebug_rp_args_read(call, phone);