Changes in kernel/generic/src/proc/program.c [6eef3c4:c0699467] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/proc/program.c
r6eef3c4 rc0699467 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 = USTACK_ADDRESS;82 89 as_area_t *area = as_area_create(as, 83 90 AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE, 84 STACK_SIZE, AS_AREA_ATTR_NONE, &anon_backend, NULL, &virt, 0);85 if (!area) {86 task_destroy(prg->task);91 STACK_SIZE, USTACK_ADDRESS, AS_AREA_ATTR_NONE, 92 &anon_backend, NULL); 93 if (!area) 87 94 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;99 95 100 96 /* … … 102 98 */ 103 99 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) 109 102 return ELIMIT; 110 }111 103 112 104 return EOK; … … 119 111 * executable image. The task is returned in *task. 120 112 * 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. 127 118 * 128 119 * @return EOK on success or negative error code. … … 135 126 return ENOMEM; 136 127 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) { 139 130 as_destroy(as); 140 131 prg->task = NULL; 141 132 prg->main_thread = NULL; 142 133 143 if ( prg->loader_status!= EE_LOADER)134 if (rc != EE_LOADER) 144 135 return ENOTSUP; 145 136 … … 149 140 150 141 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); 152 144 153 145 return EOK; … … 179 171 } 180 172 181 prg->loader_status= elf_load((elf_header_t *) program_loader, as,173 unsigned int rc = elf_load((elf_header_t *) program_loader, as, 182 174 ELD_F_LOADER); 183 if ( prg->loader_status!= EE_OK) {175 if (rc != EE_OK) { 184 176 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)); 187 178 return ENOENT; 188 179 }
Note:
See TracChangeset
for help on using the changeset viewer.