Rev 2071 | Rev 2089 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2071 | Rev 2087 | ||
|---|---|---|---|
| Line 202... | Line 202... | ||
| 202 | void thread_init(void) |
202 | void thread_init(void) |
| 203 | { |
203 | { |
| 204 | THREAD = NULL; |
204 | THREAD = NULL; |
| 205 | atomic_set(&nrdy,0); |
205 | atomic_set(&nrdy,0); |
| 206 | thread_slab = slab_cache_create("thread_slab", sizeof(thread_t), 0, |
206 | thread_slab = slab_cache_create("thread_slab", sizeof(thread_t), 0, |
| 207 | thr_constructor, thr_destructor, 0); |
207 | thr_constructor, thr_destructor, 0); |
| 208 | 208 | ||
| 209 | #ifdef ARCH_HAS_FPU |
209 | #ifdef ARCH_HAS_FPU |
| 210 | fpu_context_slab = slab_cache_create("fpu_slab", sizeof(fpu_context_t), |
210 | fpu_context_slab = slab_cache_create("fpu_slab", sizeof(fpu_context_t), |
| 211 | FPU_CONTEXT_ALIGN, NULL, NULL, 0); |
211 | FPU_CONTEXT_ALIGN, NULL, NULL, 0); |
| 212 | #endif |
212 | #endif |
| 213 | 213 | ||
| 214 | btree_create(&threads_btree); |
214 | btree_create(&threads_btree); |
| 215 | } |
215 | } |
| 216 | 216 | ||
| Line 326... | Line 326... | ||
| 326 | if (!t) |
326 | if (!t) |
| 327 | return NULL; |
327 | return NULL; |
| 328 | 328 | ||
| 329 | /* Not needed, but good for debugging */ |
329 | /* Not needed, but good for debugging */ |
| 330 | memsetb((uintptr_t) t->kstack, THREAD_STACK_SIZE * 1 << STACK_FRAMES, |
330 | memsetb((uintptr_t) t->kstack, THREAD_STACK_SIZE * 1 << STACK_FRAMES, |
| 331 | 0); |
331 | 0); |
| 332 | 332 | ||
| 333 | ipl = interrupts_disable(); |
333 | ipl = interrupts_disable(); |
| 334 | spinlock_lock(&tidlock); |
334 | spinlock_lock(&tidlock); |
| 335 | t->tid = ++last_tid; |
335 | t->tid = ++last_tid; |
| 336 | spinlock_unlock(&tidlock); |
336 | spinlock_unlock(&tidlock); |
| 337 | interrupts_restore(ipl); |
337 | interrupts_restore(ipl); |
| 338 | 338 | ||
| 339 | context_save(&t->saved_context); |
339 | context_save(&t->saved_context); |
| 340 | context_set(&t->saved_context, FADDR(cushion), (uintptr_t) t->kstack, |
340 | context_set(&t->saved_context, FADDR(cushion), (uintptr_t) t->kstack, |
| 341 | THREAD_STACK_SIZE); |
341 | THREAD_STACK_SIZE); |
| 342 | 342 | ||
| 343 | the_initialize((the_t *) t->kstack); |
343 | the_initialize((the_t *) t->kstack); |
| 344 | 344 | ||
| 345 | ipl = interrupts_disable(); |
345 | ipl = interrupts_disable(); |
| 346 | t->saved_context.ipl = interrupts_read(); |
346 | t->saved_context.ipl = interrupts_read(); |
| Line 402... | Line 402... | ||
| 402 | /* |
402 | /* |
| 403 | * Register this thread in the system-wide list. |
403 | * Register this thread in the system-wide list. |
| 404 | */ |
404 | */ |
| 405 | spinlock_lock(&threads_lock); |
405 | spinlock_lock(&threads_lock); |
| 406 | btree_insert(&threads_btree, (btree_key_t) ((uintptr_t) t), (void *) t, |
406 | btree_insert(&threads_btree, (btree_key_t) ((uintptr_t) t), (void *) t, |
| 407 | NULL); |
407 | NULL); |
| 408 | spinlock_unlock(&threads_lock); |
408 | spinlock_unlock(&threads_lock); |
| 409 | 409 | ||
| 410 | interrupts_restore(ipl); |
410 | interrupts_restore(ipl); |
| 411 | 411 | ||
| 412 | return t; |
412 | return t; |
| Line 558... | Line 558... | ||
| 558 | 558 | ||
| 559 | /* Messing with thread structures, avoid deadlock */ |
559 | /* Messing with thread structures, avoid deadlock */ |
| 560 | ipl = interrupts_disable(); |
560 | ipl = interrupts_disable(); |
| 561 | spinlock_lock(&threads_lock); |
561 | spinlock_lock(&threads_lock); |
| 562 | 562 | ||
| 563 | printf("tid name address state task ctx code stack cycles cpu kstack waitqueue\n"); |
563 | printf("tid name address state task ctx code " |
| - | 564 | " stack cycles cpu kstack waitqueue\n"); |
|
| 564 | printf("------ ---------- ---------- -------- ---------- --- ---------- ---------- ---------- ---- ---------- ----------\n"); |
565 | printf("------ ---------- ---------- -------- ---------- --- --------" |
| - | 566 | "-- ---------- ---------- ---- ---------- ----------\n"); |
|
| 565 | 567 | ||
| - | 568 | for (cur = threads_btree.leaf_head.next; |
|
| 566 | for (cur = threads_btree.leaf_head.next; cur != &threads_btree.leaf_head; cur = cur->next) { |
569 | cur != &threads_btree.leaf_head; cur = cur->next) { |
| 567 | btree_node_t *node; |
570 | btree_node_t *node; |
| 568 | int i; |
571 | int i; |
| 569 | 572 | ||
| 570 | node = list_get_instance(cur, btree_node_t, leaf_link); |
573 | node = list_get_instance(cur, btree_node_t, leaf_link); |
| 571 | for (i = 0; i < node->keys; i++) { |
574 | for (i = 0; i < node->keys; i++) { |
| Line 575... | Line 578... | ||
| 575 | 578 | ||
| 576 | uint64_t cycles; |
579 | uint64_t cycles; |
| 577 | char suffix; |
580 | char suffix; |
| 578 | order(t->cycles, &cycles, &suffix); |
581 | order(t->cycles, &cycles, &suffix); |
| 579 | 582 | ||
| - | 583 | printf("%-6zd %-10s %#10zx %-8s %#10zx %-3ld %#10zx " |
|
| - | 584 | "%#10zx %9llu%c ", t->tid, t->name, t, |
|
| 580 | printf("%-6zd %-10s %#10zx %-8s %#10zx %-3ld %#10zx %#10zx %9llu%c ", t->tid, t->name, t, thread_states[t->state], t->task, t->task->context, t->thread_code, t->kstack, cycles, suffix); |
585 | thread_states[t->state], t->task, t->task->context, |
| - | 586 | t->thread_code, t->kstack, cycles, suffix); |
|
| 581 | 587 | ||
| 582 | if (t->cpu) |
588 | if (t->cpu) |
| 583 | printf("%-4zd", t->cpu->id); |
589 | printf("%-4zd", t->cpu->id); |
| 584 | else |
590 | else |
| 585 | printf("none"); |
591 | printf("none"); |
| 586 | 592 | ||
| 587 | if (t->state == Sleeping) |
593 | if (t->state == Sleeping) |
| 588 | printf(" %#10zx %#10zx", t->kstack, t->sleep_queue); |
594 | printf(" %#10zx %#10zx", t->kstack, |
| - | 595 | t->sleep_queue); |
|
| 589 | 596 | ||
| 590 | printf("\n"); |
597 | printf("\n"); |
| 591 | } |
598 | } |
| 592 | } |
599 | } |
| 593 | 600 | ||
| Line 606... | Line 613... | ||
| 606 | */ |
613 | */ |
| 607 | bool thread_exists(thread_t *t) |
614 | bool thread_exists(thread_t *t) |
| 608 | { |
615 | { |
| 609 | btree_node_t *leaf; |
616 | btree_node_t *leaf; |
| 610 | 617 | ||
| 611 | return btree_search(&threads_btree, (btree_key_t) ((uintptr_t) t), &leaf) != NULL; |
618 | return btree_search(&threads_btree, (btree_key_t) ((uintptr_t) t), |
| - | 619 | &leaf) != NULL; |
|
| 612 | } |
620 | } |
| 613 | 621 | ||
| 614 | 622 | ||
| 615 | /** Update accounting of current thread. |
623 | /** Update accounting of current thread. |
| 616 | * |
624 | * |
| Line 645... | Line 653... | ||
| 645 | if (rc != 0) { |
653 | if (rc != 0) { |
| 646 | free(kernel_uarg); |
654 | free(kernel_uarg); |
| 647 | return (unative_t) rc; |
655 | return (unative_t) rc; |
| 648 | } |
656 | } |
| 649 | 657 | ||
| 650 | if ((t = thread_create(uinit, kernel_uarg, TASK, THREAD_FLAG_USPACE, namebuf, false))) { |
658 | t = thread_create(uinit, kernel_uarg, TASK, THREAD_FLAG_USPACE, namebuf, |
| - | 659 | false); |
|
| - | 660 | if (t) { |
|
| 651 | tid = t->tid; |
661 | tid = t->tid; |
| 652 | thread_ready(t); |
662 | thread_ready(t); |
| 653 | return (unative_t) tid; |
663 | return (unative_t) tid; |
| 654 | } else { |
664 | } else { |
| 655 | free(kernel_uarg); |
665 | free(kernel_uarg); |
| Line 668... | Line 678... | ||
| 668 | return 0; |
678 | return 0; |
| 669 | } |
679 | } |
| 670 | 680 | ||
| 671 | /** @} |
681 | /** @} |
| 672 | */ |
682 | */ |
| - | 683 | ||