Subversion Repositories HelenOS

Rev

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

Rev 2862 Rev 2867
Line 119... Line 119...
119
            ipc_args[0], ipc_args[1], ipc_args[2],
119
            ipc_args[0], ipc_args[1], ipc_args[2],
120
            ipc_args[3], ipc_args[4], ipc_args[5]);
120
            ipc_args[3], ipc_args[4], ipc_args[5]);
121
    }
121
    }
122
}
122
}
123
 
123
 
-
 
124
void event_syscall(unsigned thread_idx, unsigned sc_id, int sc_rc)
-
 
125
{
-
 
126
    unsigned sc_args[6];
-
 
127
    int rv_type;
-
 
128
    int rc;
-
 
129
 
-
 
130
    /* Read syscall arguments */
-
 
131
    rc = debug_args_read(phoneid, threadid_buf[thread_idx], sc_args);
-
 
132
 
-
 
133
    async_serialize_start();
-
 
134
 
-
 
135
    printf("[%d] ", thread_idx);
-
 
136
 
-
 
137
    if (rc < 0) {
-
 
138
        printf("error\n");
-
 
139
        async_serialize_end();
-
 
140
        return;
-
 
141
    }
-
 
142
 
-
 
143
    /* Print syscall name, id and arguments */
-
 
144
    printf("%s", syscall_desc[sc_id].name);
-
 
145
    print_sc_args(sc_args, syscall_desc[sc_id].n_args);
-
 
146
    rv_type = syscall_desc[sc_id].rv_type;
-
 
147
    print_sc_retval(sc_rc, rv_type);
-
 
148
 
-
 
149
    switch (sc_id) {
-
 
150
    case SYS_IPC_CALL_ASYNC_SLOW:
-
 
151
        sc_ipc_call_async_slow(sc_args);
-
 
152
        break;
-
 
153
    default:
-
 
154
        break;
-
 
155
    }
-
 
156
 
-
 
157
    async_serialize_end();
-
 
158
}
-
 
159
 
-
 
160
void event_new_thread(unsigned hash)
-
 
161
{
-
 
162
    async_serialize_start();
-
 
163
    printf("new thread, hash 0x%x\n", hash);
-
 
164
    async_serialize_end();
-
 
165
}
-
 
166
 
124
void trace_loop(void *thread_idx_arg)
167
void trace_loop(void *thread_idx_arg)
125
{
168
{
126
    int rc;
169
    int rc;
127
    unsigned sc_args[6];
-
 
128
    unsigned copied;
-
 
129
    unsigned ev_type;
170
    unsigned ev_type;
130
    unsigned sc_id;
-
 
131
    int sc_rc;
-
 
132
    int rv_type;
-
 
133
    unsigned thread_idx;
171
    unsigned thread_idx;
-
 
172
    unsigned val0, val1;
134
 
173
 
135
    thread_idx = (unsigned)thread_idx_arg;
174
    thread_idx = (unsigned)thread_idx_arg;
136
    printf("trace_loop(%d)\n", thread_idx);
175
    printf("trace_loop(%d)\n", thread_idx);
137
 
176
 
138
    while (!abort_trace) {
177
    while (!abort_trace) {
139
 
178
 
140
        /* Run thread until a syscall is executed */
179
        /* Run thread until an event occurs */
141
        rc = debug_go(phoneid, threadid_buf[thread_idx],
180
        rc = debug_go(phoneid, threadid_buf[thread_idx],
142
            &ev_type, &sc_id, &sc_rc);
181
            &ev_type, &val0, &val1);
143
 
182
 
144
        printf("rc = %d, ev_type=%d\n", rc, ev_type);
183
        printf("rc = %d, ev_type=%d\n", rc, ev_type);
145
        if (ev_type == UDEBUG_EVENT_FINISHED) {
184
        if (ev_type == UDEBUG_EVENT_FINISHED) {
146
            printf("thread %u debugging finished\n", threadid_buf[thread_idx]);
185
            printf("thread %u debugging finished\n", threadid_buf[thread_idx]);
147
            break;
186
            break;
148
        }
187
        }
149
 
188
 
150
        /* Read syscall arguments */
-
 
151
        if (rc >= 0) {
189
        if (rc >= 0) {
-
 
190
            switch (ev_type) {
-
 
191
            case UDEBUG_EVENT_SYSCALL:
152
            rc = debug_args_read(phoneid, threadid_buf[thread_idx],
192
                event_syscall(thread_idx, val0, (int)val1);
-
 
193
                break;
-
 
194
            case UDEBUG_EVENT_NEW_THREAD:
-
 
195
                event_new_thread(val0);
-
 
196
                break;
-
 
197
            default:
-
 
198
                printf("unknown event type %d\n", ev_type);
153
                sc_args);
199
                break;
-
 
200
            }
154
        }
201
        }
155
 
202
 
156
        async_serialize_start();
-
 
157
 
-
 
158
        printf("[%d] ", thread_idx);
-
 
159
 
-
 
160
        /* Print syscall name, id and arguments */
-
 
161
        if (rc >= 0) {
-
 
162
            printf("%s", syscall_desc[sc_id].name);
-
 
163
            print_sc_args(sc_args, syscall_desc[sc_id].n_args);
-
 
164
            rv_type = syscall_desc[sc_id].rv_type;
-
 
165
            print_sc_retval(sc_rc, rv_type);
-
 
166
        }
-
 
167
 
-
 
168
        async_serialize_end();
-
 
169
 
-
 
170
        switch (sc_id) {
-
 
171
        case SYS_IPC_CALL_ASYNC_SLOW:
-
 
172
            sc_ipc_call_async_slow(sc_args);
-
 
173
            break;
-
 
174
        default:
-
 
175
            break;
-
 
176
        }
-
 
177
    }
203
    }
178
 
204
 
179
    printf("trace_loop(%d) exiting\n", thread_idx);
205
    printf("trace_loop(%d) exiting\n", thread_idx);
180
}
206
}
181
 
207