Lines Matching refs:ef
74 #define VECTX_HANDLE(ef) (ef)->vctx argument
76 #define VECTX_HANDLE(ef) (ef)->fd argument
79 static int __elfN(loadimage)(struct preloaded_file *mp, elf_file_t ef,
81 static int __elfN(lookup_symbol)(elf_file_t ef, const char* name,
83 static int __elfN(reloc_ptr)(struct preloaded_file *mp, elf_file_t ef,
85 static int __elfN(parse_modmetadata)(struct preloaded_file *mp, elf_file_t ef,
217 is_kernphys_relocatable(elf_file_t ef) in is_kernphys_relocatable() argument
221 return (__elfN(lookup_symbol)(ef, "kernphys", &sym, STT_OBJECT) == 0); in is_kernphys_relocatable()
227 is_tg_kernel_support(struct preloaded_file *fp, elf_file_t ef) in is_tg_kernel_support() argument
234 if (__elfN(lookup_symbol)(ef, "__start_set_vt_drv_set", &sym, STT_NOTYPE) != 0) in is_tg_kernel_support()
236 p_start = sym.st_value + ef->off; in is_tg_kernel_support()
237 if (__elfN(lookup_symbol)(ef, "__stop_set_vt_drv_set", &sym, STT_NOTYPE) != 0) in is_tg_kernel_support()
239 p_end = sym.st_value + ef->off; in is_tg_kernel_support()
248 error = __elfN(reloc_ptr)(fp, ef, p, &v, sizeof(v)); in is_tg_kernel_support()
250 v += ef->off; in is_tg_kernel_support()
263 __elfN(load_elf_header)(char *filename, elf_file_t ef) in __elfN()
274 if ((ef->fd = open(filename, O_RDONLY)) == -1) in __elfN()
276 ef->firstpage = malloc(PAGE_SIZE); in __elfN()
277 if (ef->firstpage == NULL) { in __elfN()
278 close(ef->fd); in __elfN()
281 preload(ef->fd); in __elfN()
286 ef->vctx = vectx_open(ef->fd, filename, 0L, NULL, &verror, __func__); in __elfN()
289 close(ef->fd); in __elfN()
290 free(ef->vctx); in __elfN()
295 bytes_read = VECTX_READ(VECTX_HANDLE(ef), ef->firstpage, PAGE_SIZE); in __elfN()
296 ef->firstlen = (size_t)bytes_read; in __elfN()
297 if (bytes_read < 0 || ef->firstlen <= sizeof(Elf_Ehdr)) { in __elfN()
301 ehdr = ef->ehdr = (Elf_Ehdr *)ef->firstpage; in __elfN()
327 if (verify_file(ef->fd, filename, bytes_read, VE_MUST, __func__) < 0) { in __elfN()
335 if (ef->firstpage != NULL) { in __elfN()
336 free(ef->firstpage); in __elfN()
337 ef->firstpage = NULL; in __elfN()
339 if (ef->fd != -1) { in __elfN()
341 free(ef->vctx); in __elfN()
343 close(ef->fd); in __elfN()
344 ef->fd = -1; in __elfN()
365 struct elf_file ef; in __elfN() local
370 bzero(&ef, sizeof(struct elf_file)); in __elfN()
371 ef.fd = -1; in __elfN()
373 err = __elfN(load_elf_header)(filename, &ef); in __elfN()
377 ehdr = ef.ehdr; in __elfN()
389 ef.kernel = 1; in __elfN()
391 if (ef.kernel || ehdr->e_type == ET_EXEC) { in __elfN()
418 ef.kernel = 1; in __elfN()
442 ef.kernel = 0; in __elfN()
461 if (ef.kernel == 1 && multiboot == 0) in __elfN()
465 fp->f_type = strdup(ef.kernel ? in __elfN()
471 if (ef.kernel) in __elfN()
477 fp->f_size = __elfN(loadimage)(fp, &ef, dest); in __elfN()
488 fp->f_kernphys_relocatable = multiboot || is_kernphys_relocatable(&ef); in __elfN()
491 fp->f_tg_kernel_support = is_tg_kernel_support(fp, &ef); in __elfN()
500 if (ef.firstpage) in __elfN()
501 free(ef.firstpage); in __elfN()
502 if (ef.fd != -1) { in __elfN()
504 if (!err && ef.vctx) { in __elfN()
507 verror = vectx_close(ef.vctx, VE_MUST, __func__); in __elfN()
514 close(ef.fd); in __elfN()
524 __elfN(loadimage)(struct preloaded_file *fp, elf_file_t ef, uint64_t off)
553 ehdr = ef->ehdr;
555 if (ef->kernel) {
618 ef->off = off;
620 if (ef->kernel)
623 if ((ehdr->e_phoff + ehdr->e_phnum * sizeof(*phdr)) > ef->firstlen) {
628 phdr = (Elf_Phdr *)(ef->firstpage + ehdr->e_phoff);
655 if (ef->firstlen > phdr[i].p_offset) {
656 fpcopy = ef->firstlen - phdr[i].p_offset;
657 archsw.arch_copyin(ef->firstpage + phdr[i].p_offset,
661 if (kern_pread(VECTX_HANDLE(ef),
704 shdr = alloc_pread(VECTX_HANDLE(ef), ehdr->e_shoff, chunk);
723 shstr = alloc_pread(VECTX_HANDLE(ef),
803 if (VECTX_LSEEK(VECTX_HANDLE(ef), (off_t)shdr[i].sh_offset, SEEK_SET) == -1) {
810 result = archsw.arch_readin(VECTX_HANDLE(ef), lastaddr, shdr[i].sh_size);
864 ef->strsz = 0;
870 ef->hashtab =
874 ef->strtab =
878 ef->strsz = dp[i].d_un.d_val;
881 ef->symtab =
885 ef->rel =
889 ef->relsz = dp[i].d_un.d_val;
892 ef->rela =
896 ef->relasz = dp[i].d_un.d_val;
902 if (ef->hashtab == NULL || ef->symtab == NULL ||
903 ef->strtab == NULL || ef->strsz == 0)
905 COPYOUT(ef->hashtab, &ef->nbuckets, sizeof(ef->nbuckets));
906 COPYOUT(ef->hashtab + 1, &ef->nchains, sizeof(ef->nchains));
907 ef->buckets = ef->hashtab + 2;
908 ef->chains = ef->buckets + ef->nbuckets;
910 if (__elfN(lookup_symbol)(ef, "__start_set_modmetadata_set", &sym,
913 p_start = sym.st_value + ef->off;
914 if (__elfN(lookup_symbol)(ef, "__stop_set_modmetadata_set", &sym,
917 p_end = sym.st_value + ef->off;
919 if (__elfN(parse_modmetadata)(fp, ef, p_start, p_end) == 0)
922 if (ef->kernel) /* kernel must not depend on anything */
986 struct elf_file ef; local
994 bzero(&ef, sizeof(struct elf_file));
995 ef.fd = -1;
997 err = __elfN(load_elf_header)(fp->f_name, &ef);
1001 if (ef.kernel == 1 || ef.ehdr->e_type == ET_EXEC) {
1002 ef.kernel = 1;
1003 } else if (ef.ehdr->e_type != ET_DYN) {
1008 size = (size_t)ef.ehdr->e_shnum * (size_t)ef.ehdr->e_shentsize;
1009 shdr = alloc_pread(VECTX_HANDLE(&ef), ef.ehdr->e_shoff, size);
1016 shstrtab = alloc_pread(VECTX_HANDLE(&ef), shdr[ef.ehdr->e_shstrndx].sh_offset,
1017 shdr[ef.ehdr->e_shstrndx].sh_size);
1027 for (i = 0, j = 0; i < ef.ehdr->e_shnum; i++) {
1045 err = kern_pread(VECTX_HANDLE(&ef), dest, sh_meta->sh_size, sh_meta->sh_offset);
1056 err = kern_pread(VECTX_HANDLE(&ef), dest, sh_data[0]->sh_size,
1068 ef.off = -(sh_data[0]->sh_addr - dest);
1071 err = kern_pread(VECTX_HANDLE(&ef), dest, sh_data[1]->sh_size,
1079 err = __elfN(parse_modmetadata)(fp, &ef, p_start, p_end);
1091 if (ef.firstpage != NULL)
1092 free(ef.firstpage);
1093 if (ef.fd != -1) {
1095 if (!err && ef.vctx) {
1098 verror = vectx_close(ef.vctx, VE_MUST, __func__);
1105 close(ef.fd);
1111 __elfN(parse_modmetadata)(struct preloaded_file *fp, elf_file_t ef,
1130 error = __elfN(reloc_ptr)(fp, ef, p, &v, sizeof(v));
1132 v += ef->off;
1137 error = __elfN(reloc_ptr)(fp, ef, v, &md64, sizeof(md64));
1139 md64.md_cval += ef->off;
1140 md64.md_data += ef->off;
1149 error = __elfN(reloc_ptr)(fp, ef, v, &md32, sizeof(md32));
1151 md32.md_cval += ef->off;
1152 md32.md_data += ef->off;
1161 error = __elfN(reloc_ptr)(fp, ef, v, &md, sizeof(md));
1163 md.md_cval += ef->off;
1165 (uintptr_t)ef->off);
1172 if (ef->kernel) /* kernel must not depend on anything */
1223 __elfN(lookup_symbol)(elf_file_t ef, const char* name, Elf_Sym *symp,
1231 if (ef->nbuckets == 0) {
1237 COPYOUT(&ef->buckets[hash % ef->nbuckets], &symnum, sizeof(symnum));
1240 if (symnum >= ef->nchains) {
1245 COPYOUT(ef->symtab + symnum, &sym, sizeof(sym));
1251 strp = strdupout((vm_offset_t)(ef->strtab + sym.st_name));
1262 COPYOUT(&ef->chains[symnum], &symnum, sizeof(symnum));
1275 __elfN(reloc_ptr)(struct preloaded_file *mp, elf_file_t ef,
1287 if (ef->kernel)
1290 for (n = 0; n < ef->relsz / sizeof(r); n++) {
1291 COPYOUT(ef->rel + n, &r, sizeof(r));
1293 error = __elfN(reloc)(ef, __elfN(symaddr), &r, ELF_RELOC_REL,
1294 ef->off, p, val, len);
1298 for (n = 0; n < ef->relasz / sizeof(a); n++) {
1299 COPYOUT(ef->rela + n, &a, sizeof(a));
1301 error = __elfN(reloc)(ef, __elfN(symaddr), &a, ELF_RELOC_RELA,
1302 ef->off, p, val, len);
1311 __elfN(symaddr)(struct elf_file *ef, Elf_Size symidx)