Lines Matching refs:ef

90 __elfN(load_elf_header)(char *filename, elf_file_t ef)  in __elfN()
101 if ((ef->fd = open(filename, O_RDONLY)) == -1) in __elfN()
103 ef->firstpage = malloc(PAGE_SIZE); in __elfN()
104 if (ef->firstpage == NULL) { in __elfN()
105 close(ef->fd); in __elfN()
108 bytes_read = read(ef->fd, ef->firstpage, PAGE_SIZE); in __elfN()
109 ef->firstlen = (size_t)bytes_read; in __elfN()
110 if (bytes_read < 0 || ef->firstlen <= sizeof (Elf_Ehdr)) { in __elfN()
114 ehdr = ef->ehdr = (Elf_Ehdr *)ef->firstpage; in __elfN()
133 if (ef->firstpage != NULL) { in __elfN()
134 free(ef->firstpage); in __elfN()
135 ef->firstpage = NULL; in __elfN()
137 if (ef->fd != -1) { in __elfN()
138 close(ef->fd); in __elfN()
139 ef->fd = -1; in __elfN()
160 struct elf_file ef; in __elfN() local
165 bzero(&ef, sizeof (struct elf_file)); in __elfN()
166 ef.fd = -1; in __elfN()
168 err = __elfN(load_elf_header)(filename, &ef); in __elfN()
172 ehdr = ef.ehdr; in __elfN()
184 ef.kernel = 1; in __elfN()
186 if (ef.kernel || ehdr->e_type == ET_EXEC) { in __elfN()
213 ef.kernel = 1; in __elfN()
237 ef.kernel = 0; in __elfN()
258 if (ef.kernel == 1 && multiboot == 0) in __elfN()
262 fp->f_type = strdup(ef.kernel ? in __elfN()
272 if (ef.kernel) in __elfN()
279 fp->f_size = __elfN(loadimage)(fp, &ef, dest); in __elfN()
296 if (ef.firstpage) in __elfN()
297 free(ef.firstpage); in __elfN()
298 if (ef.fd != -1) in __elfN()
299 close(ef.fd); in __elfN()
308 __elfN(loadimage)(struct preloaded_file *fp, elf_file_t ef, uint64_t off) in __elfN()
337 ehdr = ef->ehdr; in __elfN()
401 ef->off = off; in __elfN()
408 if (ef->kernel) in __elfN()
411 if ((ehdr->e_phoff + ehdr->e_phnum * sizeof (*phdr)) > ef->firstlen) { in __elfN()
416 phdr = (Elf_Phdr *)(ef->firstpage + ehdr->e_phoff); in __elfN()
449 if (ef->firstlen > phdr[i].p_offset) { in __elfN()
450 fpcopy = ef->firstlen - phdr[i].p_offset; in __elfN()
452 archsw.arch_copyin(ef->firstpage + in __elfN()
456 archsw.arch_copyin(ef->firstpage + in __elfN()
463 if (kern_pread(ef->fd, in __elfN()
473 if (kern_pread(ef->fd, in __elfN()
549 shdr = alloc_pread(ef->fd, ehdr->e_shoff, chunk); in __elfN()
564 shstr = alloc_pread(ef->fd, shdr[ehdr->e_shstrndx].sh_offset, in __elfN()
648 if (lseek(ef->fd, (off_t)shdr[i].sh_offset, SEEK_SET) == -1) { in __elfN()
655 result = archsw.arch_readin(ef->fd, lastaddr, shdr[i].sh_size); in __elfN()
712 ef->strsz = 0; in __elfN()
718 ef->hashtab = (Elf_Hashelt*)(uintptr_t) in __elfN()
722 ef->strtab = (char *)(uintptr_t) in __elfN()
726 ef->strsz = dp[i].d_un.d_val; in __elfN()
729 ef->symtab = (Elf_Sym*)(uintptr_t) in __elfN()
733 ef->rel = (Elf_Rel *)(uintptr_t) in __elfN()
737 ef->relsz = dp[i].d_un.d_val; in __elfN()
740 ef->rela = (Elf_Rela *)(uintptr_t) in __elfN()
744 ef->relasz = dp[i].d_un.d_val; in __elfN()
750 if (ef->hashtab == NULL || ef->symtab == NULL || in __elfN()
751 ef->strtab == NULL || ef->strsz == 0) in __elfN()
753 COPYOUT(ef->hashtab, &ef->nbuckets, sizeof (ef->nbuckets)); in __elfN()
754 COPYOUT(ef->hashtab + 1, &ef->nchains, sizeof (ef->nchains)); in __elfN()
755 ef->buckets = ef->hashtab + 2; in __elfN()
756 ef->chains = ef->buckets + ef->nbuckets; in __elfN()
758 if (__elfN(lookup_symbol)(fp, ef, "__start_set_modmetadata_set", in __elfN()
761 p_start = sym.st_value + ef->off; in __elfN()
762 if (__elfN(lookup_symbol)(fp, ef, "__stop_set_modmetadata_set", in __elfN()
765 p_end = sym.st_value + ef->off; in __elfN()
767 if (__elfN(parse_modmetadata)(fp, ef, p_start, p_end) == 0) in __elfN()
770 if (ef->kernel) /* kernel must not depend on anything */ in __elfN()
831 struct elf_file ef; in __elfN() local
839 bzero(&ef, sizeof (struct elf_file)); in __elfN()
840 ef.fd = -1; in __elfN()
842 err = __elfN(load_elf_header)(fp->f_name, &ef); in __elfN()
846 if (ef.kernel == 1 || ef.ehdr->e_type == ET_EXEC) { in __elfN()
847 ef.kernel = 1; in __elfN()
848 } else if (ef.ehdr->e_type != ET_DYN) { in __elfN()
853 size = ef.ehdr->e_shnum * ef.ehdr->e_shentsize; in __elfN()
854 shdr = alloc_pread(ef.fd, ef.ehdr->e_shoff, size); in __elfN()
861 shstrtab = alloc_pread(ef.fd, shdr[ef.ehdr->e_shstrndx].sh_offset, in __elfN()
862 shdr[ef.ehdr->e_shstrndx].sh_size); in __elfN()
872 for (i = 0, j = 0; i < ef.ehdr->e_shnum; i++) { in __elfN()
890 err = kern_pread(ef.fd, dest, sh_meta->sh_size, sh_meta->sh_offset); in __elfN()
901 err = kern_pread(ef.fd, dest, sh_data[0]->sh_size, in __elfN()
913 ef.off = -(sh_data[0]->sh_addr - dest); in __elfN()
916 err = kern_pread(ef.fd, dest, sh_data[1]->sh_size, in __elfN()
924 err = __elfN(parse_modmetadata)(fp, &ef, p_start, p_end); in __elfN()
936 if (ef.firstpage != NULL) in __elfN()
937 free(ef.firstpage); in __elfN()
938 if (ef.fd != -1) in __elfN()
939 close(ef.fd); in __elfN()
944 __elfN(parse_modmetadata)(struct preloaded_file *fp, elf_file_t ef, in __elfN()
963 error = __elfN(reloc_ptr)(fp, ef, p, &v, sizeof (v)); in __elfN()
965 v += ef->off; in __elfN()
970 error = __elfN(reloc_ptr)(fp, ef, v, &md64, sizeof (md64)); in __elfN()
972 md64.md_cval += ef->off; in __elfN()
973 md64.md_data += ef->off; in __elfN()
982 error = __elfN(reloc_ptr)(fp, ef, v, &md32, sizeof (md32)); in __elfN()
984 md32.md_cval += ef->off; in __elfN()
985 md32.md_data += ef->off; in __elfN()
994 error = __elfN(reloc_ptr)(fp, ef, v, &md, sizeof (md)); in __elfN()
996 md.md_cval += ef->off; in __elfN()
998 (uintptr_t)ef->off); in __elfN()
1005 if (ef->kernel) /* kernel must not depend on anything */ in __elfN()
1057 __elfN(lookup_symbol)(struct preloaded_file *fp __unused, elf_file_t ef, in __elfN()
1066 COPYOUT(&ef->buckets[hash % ef->nbuckets], &symnum, sizeof (symnum)); in __elfN()
1069 if (symnum >= ef->nchains) { in __elfN()
1074 COPYOUT(ef->symtab + symnum, &sym, sizeof (sym)); in __elfN()
1080 strp = strdupout((vm_offset_t)(ef->strtab + sym.st_name)); in __elfN()
1092 COPYOUT(&ef->chains[symnum], &symnum, sizeof (symnum)); in __elfN()
1105 __elfN(reloc_ptr)(struct preloaded_file *mp __unused, elf_file_t ef, in __elfN()
1117 if (ef->kernel) in __elfN()
1120 for (n = 0; n < ef->relsz / sizeof (r); n++) { in __elfN()
1121 COPYOUT(ef->rel + n, &r, sizeof (r)); in __elfN()
1123 error = __elfN(reloc)(ef, __elfN(symaddr), &r, ELF_RELOC_REL, in __elfN()
1124 ef->off, p, val, len); in __elfN()
1128 for (n = 0; n < ef->relasz / sizeof (a); n++) { in __elfN()
1129 COPYOUT(ef->rela + n, &a, sizeof (a)); in __elfN()
1131 error = __elfN(reloc)(ef, __elfN(symaddr), &a, ELF_RELOC_RELA, in __elfN()
1132 ef->off, p, val, len); in __elfN()
1141 __elfN(symaddr)(struct elf_file *ef __unused, Elf_Size symidx __unused) in __elfN()