Lines Matching refs:ef

77 #define VECTX_HANDLE(ef) (ef)->vctx  argument
79 #define VECTX_HANDLE(ef) (ef)->fd argument
82 static int __elfN(loadimage)(struct preloaded_file *mp, elf_file_t ef,
84 static int __elfN(lookup_symbol)(elf_file_t ef, const char* name,
86 static int __elfN(reloc_ptr)(struct preloaded_file *mp, elf_file_t ef,
88 static int __elfN(parse_modmetadata)(struct preloaded_file *mp, elf_file_t ef,
220 is_kernphys_relocatable(elf_file_t ef) in is_kernphys_relocatable() argument
224 return (__elfN(lookup_symbol)(ef, "kernphys", &sym, STT_OBJECT) == 0); in is_kernphys_relocatable()
230 is_tg_kernel_support(struct preloaded_file *fp, elf_file_t ef) in is_tg_kernel_support() argument
237 if (__elfN(lookup_symbol)(ef, "__start_set_vt_drv_set", &sym, STT_NOTYPE) != 0) in is_tg_kernel_support()
239 p_start = sym.st_value + ef->off; in is_tg_kernel_support()
240 if (__elfN(lookup_symbol)(ef, "__stop_set_vt_drv_set", &sym, STT_NOTYPE) != 0) in is_tg_kernel_support()
242 p_end = sym.st_value + ef->off; in is_tg_kernel_support()
251 error = __elfN(reloc_ptr)(fp, ef, p, &v, sizeof(v)); in is_tg_kernel_support()
253 v += ef->off; in is_tg_kernel_support()
266 __elfN(load_elf_header)(char *filename, elf_file_t ef) in __elfN()
277 if ((ef->fd = open(filename, O_RDONLY)) == -1) in __elfN()
279 ef->firstpage = malloc(PAGE_SIZE); in __elfN()
280 if (ef->firstpage == NULL) { in __elfN()
281 close(ef->fd); in __elfN()
284 preload(ef->fd); in __elfN()
289 ef->vctx = vectx_open(ef->fd, filename, 0L, NULL, &verror, __func__); in __elfN()
292 close(ef->fd); in __elfN()
293 free(ef->vctx); in __elfN()
298 bytes_read = VECTX_READ(VECTX_HANDLE(ef), ef->firstpage, PAGE_SIZE); in __elfN()
299 ef->firstlen = (size_t)bytes_read; in __elfN()
300 if (bytes_read < 0 || ef->firstlen <= sizeof(Elf_Ehdr)) { in __elfN()
304 ehdr = ef->ehdr = (Elf_Ehdr *)ef->firstpage; in __elfN()
330 if (verify_file(ef->fd, filename, bytes_read, VE_MUST, __func__) < 0) { in __elfN()
338 if (ef->firstpage != NULL) { in __elfN()
339 free(ef->firstpage); in __elfN()
340 ef->firstpage = NULL; in __elfN()
342 if (ef->fd != -1) { in __elfN()
344 free(ef->vctx); in __elfN()
346 close(ef->fd); in __elfN()
347 ef->fd = -1; in __elfN()
368 struct elf_file ef; in __elfN() local
373 bzero(&ef, sizeof(struct elf_file)); in __elfN()
374 ef.fd = -1; in __elfN()
376 err = __elfN(load_elf_header)(filename, &ef); in __elfN()
380 ehdr = ef.ehdr; in __elfN()
392 ef.kernel = 1; in __elfN()
394 if (ef.kernel || ehdr->e_type == ET_EXEC) { in __elfN()
420 ef.kernel = 1; in __elfN()
444 ef.kernel = 0; in __elfN()
466 if (ef.kernel == 1 && multiboot == 0) in __elfN()
470 fp->f_type = strdup(ef.kernel ? in __elfN()
476 if (ef.kernel) in __elfN()
482 fp->f_size = __elfN(loadimage)(fp, &ef, dest); in __elfN()
493 fp->f_kernphys_relocatable = multiboot || is_kernphys_relocatable(&ef); in __elfN()
496 fp->f_tg_kernel_support = is_tg_kernel_support(fp, &ef); in __elfN()
505 if (ef.firstpage) in __elfN()
506 free(ef.firstpage); in __elfN()
507 if (ef.fd != -1) { in __elfN()
509 if (!err && ef.vctx) { in __elfN()
512 verror = vectx_close(ef.vctx, VE_MUST, __func__); in __elfN()
519 close(ef.fd); in __elfN()
529 __elfN(loadimage)(struct preloaded_file *fp, elf_file_t ef, uint64_t off)
558 ehdr = ef->ehdr;
560 if (ef->kernel) {
623 ef->off = off;
625 if (ef->kernel)
628 if ((ehdr->e_phoff + ehdr->e_phnum * sizeof(*phdr)) > ef->firstlen) {
633 phdr = (Elf_Phdr *)(ef->firstpage + ehdr->e_phoff);
660 if (ef->firstlen > phdr[i].p_offset) {
661 fpcopy = ef->firstlen - phdr[i].p_offset;
662 archsw.arch_copyin(ef->firstpage + phdr[i].p_offset,
666 if (kern_pread(VECTX_HANDLE(ef),
709 shdr = alloc_pread(VECTX_HANDLE(ef), ehdr->e_shoff, chunk);
728 shstr = alloc_pread(VECTX_HANDLE(ef),
808 if (VECTX_LSEEK(VECTX_HANDLE(ef), (off_t)shdr[i].sh_offset, SEEK_SET) == -1) {
815 result = archsw.arch_readin(VECTX_HANDLE(ef), lastaddr, shdr[i].sh_size);
869 ef->strsz = 0;
875 ef->hashtab =
879 ef->strtab =
883 ef->strsz = dp[i].d_un.d_val;
886 ef->symtab =
890 ef->rel =
894 ef->relsz = dp[i].d_un.d_val;
897 ef->rela =
901 ef->relasz = dp[i].d_un.d_val;
907 if (ef->hashtab == NULL || ef->symtab == NULL ||
908 ef->strtab == NULL || ef->strsz == 0)
910 COPYOUT(ef->hashtab, &ef->nbuckets, sizeof(ef->nbuckets));
911 COPYOUT(ef->hashtab + 1, &ef->nchains, sizeof(ef->nchains));
912 ef->buckets = ef->hashtab + 2;
913 ef->chains = ef->buckets + ef->nbuckets;
915 if (__elfN(lookup_symbol)(ef, "__start_set_modmetadata_set", &sym,
918 p_start = sym.st_value + ef->off;
919 if (__elfN(lookup_symbol)(ef, "__stop_set_modmetadata_set", &sym,
922 p_end = sym.st_value + ef->off;
924 if (__elfN(parse_modmetadata)(fp, ef, p_start, p_end) == 0)
927 if (ef->kernel) /* kernel must not depend on anything */
991 struct elf_file ef; local
999 bzero(&ef, sizeof(struct elf_file));
1000 ef.fd = -1;
1002 err = __elfN(load_elf_header)(fp->f_name, &ef);
1006 if (ef.kernel == 1 || ef.ehdr->e_type == ET_EXEC) {
1007 ef.kernel = 1;
1008 } else if (ef.ehdr->e_type != ET_DYN) {
1013 size = (size_t)ef.ehdr->e_shnum * (size_t)ef.ehdr->e_shentsize;
1014 shdr = alloc_pread(VECTX_HANDLE(&ef), ef.ehdr->e_shoff, size);
1021 shstrtab = alloc_pread(VECTX_HANDLE(&ef), shdr[ef.ehdr->e_shstrndx].sh_offset,
1022 shdr[ef.ehdr->e_shstrndx].sh_size);
1032 for (i = 0, j = 0; i < ef.ehdr->e_shnum; i++) {
1050 err = kern_pread(VECTX_HANDLE(&ef), dest, sh_meta->sh_size, sh_meta->sh_offset);
1061 err = kern_pread(VECTX_HANDLE(&ef), dest, sh_data[0]->sh_size,
1073 ef.off = -(sh_data[0]->sh_addr - dest);
1076 err = kern_pread(VECTX_HANDLE(&ef), dest, sh_data[1]->sh_size,
1084 err = __elfN(parse_modmetadata)(fp, &ef, p_start, p_end);
1096 if (ef.firstpage != NULL)
1097 free(ef.firstpage);
1098 if (ef.fd != -1) {
1100 if (!err && ef.vctx) {
1103 verror = vectx_close(ef.vctx, VE_MUST, __func__);
1110 close(ef.fd);
1116 __elfN(parse_modmetadata)(struct preloaded_file *fp, elf_file_t ef,
1135 error = __elfN(reloc_ptr)(fp, ef, p, &v, sizeof(v));
1137 v += ef->off;
1142 error = __elfN(reloc_ptr)(fp, ef, v, &md64, sizeof(md64));
1144 md64.md_cval += ef->off;
1145 md64.md_data += ef->off;
1154 error = __elfN(reloc_ptr)(fp, ef, v, &md32, sizeof(md32));
1156 md32.md_cval += ef->off;
1157 md32.md_data += ef->off;
1166 error = __elfN(reloc_ptr)(fp, ef, v, &md, sizeof(md));
1168 md.md_cval += ef->off;
1170 (uintptr_t)ef->off);
1177 if (ef->kernel) /* kernel must not depend on anything */
1228 __elfN(lookup_symbol)(elf_file_t ef, const char* name, Elf_Sym *symp,
1236 if (ef->nbuckets == 0) {
1242 COPYOUT(&ef->buckets[hash % ef->nbuckets], &symnum, sizeof(symnum));
1245 if (symnum >= ef->nchains) {
1250 COPYOUT(ef->symtab + symnum, &sym, sizeof(sym));
1256 strp = strdupout((vm_offset_t)(ef->strtab + sym.st_name));
1267 COPYOUT(&ef->chains[symnum], &symnum, sizeof(symnum));
1280 __elfN(reloc_ptr)(struct preloaded_file *mp, elf_file_t ef,
1292 if (ef->kernel)
1295 for (n = 0; n < ef->relsz / sizeof(r); n++) {
1296 COPYOUT(ef->rel + n, &r, sizeof(r));
1298 error = __elfN(reloc)(ef, __elfN(symaddr), &r, ELF_RELOC_REL,
1299 ef->off, p, val, len);
1303 for (n = 0; n < ef->relasz / sizeof(a); n++) {
1304 COPYOUT(ef->rela + n, &a, sizeof(a));
1306 error = __elfN(reloc)(ef, __elfN(symaddr), &a, ELF_RELOC_RELA,
1307 ef->off, p, val, len);
1316 __elfN(symaddr)(struct elf_file *ef, Elf_Size symidx)