Changeset 57d44dd in mainline


Ignore:
Timestamp:
2018-04-10T18:51:14Z (6 years ago)
Author:
Jiří Zárevúcky <jiri.zarevucky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
20287223
Parents:
e3f819f
Message:

Instead of using .interp section, determine loader by name.

Files:
1 deleted
8 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/include/lib/elf.h

    re3f819f r57d44dd  
    3939#include <arch/elf.h>
    4040
    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 
    4541#endif
    4642
  • kernel/generic/include/lib/elf_load.h

    re3f819f r57d44dd  
    4646#define EE_INCOMPATIBLE   3  /* ELF image is not compatible with current architecture */
    4747#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. */
    5049
    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);
     50extern unsigned int elf_load(elf_header_t *, as_t *);
    5951extern const char *elf_error(unsigned int rc);
    6052
  • kernel/generic/src/lib/elf.c

    re3f819f r57d44dd  
    4646#include <macros.h>
    4747#include <arch.h>
     48#include <str.h>
    4849
    4950#include <lib/elf_load.h>
     
    5859};
    5960
    60 static int segment_header(elf_segment_header_t *, elf_header_t *, as_t *,
    61     unsigned int);
    6261static int load_segment(elf_segment_header_t *, elf_header_t *, as_t *);
    6362
     
    7170 *
    7271 */
    73 unsigned int elf_load(elf_header_t *header, as_t *as, unsigned int flags)
     72unsigned int elf_load(elf_header_t *header, as_t *as)
    7473{
    7574        /* Identify ELF */
     
    106105                    header->e_phoff))[i];
    107106
    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);
    109111                if (rc != EE_OK)
    110112                        return rc;
     
    126128
    127129        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                 // FIXME
    154                 /*
    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;
    170130}
    171131
  • kernel/generic/src/main/kinit.c

    re3f819f r57d44dd  
    253253                assert(page);
    254254
     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
    255269                errno_t rc = program_create_from_image((void *) page, namebuf,
    256270                    &programs[i]);
    257271
    258272                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;
    260284                                /*
    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.
    262289                                 */
    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);
    277291                        }
    278292
    279                         /*
    280                          * If programs[i].task == NULL then it is
    281                          * the program loader and it was registered
    282                          * successfully.
    283                          */
    284293                } else if (i == init.cnt - 1) {
    285294                        /*
     
    287296                         */
    288297                        init_rd((void *) init.tasks[i].paddr, init.tasks[i].size);
    289                 } else
     298                } else {
    290299                        log(LF_OTHER, LVL_ERROR,
    291300                            "init[%zu]: Init binary load failed "
    292301                            "(error %s, loader status %u)", i,
    293302                            str_error_name(rc), programs[i].loader_status);
     303                }
    294304        }
    295305
  • kernel/generic/src/proc/program.c

    re3f819f r57d44dd  
    143143                return ENOMEM;
    144144
    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);
    146146        if (prg->loader_status != EE_OK) {
    147147                as_destroy(as);
    148148                prg->task = NULL;
    149149                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;
    162151        }
    163152
     
    188177        }
    189178
    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);
    192180        if (prg->loader_status != EE_OK) {
    193181                as_destroy(as);
  • uspace/lib/c/generic/elf/elf_mod.c

    re3f819f r57d44dd  
    268268                break;
    269269        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
    272282                break;
    273283        case PT_DYNAMIC:
  • uspace/lib/c/include/elf/elf_mod.h

    re3f819f r57d44dd  
    5151#define EE_INCOMPATIBLE         3       /* ELF image is not compatible with current architecture */
    5252#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. */
    5655
    5756typedef enum {
  • uspace/srv/loader/Makefile

    re3f819f r57d44dd  
    3636
    3737GENERIC_SOURCES = \
    38         main.c \
    39         interp.S
     38        main.c
    4039
    4140SOURCES = \
Note: See TracChangeset for help on using the changeset viewer.