Changeset 57d44dd in mainline for kernel/generic/src
- Timestamp:
- 2018-04-10T18:51:14Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 20287223
- Parents:
- e3f819f
- Location:
- kernel/generic/src
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/lib/elf.c
re3f819f r57d44dd 46 46 #include <macros.h> 47 47 #include <arch.h> 48 #include <str.h> 48 49 49 50 #include <lib/elf_load.h> … … 58 59 }; 59 60 60 static int segment_header(elf_segment_header_t *, elf_header_t *, as_t *,61 unsigned int);62 61 static int load_segment(elf_segment_header_t *, elf_header_t *, as_t *); 63 62 … … 71 70 * 72 71 */ 73 unsigned int elf_load(elf_header_t *header, as_t *as , unsigned int flags)72 unsigned int elf_load(elf_header_t *header, as_t *as) 74 73 { 75 74 /* Identify ELF */ … … 106 105 header->e_phoff))[i]; 107 106 108 int rc = segment_header(seghdr, header, as, flags); 107 if (seghdr->p_type != PT_LOAD) 108 continue; 109 110 int rc = load_segment(seghdr, header, as); 109 111 if (rc != EE_OK) 110 112 return rc; … … 126 128 127 129 return error_codes[rc]; 128 }129 130 /** Process segment header.131 *132 * @param entry Segment header.133 * @param elf ELF header.134 * @param as Address space into wich the ELF is being loaded.135 *136 * @return EE_OK on success, error code otherwise.137 *138 */139 static int segment_header(elf_segment_header_t *entry, elf_header_t *elf,140 as_t *as, unsigned int flags)141 {142 switch (entry->p_type) {143 case PT_NULL:144 case PT_PHDR:145 case PT_NOTE:146 break;147 case PT_LOAD:148 return load_segment(entry, elf, as);149 case PT_TLS:150 break;151 case PT_DYNAMIC:152 case PT_INTERP:153 // FIXME154 /*155 char *interp = (char *) elf + entry->p_offset;156 if (memcmp((uintptr_t) interp, (uintptr_t) ELF_INTERP_ZSTR,157 ELF_INTERP_ZLEN) != 0) {158 return EE_UNSUPPORTED;159 } */160 if ((flags & ELD_F_LOADER) == 0)161 return EE_LOADER;162 break;163 case PT_SHLIB:164 case PT_LOPROC:165 case PT_HIPROC:166 default:167 return EE_UNSUPPORTED;168 }169 return EE_OK;170 130 } 171 131 -
kernel/generic/src/main/kinit.c
re3f819f r57d44dd 253 253 assert(page); 254 254 255 if (str_cmp(name, "loader") == 0) { 256 /* Register image as the program loader */ 257 if (program_loader == NULL) { 258 program_loader = (void *) page; 259 log(LF_OTHER, LVL_NOTE, "Program loader at %p", 260 program_loader); 261 } else { 262 log(LF_OTHER, LVL_ERROR, 263 "init[%zu]: Second binary named \"loader\"" 264 " present.", i); 265 } 266 continue; 267 } 268 255 269 errno_t rc = program_create_from_image((void *) page, namebuf, 256 270 &programs[i]); 257 271 258 272 if (rc == 0) { 259 if (programs[i].task != NULL) { 273 assert(programs[i].task != NULL); 274 275 /* 276 * Set permissions to init userspace tasks. 277 */ 278 perm_set(programs[i].task, 279 PERM_PERM | PERM_MEM_MANAGER | 280 PERM_IO_MANAGER | PERM_IRQ_REG); 281 282 if (!ipc_box_0) { 283 ipc_box_0 = &programs[i].task->answerbox; 260 284 /* 261 * Set permissions to init userspace tasks. 285 * Hold the first task so that 286 * ipc_box_0 remains a valid pointer 287 * even if the first task exits for 288 * whatever reason. 262 289 */ 263 perm_set(programs[i].task, 264 PERM_PERM | PERM_MEM_MANAGER | 265 PERM_IO_MANAGER | PERM_IRQ_REG); 266 267 if (!ipc_box_0) { 268 ipc_box_0 = &programs[i].task->answerbox; 269 /* 270 * Hold the first task so that 271 * ipc_box_0 remains a valid pointer 272 * even if the first task exits for 273 * whatever reason. 274 */ 275 task_hold(programs[i].task); 276 } 290 task_hold(programs[i].task); 277 291 } 278 292 279 /*280 * If programs[i].task == NULL then it is281 * the program loader and it was registered282 * successfully.283 */284 293 } else if (i == init.cnt - 1) { 285 294 /* … … 287 296 */ 288 297 init_rd((void *) init.tasks[i].paddr, init.tasks[i].size); 289 } else 298 } else { 290 299 log(LF_OTHER, LVL_ERROR, 291 300 "init[%zu]: Init binary load failed " 292 301 "(error %s, loader status %u)", i, 293 302 str_error_name(rc), programs[i].loader_status); 303 } 294 304 } 295 305 -
kernel/generic/src/proc/program.c
re3f819f r57d44dd 143 143 return ENOMEM; 144 144 145 prg->loader_status = elf_load((elf_header_t *) image_addr, as , 0);145 prg->loader_status = elf_load((elf_header_t *) image_addr, as); 146 146 if (prg->loader_status != EE_OK) { 147 147 as_destroy(as); 148 148 prg->task = NULL; 149 149 prg->main_thread = NULL; 150 151 if (prg->loader_status != EE_LOADER) 152 return ENOTSUP; 153 154 /* Register image as the program loader */ 155 if (program_loader != NULL) 156 return ELIMIT; 157 158 program_loader = image_addr; 159 log(LF_OTHER, LVL_NOTE, "Program loader at %p", (void *) image_addr); 160 161 return EOK; 150 return ENOTSUP; 162 151 } 163 152 … … 188 177 } 189 178 190 prg->loader_status = elf_load((elf_header_t *) program_loader, as, 191 ELD_F_LOADER); 179 prg->loader_status = elf_load((elf_header_t *) program_loader, as); 192 180 if (prg->loader_status != EE_OK) { 193 181 as_destroy(as);
Note:
See TracChangeset
for help on using the changeset viewer.