Subversion Repositories HelenOS

Rev

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

Rev 3063 Rev 3137
Line 43... Line 43...
43
#include <mm/slab.h>
43
#include <mm/slab.h>
44
#include <atomic.h>
44
#include <atomic.h>
45
#include <synch/spinlock.h>
45
#include <synch/spinlock.h>
46
#include <synch/waitq.h>
46
#include <synch/waitq.h>
47
#include <arch.h>
47
#include <arch.h>
-
 
48
#include <arch/barrier.h>
48
#include <panic.h>
49
#include <panic.h>
49
#include <adt/avl.h>
50
#include <adt/avl.h>
50
#include <adt/btree.h>
51
#include <adt/btree.h>
51
#include <adt/list.h>
52
#include <adt/list.h>
52
#include <ipc/ipc.h>
53
#include <ipc/ipc.h>
Line 257... Line 258...
257
        return ENOMEM;
258
        return ENOMEM;
258
   
259
   
259
    int rc = copy_from_uspace(kimage, image, size);
260
    int rc = copy_from_uspace(kimage, image, size);
260
    if (rc != EOK)
261
    if (rc != EOK)
261
        return rc;
262
        return rc;
-
 
263
 
-
 
264
    /*
-
 
265
     * Not very efficient and it would be better to call it on code only,
-
 
266
     * but this whole function is a temporary hack anyway and one day it
-
 
267
     * will go in favor of the userspace dynamic loader.
-
 
268
     */
-
 
269
    smc_coherence_block(kimage, size);
262
   
270
   
-
 
271
    uspace_arg_t *kernel_uarg;
263
    uspace_arg_t *kernel_uarg = (uspace_arg_t *) malloc(sizeof(uspace_arg_t), 0);
272
    kernel_uarg = (uspace_arg_t *) malloc(sizeof(uspace_arg_t), 0);
264
    if (kernel_uarg == NULL) {
273
    if (kernel_uarg == NULL) {
265
        free(kimage);
274
        free(kimage);
266
        return ENOMEM;
275
        return ENOMEM;
267
    }
276
    }
268
   
277
   
Line 287... Line 296...
287
        free(kimage);
296
        free(kimage);
288
        return ENOENT;
297
        return ENOENT;
289
    }
298
    }
290
   
299
   
291
    as_area_t *area = as_area_create(as,
300
    as_area_t *area = as_area_create(as,
292
        AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE,
301
        AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE,
293
        LOADED_PROG_STACK_PAGES_NO * PAGE_SIZE, USTACK_ADDRESS,
302
        LOADED_PROG_STACK_PAGES_NO * PAGE_SIZE, USTACK_ADDRESS,
294
        AS_AREA_ATTR_NONE, &anon_backend, NULL);
303
        AS_AREA_ATTR_NONE, &anon_backend, NULL);
295
    if (area == NULL) {
304
    if (area == NULL) {
296
        as_destroy(as);
305
        as_destroy(as);
297
        free(kernel_uarg);
306
        free(kernel_uarg);
298
        free(kimage);
307
        free(kimage);
299
        return ENOMEM;
308
        return ENOMEM;
Line 309... Line 318...
309
   
318
   
310
    // FIXME: control the capabilities
319
    // FIXME: control the capabilities
311
    cap_set(task, cap_get(TASK));
320
    cap_set(task, cap_get(TASK));
312
   
321
   
313
    thread_t *thread = thread_create(uinit, kernel_uarg, task,
322
    thread_t *thread = thread_create(uinit, kernel_uarg, task,
314
        THREAD_FLAG_USPACE, "user", false);
323
        THREAD_FLAG_USPACE, "user", false);
315
    if (thread == NULL) {
324
    if (thread == NULL) {
316
        task_destroy(task);
325
        task_destroy(task);
317
        as_destroy(as);
326
        as_destroy(as);
318
        free(kernel_uarg);
327
        free(kernel_uarg);
319
        free(kimage);
328
        free(kimage);
Line 440... Line 449...
440
    uint64_t cycles;
449
    uint64_t cycles;
441
    char suffix;
450
    char suffix;
442
    order(task_get_accounting(t), &cycles, &suffix);
451
    order(task_get_accounting(t), &cycles, &suffix);
443
 
452
 
444
#ifdef __32_BITS__  
453
#ifdef __32_BITS__  
445
    printf("%-6" PRIu64 " %-10s %-3" PRIu32 " %10p %10p %9" PRIu64 "%c %7ld %6ld",
454
    printf("%-6" PRIu64 " %-10s %-3" PRIu32 " %10p %10p %9" PRIu64
446
        t->taskid, t->name, t->context, t, t->as, cycles, suffix,
455
        "%c %7ld %6ld", t->taskid, t->name, t->context, t, t->as, cycles,
447
        atomic_get(&t->refcount), atomic_get(&t->active_calls));
456
        suffix, atomic_get(&t->refcount), atomic_get(&t->active_calls));
448
#endif
457
#endif
449
 
458
 
450
#ifdef __64_BITS__
459
#ifdef __64_BITS__
451
    printf("%-6" PRIu64 " %-10s %-3" PRIu32 " %18p %18p %9" PRIu64 "%c %7ld %6ld",
460
    printf("%-6" PRIu64 " %-10s %-3" PRIu32 " %18p %18p %9" PRIu64
452
        t->taskid, t->name, t->context, t, t->as, cycles, suffix,
461
        "%c %7ld %6ld", t->taskid, t->name, t->context, t, t->as, cycles,
453
        atomic_get(&t->refcount), atomic_get(&t->active_calls));
462
        suffix, atomic_get(&t->refcount), atomic_get(&t->active_calls));
454
#endif
463
#endif
455
 
464
 
456
    for (j = 0; j < IPC_MAX_PHONES; j++) {
465
    for (j = 0; j < IPC_MAX_PHONES; j++) {
457
        if (t->phones[j].callee)
466
        if (t->phones[j].callee)
458
            printf(" %d:%p", j, t->phones[j].callee);
467
            printf(" %d:%p", j, t->phones[j].callee);
Line 472... Line 481...
472
    ipl = interrupts_disable();
481
    ipl = interrupts_disable();
473
    spinlock_lock(&tasks_lock);
482
    spinlock_lock(&tasks_lock);
474
 
483
 
475
#ifdef __32_BITS__  
484
#ifdef __32_BITS__  
476
    printf("taskid name       ctx address    as         "
485
    printf("taskid name       ctx address    as         "
477
        "cycles     threads calls  callee\n");
486
        "cycles     threads calls  callee\n");
478
    printf("------ ---------- --- ---------- ---------- "
487
    printf("------ ---------- --- ---------- ---------- "
479
        "---------- ------- ------ ------>\n");
488
        "---------- ------- ------ ------>\n");
480
#endif
489
#endif
481
 
490
 
482
#ifdef __64_BITS__
491
#ifdef __64_BITS__
483
    printf("taskid name       ctx address            as                 "
492
    printf("taskid name       ctx address            as                 "
484
        "cycles     threads calls  callee\n");
493
        "cycles     threads calls  callee\n");
485
    printf("------ ---------- --- ------------------ ------------------ "
494
    printf("------ ---------- --- ------------------ ------------------ "
486
        "---------- ------- ------ ------>\n");
495
        "---------- ------- ------ ------>\n");
487
#endif
496
#endif
488
 
497
 
489
    avltree_walk(&tasks_tree, task_print_walker, NULL);
498
    avltree_walk(&tasks_tree, task_print_walker, NULL);
490
 
499
 
491
    spinlock_unlock(&tasks_lock);
500
    spinlock_unlock(&tasks_lock);