Rev 3153 | Rev 3448 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 3153 | Rev 3190 | ||
|---|---|---|---|
| Line 670... | Line 670... | ||
| 670 | node = avltree_search(&threads_tree, (avltree_key_t) ((uintptr_t) t)); |
670 | node = avltree_search(&threads_tree, (avltree_key_t) ((uintptr_t) t)); |
| 671 | 671 | ||
| 672 | return node != NULL; |
672 | return node != NULL; |
| 673 | } |
673 | } |
| 674 | 674 | ||
| 675 | - | ||
| 676 | /** Create new user task with 1 thread from image |
- | |
| 677 | * |
- | |
| 678 | * @param program_addr Address of program executable image. |
- | |
| 679 | * @param name Program name. |
- | |
| 680 | * |
- | |
| 681 | * @return Initialized main thread of the task or NULL on error. |
- | |
| 682 | */ |
- | |
| 683 | thread_t *thread_create_program(void *program_addr, char *name) |
- | |
| 684 | { |
- | |
| 685 | as_t *as; |
- | |
| 686 | as_area_t *area; |
- | |
| 687 | unsigned int rc; |
- | |
| 688 | task_t *task; |
- | |
| 689 | uspace_arg_t *kernel_uarg; |
- | |
| 690 | - | ||
| 691 | kernel_uarg = (uspace_arg_t *) malloc(sizeof(uspace_arg_t), 0); |
- | |
| 692 | if (kernel_uarg == NULL) |
- | |
| 693 | return NULL; |
- | |
| 694 | - | ||
| 695 | kernel_uarg->uspace_entry = |
- | |
| 696 | (void *) ((elf_header_t *) program_addr)->e_entry; |
- | |
| 697 | kernel_uarg->uspace_stack = (void *) USTACK_ADDRESS; |
- | |
| 698 | kernel_uarg->uspace_thread_function = NULL; |
- | |
| 699 | kernel_uarg->uspace_thread_arg = NULL; |
- | |
| 700 | kernel_uarg->uspace_uarg = NULL; |
- | |
| 701 | - | ||
| 702 | as = as_create(0); |
- | |
| 703 | if (as == NULL) { |
- | |
| 704 | free(kernel_uarg); |
- | |
| 705 | return NULL; |
- | |
| 706 | } |
- | |
| 707 | - | ||
| 708 | rc = elf_load((elf_header_t *) program_addr, as, ELD_F_NONE); |
- | |
| 709 | if (rc != EE_OK) { |
- | |
| 710 | free(kernel_uarg); |
- | |
| 711 | as_destroy(as); |
- | |
| 712 | return NULL; |
- | |
| 713 | } |
- | |
| 714 | - | ||
| 715 | /* |
- | |
| 716 | * Create the data as_area. |
- | |
| 717 | */ |
- | |
| 718 | area = as_area_create(as, |
- | |
| 719 | AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE, |
- | |
| 720 | LOADED_PROG_STACK_PAGES_NO * PAGE_SIZE, USTACK_ADDRESS, |
- | |
| 721 | AS_AREA_ATTR_NONE, &anon_backend, NULL); |
- | |
| 722 | if (area == NULL) { |
- | |
| 723 | free(kernel_uarg); |
- | |
| 724 | as_destroy(as); |
- | |
| 725 | return NULL; |
- | |
| 726 | } |
- | |
| 727 | - | ||
| 728 | task = task_create(as, name); |
- | |
| 729 | if (task == NULL) { |
- | |
| 730 | free(kernel_uarg); |
- | |
| 731 | as_destroy(as); |
- | |
| 732 | return NULL; |
- | |
| 733 | } |
- | |
| 734 | - | ||
| 735 | /* |
- | |
| 736 | * Create the main thread. |
- | |
| 737 | */ |
- | |
| 738 | return thread_create(uinit, kernel_uarg, task, THREAD_FLAG_USPACE, |
- | |
| 739 | "uinit", false); |
- | |
| 740 | } |
- | |
| 741 | - | ||
| 742 | - | ||
| 743 | /** Update accounting of current thread. |
675 | /** Update accounting of current thread. |
| 744 | * |
676 | * |
| 745 | * Note that thread_lock on THREAD must be already held and |
677 | * Note that thread_lock on THREAD must be already held and |
| 746 | * interrupts must be already disabled. |
678 | * interrupts must be already disabled. |
| 747 | * |
679 | * |