Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/proc/program.c

    r6eef3c4 r9d58539  
    7171int program_create(as_t *as, uintptr_t entry_addr, char *name, program_t *prg)
    7272{
    73         prg->loader_status = EE_OK;
     73        uspace_arg_t *kernel_uarg;
     74       
     75        kernel_uarg = (uspace_arg_t *) malloc(sizeof(uspace_arg_t), 0);
     76        kernel_uarg->uspace_entry = (void *) entry_addr;
     77        kernel_uarg->uspace_stack = (void *) USTACK_ADDRESS;
     78        kernel_uarg->uspace_thread_function = NULL;
     79        kernel_uarg->uspace_thread_arg = NULL;
     80        kernel_uarg->uspace_uarg = NULL;
     81       
    7482        prg->task = task_create(as, name);
    7583        if (!prg->task)
     
    8391            AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE,
    8492            STACK_SIZE, AS_AREA_ATTR_NONE, &anon_backend, NULL, &virt, 0);
    85         if (!area) {
    86                 task_destroy(prg->task);
     93        if (!area)
    8794                return ENOMEM;
    88         }
    89        
    90         uspace_arg_t *kernel_uarg = (uspace_arg_t *)
    91             malloc(sizeof(uspace_arg_t), 0);
    92        
    93         kernel_uarg->uspace_entry = (void *) entry_addr;
    94         kernel_uarg->uspace_stack = (void *) virt;
    95         kernel_uarg->uspace_stack_size = STACK_SIZE;
    96         kernel_uarg->uspace_thread_function = NULL;
    97         kernel_uarg->uspace_thread_arg = NULL;
    98         kernel_uarg->uspace_uarg = NULL;
    9995       
    10096        /*
     
    10298         */
    10399        prg->main_thread = thread_create(uinit, kernel_uarg, prg->task,
    104             THREAD_FLAG_USPACE, "uinit");
    105         if (!prg->main_thread) {
    106                 free(kernel_uarg);
    107                 as_area_destroy(as, virt);
    108                 task_destroy(prg->task);
     100            THREAD_FLAG_USPACE, "uinit", false);
     101        if (!prg->main_thread)
    109102                return ELIMIT;
    110         }
    111103       
    112104        return EOK;
     
    119111 * executable image. The task is returned in *task.
    120112 *
    121  * @param[in]  image_addr Address of an executable program image.
    122  * @param[in]  name       Name to set for the program's task.
    123  * @param[out] prg        Buffer for storing program info.
    124  *                        If image_addr points to a loader image,
    125  *                        prg->task will be set to NULL and EOK
    126  *                        will be returned.
     113 * @param image_addr Address of an executable program image.
     114 * @param name       Name to set for the program's task.
     115 * @param prg        Buffer for storing program info. If image_addr
     116 *                   points to a loader image, p->task will be set to
     117 *                   NULL and EOK will be returned.
    127118 *
    128119 * @return EOK on success or negative error code.
     
    135126                return ENOMEM;
    136127       
    137         prg->loader_status = elf_load((elf_header_t *) image_addr, as, 0);
    138         if (prg->loader_status != EE_OK) {
     128        unsigned int rc = elf_load((elf_header_t *) image_addr, as, 0);
     129        if (rc != EE_OK) {
    139130                as_destroy(as);
    140131                prg->task = NULL;
    141132                prg->main_thread = NULL;
    142133               
    143                 if (prg->loader_status != EE_LOADER)
     134                if (rc != EE_LOADER)
    144135                        return ENOTSUP;
    145136               
     
    149140               
    150141                program_loader = image_addr;
    151                 printf("Program loader at %p\n", (void *) image_addr);
     142                LOG("Registered program loader at %p",
     143                    (void *) image_addr);
    152144               
    153145                return EOK;
     
    179171        }
    180172       
    181         prg->loader_status = elf_load((elf_header_t *) program_loader, as,
     173        unsigned int rc = elf_load((elf_header_t *) program_loader, as,
    182174            ELD_F_LOADER);
    183         if (prg->loader_status != EE_OK) {
     175        if (rc != EE_OK) {
    184176                as_destroy(as);
    185                 printf("Cannot spawn loader (%s)\n",
    186                     elf_error(prg->loader_status));
     177                printf("Cannot spawn loader (%s)\n", elf_error(rc));
    187178                return ENOENT;
    188179        }
Note: See TracChangeset for help on using the changeset viewer.