Changes in kernel/generic/src/proc/program.c [fbcdeb8:6eef3c4] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/proc/program.c
rfbcdeb8 r6eef3c4 71 71 int program_create(as_t *as, uintptr_t entry_addr, char *name, program_t *prg) 72 72 { 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 73 prg->loader_status = EE_OK; 82 74 prg->task = task_create(as, name); 83 75 if (!prg->task) … … 91 83 AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE, 92 84 STACK_SIZE, AS_AREA_ATTR_NONE, &anon_backend, NULL, &virt, 0); 93 if (!area) 85 if (!area) { 86 task_destroy(prg->task); 94 87 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; 95 99 96 100 /* … … 98 102 */ 99 103 prg->main_thread = thread_create(uinit, kernel_uarg, prg->task, 100 THREAD_FLAG_USPACE, "uinit", false); 101 if (!prg->main_thread) 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); 102 109 return ELIMIT; 110 } 103 111 104 112 return EOK; … … 111 119 * executable image. The task is returned in *task. 112 120 * 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. 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. 118 127 * 119 128 * @return EOK on success or negative error code. … … 126 135 return ENOMEM; 127 136 128 unsigned int rc= elf_load((elf_header_t *) image_addr, as, 0);129 if ( rc!= EE_OK) {137 prg->loader_status = elf_load((elf_header_t *) image_addr, as, 0); 138 if (prg->loader_status != EE_OK) { 130 139 as_destroy(as); 131 140 prg->task = NULL; 132 141 prg->main_thread = NULL; 133 142 134 if ( rc!= EE_LOADER)143 if (prg->loader_status != EE_LOADER) 135 144 return ENOTSUP; 136 145 … … 140 149 141 150 program_loader = image_addr; 142 LOG("Registered program loader at %p", 143 (void *) image_addr); 151 printf("Program loader at %p\n", (void *) image_addr); 144 152 145 153 return EOK; … … 171 179 } 172 180 173 unsigned int rc= elf_load((elf_header_t *) program_loader, as,181 prg->loader_status = elf_load((elf_header_t *) program_loader, as, 174 182 ELD_F_LOADER); 175 if ( rc!= EE_OK) {183 if (prg->loader_status != EE_OK) { 176 184 as_destroy(as); 177 printf("Cannot spawn loader (%s)\n", elf_error(rc)); 185 printf("Cannot spawn loader (%s)\n", 186 elf_error(prg->loader_status)); 178 187 return ENOENT; 179 188 }
Note:
See TracChangeset
for help on using the changeset viewer.