Changeset 57d44dd in mainline
- 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
- Files:
-
- 1 deleted
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/include/lib/elf.h
re3f819f r57d44dd 39 39 #include <arch/elf.h> 40 40 41 /** Interpreter string used to recognize the program loader */42 #define ELF_INTERP_ZSTR "kernel"43 #define ELF_INTERP_ZLEN sizeof(ELF_INTERP_ZSTR)44 45 41 #endif 46 42 -
kernel/generic/include/lib/elf_load.h
re3f819f r57d44dd 46 46 #define EE_INCOMPATIBLE 3 /* ELF image is not compatible with current architecture */ 47 47 #define EE_UNSUPPORTED 4 /* Non-supported ELF (e.g. dynamic ELFs) */ 48 #define EE_LOADER 5 /* The image is actually a program loader. */ 49 #define EE_IRRECOVERABLE 6 /* Irrecoverable error. */ 48 #define EE_IRRECOVERABLE 5 /* Irrecoverable error. */ 50 49 51 /** 52 * This flags is passed when running the loader, otherwise elf_load() 53 * would return with a EE_LOADER error code. 54 */ 55 #define ELD_F_NONE 0 56 #define ELD_F_LOADER 1 57 58 extern unsigned int elf_load(elf_header_t *, as_t *, unsigned int); 50 extern unsigned int elf_load(elf_header_t *, as_t *); 59 51 extern const char *elf_error(unsigned int rc); 60 52 -
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); -
uspace/lib/c/generic/elf/elf_mod.c
re3f819f r57d44dd 268 268 break; 269 269 case PT_INTERP: 270 /* Assume silently interp == "/app/dload" */ 271 elf->info->interp = "/app/dload"; 270 elf->info->interp = 271 (void *)((uint8_t *)entry->p_vaddr + elf->bias); 272 273 // FIXME: This actually won't work, because the text segment is 274 // not loaded yet. 275 #if 0 276 if (elf->info->interp[entry->p_filesz - 1] != '\0') { 277 DPRINTF("Unterminated ELF interp string.\n"); 278 return EE_INVALID; 279 } 280 DPRINTF("interpreter: \"%s\"\n", elf->info->interp); 281 #endif 272 282 break; 273 283 case PT_DYNAMIC: -
uspace/lib/c/include/elf/elf_mod.h
re3f819f r57d44dd 51 51 #define EE_INCOMPATIBLE 3 /* ELF image is not compatible with current architecture */ 52 52 #define EE_UNSUPPORTED 4 /* Non-supported ELF (e.g. dynamic ELFs) */ 53 #define EE_LOADER 5 /* The image is actually a program loader. */ 54 #define EE_IRRECOVERABLE 6 55 #define EE_IO 7 /* Could not read file. */ 53 #define EE_IRRECOVERABLE 5 54 #define EE_IO 6 /* Could not read file. */ 56 55 57 56 typedef enum { -
uspace/srv/loader/Makefile
re3f819f r57d44dd 36 36 37 37 GENERIC_SOURCES = \ 38 main.c \ 39 interp.S 38 main.c 40 39 41 40 SOURCES = \
Note:
See TracChangeset
for help on using the changeset viewer.