Subversion Repositories HelenOS

Rev

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

Rev 2894 Rev 2896
Line 265... Line 265...
265
        /* Count all threads, to be on the safe side */
265
        /* Count all threads, to be on the safe side */
266
        ++num_threads;
266
        ++num_threads;
267
    }
267
    }
268
 
268
 
269
    /* Allocate a buffer and copy down the threads' ids */
269
    /* Allocate a buffer and copy down the threads' ids */
-
 
270
    //FIXME!!! must not malloc when locks are held
270
    id_buffer = malloc(num_threads * sizeof(unative_t), 0); // ???
271
    id_buffer = malloc(num_threads * sizeof(unative_t), 0);
-
 
272
    if (!id_buffer) {
-
 
273
        spinlock_unlock(&TASK->lock);
-
 
274
        interrupts_restore(ipl);
-
 
275
 
-
 
276
        return ENOMEM;
-
 
277
    }
271
 
278
 
272
    copied_ids = 0;
279
    copied_ids = 0;
273
    for (cur = TASK->th_head.next; cur != &TASK->th_head; cur = cur->next) {
280
    for (cur = TASK->th_head.next; cur != &TASK->th_head; cur = cur->next) {
274
        t = list_get_instance(cur, thread_t, th_link);
281
        t = list_get_instance(cur, thread_t, th_link);
275
 
282
 
Line 300... Line 307...
300
    ipl_t ipl;
307
    ipl_t ipl;
301
    unative_t *arg_buffer;
308
    unative_t *arg_buffer;
302
 
309
 
303
    klog_printf("udebug_args_read()");
310
    klog_printf("udebug_args_read()");
304
 
311
 
-
 
312
    /* Prepare a buffer to hold the arguments */
-
 
313
    arg_buffer = malloc(6 * sizeof(unative_t), 0);
-
 
314
    if (!arg_buffer) return ENOMEM;
-
 
315
 
305
    ipl = interrupts_disable();
316
    ipl = interrupts_disable();
306
 
317
 
307
    /* On success, this will lock t->debug_lock */
318
    /* On success, this will lock t->debug_lock */
308
    rc = _thread_op_begin(t);
319
    rc = _thread_op_begin(t);
309
    if (rc != EOK) {
320
    if (rc != EOK) {
Line 318... Line 329...
318
 
329
 
319
        return EINVAL;
330
        return EINVAL;
320
    }
331
    }
321
 
332
 
322
    /* Copy to a local buffer before releasing the lock */
333
    /* Copy to a local buffer before releasing the lock */
323
    arg_buffer = malloc(6 * sizeof(unative_t), 0); // ???
-
 
324
    memcpy(arg_buffer, t->syscall_args, 6 * sizeof(unative_t));
334
    memcpy(arg_buffer, t->syscall_args, 6 * sizeof(unative_t));
325
 
335
 
326
    _thread_op_end(t);
336
    _thread_op_end(t);
327
    interrupts_restore(ipl);
337
    interrupts_restore(ipl);
328
 
338
 
Line 337... Line 347...
337
    int rc;
347
    int rc;
338
    ipl_t ipl;
348
    ipl_t ipl;
339
 
349
 
340
    klog_printf("udebug_regs_read()");
350
    klog_printf("udebug_regs_read()");
341
 
351
 
-
 
352
    /* Prepare a buffer to hold the registers */
-
 
353
    regs_buffer = malloc(sizeof(istate_t), 0);
-
 
354
    if (!regs_buffer) return ENOMEM;
-
 
355
 
342
    ipl = interrupts_disable();
356
    ipl = interrupts_disable();
343
 
357
 
344
    /* On success, this will lock t->debug_lock */
358
    /* On success, this will lock t->debug_lock */
345
    rc = _thread_op_begin(t);
359
    rc = _thread_op_begin(t);
346
    if (rc != EOK) {
360
    if (rc != EOK) {
Line 354... Line 368...
354
        interrupts_restore(ipl);
368
        interrupts_restore(ipl);
355
        klog_printf("udebug_regs_read() - istate not available");
369
        klog_printf("udebug_regs_read() - istate not available");
356
        return EBUSY;
370
        return EBUSY;
357
    }
371
    }
358
 
372
 
359
    /* Copy to an allocated buffer */
373
    /* Copy to the allocated buffer */
360
    regs_buffer = malloc(sizeof(istate_t), 0); // ???
-
 
361
    memcpy(regs_buffer, state, sizeof(istate_t));
374
    memcpy(regs_buffer, state, sizeof(istate_t));
362
 
375
 
363
    _thread_op_end(t);
376
    _thread_op_end(t);
364
    interrupts_restore(ipl);
377
    interrupts_restore(ipl);
365
 
378
 
Line 411... Line 424...
411
    void *data_buffer;
424
    void *data_buffer;
412
    int rc;
425
    int rc;
413
 
426
 
414
    klog_printf("udebug_mem_read()");
427
    klog_printf("udebug_mem_read()");
415
 
428
 
416
    data_buffer = malloc(n, 0); // ???
429
    data_buffer = malloc(n, 0);
-
 
430
    if (!data_buffer) return ENOMEM;
-
 
431
 
417
    klog_printf("udebug_mem_read: src=%u, size=%u", uspace_addr, n);
432
    klog_printf("udebug_mem_read: src=%u, size=%u", uspace_addr, n);
418
 
433
 
419
    /* NOTE: this is not strictly from a syscall... but that shouldn't
434
    /* NOTE: this is not strictly from a syscall... but that shouldn't
420
     * be a problem */
435
     * be a problem */
421
    rc = copy_from_uspace(data_buffer, (void *)uspace_addr, n);
436
    rc = copy_from_uspace(data_buffer, (void *)uspace_addr, n);