Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/lib/elf.c

    rbdca26a rd91488d  
    5050#include <lib/elf_load.h>
    5151
    52 static errno_t load_segment(elf_segment_header_t *, elf_header_t *, as_t *);
     52static const char *error_codes[] = {
     53        "no error",
     54        "invalid image",
     55        "address space error",
     56        "incompatible image",
     57        "unsupported image type",
     58        "irrecoverable error"
     59};
     60
     61static int load_segment(elf_segment_header_t *, elf_header_t *, as_t *);
    5362
    5463/** ELF loader
     
    5867 * @param flags  A combination of ELD_F_*
    5968 *
    60  * @return EOK on success
     69 * @return EE_OK on success
    6170 *
    6271 */
    63 errno_t elf_load(elf_header_t *header, as_t *as)
     72unsigned int elf_load(elf_header_t *header, as_t *as)
    6473{
    6574        /* Identify ELF */
     
    6877            (header->e_ident[EI_MAG2] != ELFMAG2) ||
    6978            (header->e_ident[EI_MAG3] != ELFMAG3))
    70                 return EINVAL;
     79                return EE_INVALID;
    7180
    7281        /* Identify ELF compatibility */
     
    7685            (header->e_version != EV_CURRENT) ||
    7786            (header->e_ident[EI_CLASS] != ELF_CLASS))
    78                 return EINVAL;
     87                return EE_INCOMPATIBLE;
    7988
    8089        if (header->e_phentsize != sizeof(elf_segment_header_t))
    81                 return EINVAL;
     90                return EE_INCOMPATIBLE;
    8291
    8392        /* Check if the object type is supported. */
    8493        if (header->e_type != ET_EXEC)
    85                 return ENOTSUP;
     94                return EE_UNSUPPORTED;
    8695
    8796        /* Check if the ELF image starts on a page boundary */
    8897        if (ALIGN_UP((uintptr_t) header, PAGE_SIZE) != (uintptr_t) header)
    89                 return ENOTSUP;
     98                return EE_UNSUPPORTED;
    9099
    91100        /* Walk through all segment headers and process them. */
     
    99108                        continue;
    100109
    101                 errno_t rc = load_segment(seghdr, header, as);
    102                 if (rc != EOK)
     110                int rc = load_segment(seghdr, header, as);
     111                if (rc != EE_OK)
    103112                        return rc;
    104113        }
    105114
    106         return EOK;
     115        return EE_OK;
     116}
     117
     118/** Print error message according to error code.
     119 *
     120 * @param rc Return code returned by elf_load().
     121 *
     122 * @return NULL terminated description of error.
     123 *
     124 */
     125const char *elf_error(unsigned int rc)
     126{
     127        assert(rc < sizeof(error_codes) / sizeof(char *));
     128
     129        return error_codes[rc];
    107130}
    108131
     
    113136 * @param as    Address space into wich the ELF is being loaded.
    114137 *
    115  * @return EOK on success, error code otherwise.
     138 * @return EE_OK on success, error code otherwise.
    116139 *
    117140 */
    118 errno_t load_segment(elf_segment_header_t *entry, elf_header_t *elf, as_t *as)
     141int load_segment(elf_segment_header_t *entry, elf_header_t *elf, as_t *as)
    119142{
    120143        mem_backend_data_t backend_data;
     
    123146                if ((entry->p_offset % entry->p_align) !=
    124147                    (entry->p_vaddr % entry->p_align))
    125                         return EINVAL;
     148                        return EE_INVALID;
    126149        }
    127150
     
    154177            AS_AREA_ATTR_NONE, &elf_backend, &backend_data, &base, 0);
    155178        if (!area)
    156                 return ENOMEM;
     179                return EE_MEMORY;
    157180
    158181        /*
     
    161184         */
    162185
    163         return EOK;
     186        return EE_OK;
    164187}
    165188
Note: See TracChangeset for help on using the changeset viewer.