Changes in kernel/generic/src/proc/program.c [d1e8440:fbcdeb8] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/proc/program.c
rd1e8440 rfbcdeb8 71 71 int program_create(as_t *as, uintptr_t entry_addr, char *name, program_t *prg) 72 72 { 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 74 82 prg->task = task_create(as, name); 75 83 if (!prg->task) … … 79 87 * Create the stack address space area. 80 88 */ 81 uintptr_t virt = (uintptr_t) -1; 82 uintptr_t bound = USER_ADDRESS_SPACE_END - (STACK_SIZE_USER - 1); 83 84 /* Adjust bound to create space for the desired guard page. */ 85 bound -= PAGE_SIZE; 86 89 uintptr_t virt = USTACK_ADDRESS; 87 90 as_area_t *area = as_area_create(as, 88 AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE | AS_AREA_GUARD | 89 AS_AREA_LATE_RESERVE, STACK_SIZE_USER, AS_AREA_ATTR_NONE, 90 &anon_backend, NULL, &virt, bound); 91 if (!area) { 92 task_destroy(prg->task); 91 AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE, 92 STACK_SIZE, AS_AREA_ATTR_NONE, &anon_backend, NULL, &virt, 0); 93 if (!area) 93 94 return ENOMEM; 94 }95 96 uspace_arg_t *kernel_uarg = (uspace_arg_t *)97 malloc(sizeof(uspace_arg_t), 0);98 99 kernel_uarg->uspace_entry = (void *) entry_addr;100 kernel_uarg->uspace_stack = (void *) virt;101 kernel_uarg->uspace_stack_size = STACK_SIZE_USER;102 kernel_uarg->uspace_thread_function = NULL;103 kernel_uarg->uspace_thread_arg = NULL;104 kernel_uarg->uspace_uarg = NULL;105 95 106 96 /* … … 108 98 */ 109 99 prg->main_thread = thread_create(uinit, kernel_uarg, prg->task, 110 THREAD_FLAG_USPACE, "uinit"); 111 if (!prg->main_thread) { 112 free(kernel_uarg); 113 as_area_destroy(as, virt); 114 task_destroy(prg->task); 100 THREAD_FLAG_USPACE, "uinit", false); 101 if (!prg->main_thread) 115 102 return ELIMIT; 116 }117 103 118 104 return EOK; … … 125 111 * executable image. The task is returned in *task. 126 112 * 127 * @param[in] image_addr Address of an executable program image. 128 * @param[in] name Name to set for the program's task. 129 * @param[out] prg Buffer for storing program info. 130 * If image_addr points to a loader image, 131 * prg->task will be set to NULL and EOK 132 * 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. 133 118 * 134 119 * @return EOK on success or negative error code. … … 141 126 return ENOMEM; 142 127 143 prg->loader_status= elf_load((elf_header_t *) image_addr, as, 0);144 if ( prg->loader_status!= EE_OK) {128 unsigned int rc = elf_load((elf_header_t *) image_addr, as, 0); 129 if (rc != EE_OK) { 145 130 as_destroy(as); 146 131 prg->task = NULL; 147 132 prg->main_thread = NULL; 148 133 149 if ( prg->loader_status!= EE_LOADER)134 if (rc != EE_LOADER) 150 135 return ENOTSUP; 151 136 … … 155 140 156 141 program_loader = image_addr; 157 printf("Program loader at %p\n", (void *) image_addr); 142 LOG("Registered program loader at %p", 143 (void *) image_addr); 158 144 159 145 return EOK; … … 185 171 } 186 172 187 prg->loader_status= elf_load((elf_header_t *) program_loader, as,173 unsigned int rc = elf_load((elf_header_t *) program_loader, as, 188 174 ELD_F_LOADER); 189 if ( prg->loader_status!= EE_OK) {175 if (rc != EE_OK) { 190 176 as_destroy(as); 191 printf("Cannot spawn loader (%s)\n", 192 elf_error(prg->loader_status)); 177 printf("Cannot spawn loader (%s)\n", elf_error(rc)); 193 178 return ENOENT; 194 179 }
Note:
See TracChangeset
for help on using the changeset viewer.