Lines Matching refs:mp
361 struct module *mp; in kobj_init() local
458 mp = load_exec(bootaux, filename); in kobj_init()
464 if (load_primary(mp, KOBJ_LM_PRIMARY) == -1) in kobj_init()
701 struct module *mp; in load_exec() local
717 mp = kobj_zalloc(sizeof (struct module), KM_WAIT); in load_exec()
718 cp->mod_mp = mp; in load_exec()
725 mp->symtbl_section = 0; in load_exec()
726 mp->shdrs = NULL; in load_exec()
727 mp->strhdr = NULL; in load_exec()
734 mp->symhdr = kobj_zalloc(sizeof (Shdr), KM_WAIT); in load_exec()
737 mp->strhdr = kobj_zalloc(sizeof (Shdr), KM_WAIT); in load_exec()
739 mp->symhdr->sh_type = SHT_SYMTAB; in load_exec()
740 mp->strhdr->sh_type = SHT_STRTAB; in load_exec()
748 mp->symspace = mp->symtbl = (char *)dyn->d_un.d_ptr; in load_exec()
749 mp->symhdr->sh_addr = dyn->d_un.d_ptr; in load_exec()
752 mp->nsyms = *((uint_t *)dyn->d_un.d_ptr + 1); in load_exec()
753 mp->hashsize = *(uint_t *)dyn->d_un.d_ptr; in load_exec()
756 mp->strings = (char *)dyn->d_un.d_ptr; in load_exec()
757 mp->strhdr->sh_addr = dyn->d_un.d_ptr; in load_exec()
760 mp->strhdr->sh_size = dyn->d_un.d_val; in load_exec()
763 mp->symhdr->sh_entsize = dyn->d_un.d_val; in load_exec()
775 mp->depends_on = kobj_alloc(allocsize, KM_WAIT); in load_exec()
782 libname = mp->strings + dyn->d_un.d_val; in load_exec()
798 bcopy(mp->depends_on, tmp, osize); in load_exec()
799 kobj_free(mp->depends_on, allocsize); in load_exec()
800 mp->depends_on = tmp; in load_exec()
803 bcopy(libname, mp->depends_on + osize, lsize); in load_exec()
804 *(mp->depends_on + nsize) = ' '; /* separate */ in load_exec()
809 mp->depends_on[nsize - 1] = '\0'; /* terminate the string */ in load_exec()
815 bcopy(mp->depends_on, tmp, nsize); in load_exec()
816 kobj_free(mp->depends_on, allocsize); in load_exec()
817 mp->depends_on = tmp; in load_exec()
819 kobj_free(mp->depends_on, allocsize); in load_exec()
820 mp->depends_on = NULL; in load_exec()
823 mp->flags = KOBJ_EXEC|KOBJ_PRIM; /* NOT a relocatable .o */ in load_exec()
824 mp->symhdr->sh_size = mp->nsyms * mp->symhdr->sh_entsize; in load_exec()
830 mp->chains = kobj_zalloc(mp->nsyms * sizeof (symid_t), KM_WAIT); in load_exec()
832 mp->buckets = kobj_zalloc(mp->hashsize * sizeof (symid_t), KM_WAIT); in load_exec()
834 mp->text = _text; in load_exec()
835 mp->data = _data; in load_exec()
837 mp->text_size = _etext - _text; in load_exec()
838 mp->data_size = _edata - _data; in load_exec()
840 cp->mod_text = mp->text; in load_exec()
841 cp->mod_text_size = mp->text_size; in load_exec()
843 mp->filename = cp->mod_filename; in load_exec()
847 _kobj_printf(ops, "krtld: file=%s\n", mp->filename); in load_exec()
848 _kobj_printf(ops, "\ttext: 0x%p", mp->text); in load_exec()
849 _kobj_printf(ops, " size: 0x%lx\n", mp->text_size); in load_exec()
850 _kobj_printf(ops, "\tdata: 0x%p", mp->data); in load_exec()
851 _kobj_printf(ops, " dsize: 0x%lx\n", mp->data_size); in load_exec()
858 for (i = 0; i < mp->nsyms; i++) { in load_exec()
859 sp = (Sym *)(mp->symtbl + i * mp->symhdr->sh_entsize); in load_exec()
871 sym_insert(mp, mp->strings + sp->st_name, i); in load_exec()
875 return (mp); in load_exec()
899 struct module *mp; in load_linker() local
927 mp = kobj_zalloc(sizeof (struct module), KM_WAIT); in load_linker()
929 cp->mod_mp = mp; in load_linker()
930 mp->hdr = *ehdr; in load_linker()
931 mp->shnum = mp->hdr.e_shnum; in load_linker()
932 mp->phnum = mp->hdr.e_phnum; in load_linker()
933 mp->shstrndx = mp->hdr.e_shstrndx; in load_linker()
934 shsize = mp->hdr.e_shentsize * mp->shnum; in load_linker()
935 mp->shdrs = kobj_alloc(shsize, KM_WAIT); in load_linker()
936 bcopy(bootaux[BA_LDSHDR].ba_ptr, mp->shdrs, shsize); in load_linker()
938 for (i = 1; i < (int)mp->shnum; i++) { in load_linker()
939 shp = (Shdr *)(mp->shdrs + (i * mp->hdr.e_shentsize)); in load_linker()
943 if (mp->data == NULL) in load_linker()
944 mp->data = (char *)shp->sh_addr; in load_linker()
945 } else if (mp->text == NULL) { in load_linker()
946 mp->text = (char *)shp->sh_addr; in load_linker()
950 mp->symtbl_section = i; in load_linker()
951 mp->symhdr = shp; in load_linker()
952 mp->symspace = mp->symtbl = (char *)shp->sh_addr; in load_linker()
955 mp->nsyms = mp->symhdr->sh_size / mp->symhdr->sh_entsize; in load_linker()
956 mp->flags = KOBJ_INTERP|KOBJ_PRIM; in load_linker()
957 mp->strhdr = (Shdr *) in load_linker()
958 (mp->shdrs + mp->symhdr->sh_link * mp->hdr.e_shentsize); in load_linker()
959 mp->strings = (char *)mp->strhdr->sh_addr; in load_linker()
960 mp->hashsize = kobj_gethashsize(mp->nsyms); in load_linker()
962 mp->symsize = mp->symhdr->sh_size + mp->strhdr->sh_size + sizeof (int) + in load_linker()
963 (mp->hashsize + mp->nsyms) * sizeof (symid_t); in load_linker()
965 mp->chains = kobj_zalloc(mp->nsyms * sizeof (symid_t), KM_WAIT); in load_linker()
966 mp->buckets = kobj_zalloc(mp->hashsize * sizeof (symid_t), KM_WAIT); in load_linker()
968 mp->bss = bootaux[BA_BSS].ba_val; in load_linker()
969 mp->bss_align = 0; /* pre-aligned during allocation */ in load_linker()
970 mp->bss_size = (uintptr_t)_edata - mp->bss; in load_linker()
971 mp->text_size = _etext - mp->text; in load_linker()
972 mp->data_size = _edata - mp->data; in load_linker()
973 mp->filename = cp->mod_filename; in load_linker()
974 cp->mod_text = mp->text; in load_linker()
975 cp->mod_text_size = mp->text_size; in load_linker()
981 kmp->text_size = (size_t)(mp->text - kmp->text); in load_linker()
982 kmp->data_size = (size_t)(mp->data - kmp->data); in load_linker()
987 _kobj_printf(ops, "krtld: file=%s\n", mp->filename); in load_linker()
988 _kobj_printf(ops, "\ttext:0x%p", mp->text); in load_linker()
989 _kobj_printf(ops, " size: 0x%lx\n", mp->text_size); in load_linker()
990 _kobj_printf(ops, "\tdata:0x%p", mp->data); in load_linker()
991 _kobj_printf(ops, " dsize: 0x%lx\n", mp->data_size); in load_linker()
998 for (i = 0; i < mp->nsyms; i++) { in load_linker()
999 sp = (Sym *)(mp->symtbl + i * mp->symhdr->sh_entsize); in load_linker()
1007 sym_insert(mp, mp->strings + sp->st_name, i); in load_linker()
1153 kobj_load_elfhdr(struct _buf *file, struct module *mp) in kobj_load_elfhdr() argument
1155 if (kobj_read_file(file, (char *)&mp->hdr, sizeof (mp->hdr), 0) < 0) { in kobj_load_elfhdr()
1157 mp->filename); in kobj_load_elfhdr()
1161 mp->shnum = mp->hdr.e_shnum; in kobj_load_elfhdr()
1162 mp->shstrndx = mp->hdr.e_shstrndx; in kobj_load_elfhdr()
1163 mp->phnum = mp->hdr.e_phnum; in kobj_load_elfhdr()
1170 if (is_extended_ehdr(&mp->hdr)) { in kobj_load_elfhdr()
1173 if (mp->hdr.e_shoff == 0 || in kobj_load_elfhdr()
1175 mp->hdr.e_shoff) < 0) { in kobj_load_elfhdr()
1178 mp->filename); in kobj_load_elfhdr()
1182 if (mp->shnum == 0) in kobj_load_elfhdr()
1183 mp->shnum = hdr0.sh_size; in kobj_load_elfhdr()
1184 if (mp->shstrndx == SHN_XINDEX) in kobj_load_elfhdr()
1185 mp->shstrndx = hdr0.sh_link; in kobj_load_elfhdr()
1186 if (mp->phnum == PN_XNUM && hdr0.sh_info != 0) in kobj_load_elfhdr()
1187 mp->phnum = hdr0.sh_info; in kobj_load_elfhdr()
1198 struct module *mp; in bind_primary() local
1204 mp = mod(lp); in bind_primary()
1210 if (mp->flags & (KOBJ_EXEC|KOBJ_INTERP)) in bind_primary()
1213 if (do_common(mp) < 0) in bind_primary()
1221 mp = mod(lp); in bind_primary()
1223 if (do_symbols(mp, 0) < 0) in bind_primary()
1231 mp = mod(lp); in bind_primary()
1233 if (mp->flags & KOBJ_EXEC) { in bind_primary()
1261 "module %s\n", mp->filename); in bind_primary()
1267 "KOBJ_EXEC\n", mp->filename); in bind_primary()
1269 if (do_relocate(mp, rela, relasz/relaent, relaent, in bind_primary()
1270 (Addr)mp->text) < 0) in bind_primary()
1273 if (do_relocations(mp) < 0) in bind_primary()
1277 kobj_sync_instruction_memory(mp->text, mp->text_size); in bind_primary()
1281 mp = mod(lp); in bind_primary()
1289 if (mp->flags & KOBJ_EXEC) { in bind_primary()
1293 file = kobj_open_file(mp->filename); in bind_primary()
1296 if (kobj_load_elfhdr(file, mp) < 0) in bind_primary()
1298 n = mp->hdr.e_shentsize * mp->shnum; in bind_primary()
1299 mp->shdrs = kobj_alloc(n, KM_WAIT); in bind_primary()
1300 if (kobj_read_file(file, mp->shdrs, n, in bind_primary()
1301 mp->hdr.e_shoff) < 0) in bind_primary()
1303 if (get_syms(mp, file) < 0) in bind_primary()
1305 if (get_ctf(mp, file) < 0) in bind_primary()
1308 mp->flags |= KOBJ_RELOCATED; in bind_primary()
1310 } else if (mp->flags & KOBJ_INTERP) { in bind_primary()
1318 file = kobj_open_path(mp->filename, 1, 0); in bind_primary()
1321 if (get_ctf(mp, file) < 0) in bind_primary()
1324 mp->flags |= KOBJ_RELOCATED; in bind_primary()
1350 load_primary(struct module *mp, int lmid) in load_primary() argument
1357 if ((p = mp->depends_on) == NULL) in load_primary()
1400 add_dependent(mp, dmp); in load_primary()
1437 struct module *mp; in load_kmdb() local
1455 if ((mp = mctl->mod_mp) == NULL) in load_kmdb()
1458 mp->flags |= KOBJ_PRIM; in load_kmdb()
1460 if (load_primary(mp, KOBJ_LM_DEBUGGER) < 0) in load_kmdb()
1492 depends_on(struct module *mp) in depends_on() argument
1501 if ((sp = lookup_one(mp, "_depends_on")) == NULL) in depends_on()
1516 mp->filename); in depends_on()
1524 if (kobj_addrcheck(mp, q) || q[sp->st_size - 1] != '\0') { in depends_on()
1526 mp->filename); in depends_on()
1539 struct module *mp; in kobj_getmodinfo() local
1540 mp = (struct module *)xmp; in kobj_getmodinfo()
1542 modinfo->mi_base = mp->text; in kobj_getmodinfo()
1543 modinfo->mi_size = mp->text_size + mp->data_size; in kobj_getmodinfo()
1555 kobj_export_ksyms(struct module *mp) in kobj_export_ksyms() argument
1557 Sym *esp = (Sym *)(mp->symtbl + mp->symhdr->sh_size); in kobj_export_ksyms()
1563 size_t symsize = mp->symhdr->sh_entsize; in kobj_export_ksyms()
1571 bcopy(mp, omp, sizeof (struct module)); in kobj_export_ksyms()
1589 mp->nsyms = nsyms; in kobj_export_ksyms()
1590 mp->hashsize = kobj_gethashsize(mp->nsyms); in kobj_export_ksyms()
1603 mp->symsize = (2 * sizeof (Shdr)) + (nsyms * symsize) + in kobj_export_ksyms()
1604 (mp->hashsize + mp->nsyms) * sizeof (symid_t) + strsize; in kobj_export_ksyms()
1606 if (mp->flags & KOBJ_NOKSYMS) { in kobj_export_ksyms()
1607 mp->symspace = kobj_alloc(mp->symsize, KM_WAIT); in kobj_export_ksyms()
1609 mp->symspace = vmem_alloc(ksyms_arena, mp->symsize, in kobj_export_ksyms()
1612 bzero(mp->symspace, mp->symsize); in kobj_export_ksyms()
1617 mp->shdrs = mp->symspace; in kobj_export_ksyms()
1618 mp->symhdr = (Shdr *)mp->shdrs; in kobj_export_ksyms()
1619 mp->strhdr = (Shdr *)(mp->symhdr + 1); in kobj_export_ksyms()
1620 mp->symtbl = (char *)(mp->strhdr + 1); in kobj_export_ksyms()
1621 mp->buckets = (symid_t *)(mp->symtbl + (nsyms * symsize)); in kobj_export_ksyms()
1622 mp->chains = (symid_t *)(mp->buckets + mp->hashsize); in kobj_export_ksyms()
1623 mp->strings = (char *)(mp->chains + nsyms); in kobj_export_ksyms()
1628 mp->shnum = 2; in kobj_export_ksyms()
1629 mp->symtbl_section = 0; in kobj_export_ksyms()
1631 mp->symhdr->sh_type = SHT_SYMTAB; in kobj_export_ksyms()
1632 mp->symhdr->sh_addr = (Addr)mp->symtbl; in kobj_export_ksyms()
1633 mp->symhdr->sh_size = nsyms * symsize; in kobj_export_ksyms()
1634 mp->symhdr->sh_link = 1; in kobj_export_ksyms()
1635 mp->symhdr->sh_info = locals; in kobj_export_ksyms()
1636 mp->symhdr->sh_addralign = sizeof (Addr); in kobj_export_ksyms()
1637 mp->symhdr->sh_entsize = symsize; in kobj_export_ksyms()
1639 mp->strhdr->sh_type = SHT_STRTAB; in kobj_export_ksyms()
1640 mp->strhdr->sh_addr = (Addr)mp->strings; in kobj_export_ksyms()
1641 mp->strhdr->sh_size = strsize; in kobj_export_ksyms()
1642 mp->strhdr->sh_addralign = 1; in kobj_export_ksyms()
1654 sp = (Sym *)(mp->symtbl + symsize * nsyms); in kobj_export_ksyms()
1656 bcopy(name, mp->strings + strsize, namelen); in kobj_export_ksyms()
1658 sym_insert(mp, name, nsyms); in kobj_export_ksyms()
1668 if (!(mp->flags & KOBJ_PRIM)) { in kobj_export_ksyms()
1689 if (!(mp->flags & KOBJ_PRIM)) in kobj_export_ksyms()
1695 kobj_export_ctf(struct module *mp) in kobj_export_ctf() argument
1697 char *data = mp->ctfdata; in kobj_export_ctf()
1698 size_t size = mp->ctfsize; in kobj_export_ctf()
1702 mp->ctfdata = NULL; in kobj_export_ctf()
1703 mp->ctfsize = 0; in kobj_export_ctf()
1705 mp->ctfdata = vmem_alloc(ctf_arena, size, in kobj_export_ctf()
1707 bcopy(data, mp->ctfdata, size); in kobj_export_ctf()
1710 if (!(mp->flags & KOBJ_PRIM)) in kobj_export_ctf()
1716 kobj_export_module(struct module *mp) in kobj_export_module() argument
1718 kobj_export_ksyms(mp); in kobj_export_module()
1719 kobj_export_ctf(mp); in kobj_export_module()
1721 mp->flags |= KOBJ_EXPORTED; in kobj_export_module()
1725 process_dynamic(struct module *mp, char *dyndata, char *strdata) in process_dynamic() argument
1778 mp->flags |= KOBJ_IGNMULDEF; in process_dynamic()
1780 mp->flags |= KOBJ_NOKSYMS; in process_dynamic()
1799 mp->depends_on = depstr; in process_dynamic()
1806 do_dynamic(struct module *mp, struct _buf *file) in do_dynamic() argument
1814 for (dshp = NULL, shn = 1; shn < mp->shnum; shn++) { in do_dynamic()
1815 shp = (Shdr *)(mp->shdrs + shn * mp->hdr.e_shentsize); in do_dynamic()
1820 mp->filename); in do_dynamic()
1835 if (dshp->sh_link > mp->shnum) { in do_dynamic()
1836 _kobj_printf(ops, "krtld: get_dynamic: %s, ", mp->filename); in do_dynamic()
1840 dstrp = (Shdr *)(mp->shdrs + dshp->sh_link * mp->hdr.e_shentsize); in do_dynamic()
1843 _kobj_printf(ops, "krtld: get_dynamic: %s, ", mp->filename); in do_dynamic()
1853 _kobj_printf(ops, "krtld: get_dynamic: %s, ", mp->filename); in do_dynamic()
1863 _kobj_printf(ops, "krtld: get_dynamic: %s, ", mp->filename); in do_dynamic()
1873 rc = process_dynamic(mp, dyndata, dstrdata); in do_dynamic()
1882 kobj_set_ctf(struct module *mp, caddr_t data, size_t size) in kobj_set_ctf() argument
1885 if (mp->ctfdata != NULL) { in kobj_set_ctf()
1886 if (vmem_contains(ctf_arena, mp->ctfdata, in kobj_set_ctf()
1887 mp->ctfsize)) { in kobj_set_ctf()
1888 vmem_free(ctf_arena, mp->ctfdata, mp->ctfsize); in kobj_set_ctf()
1890 kobj_free(mp->ctfdata, mp->ctfsize); in kobj_set_ctf()
1901 mp->ctfdata = NULL; in kobj_set_ctf()
1903 mp->ctfsize = size; in kobj_set_ctf()
1904 mp->ctfdata = data; in kobj_set_ctf()
1916 struct module *mp = NULL; in kobj_load_module() local
1921 mp = kobj_zalloc(sizeof (struct module), KM_WAIT); in kobj_load_module()
1930 mp->flags |= KOBJ_NOKSYMS; in kobj_load_module()
1938 kobj_free(mp, sizeof (*mp)); in kobj_load_module()
1952 mp->filename = kobj_alloc(strlen(file->_name) + 1, KM_WAIT); in kobj_load_module()
1953 (void) strcpy(mp->filename, file->_name); in kobj_load_module()
1955 if (kobj_load_elfhdr(file, mp) != 0) { in kobj_load_module()
1956 kobj_free(mp->filename, strlen(file->_name) + 1); in kobj_load_module()
1957 kobj_free(mp, sizeof (*mp)); in kobj_load_module()
1962 if (mp->hdr.e_ident[i] != ELFMAG[i]) { in kobj_load_module()
1966 kobj_free(mp->filename, strlen(file->_name) + 1); in kobj_load_module()
1967 kobj_free(mp, sizeof (*mp)); in kobj_load_module()
1977 if (!elf_mach_ok(&mp->hdr)) { in kobj_load_module()
1981 kobj_free(mp->filename, strlen(file->_name) + 1); in kobj_load_module()
1982 kobj_free(mp, sizeof (*mp)); in kobj_load_module()
2002 if (mp->hdr.e_type != ET_REL) { in kobj_load_module()
2006 kobj_free(mp->filename, strlen(file->_name) + 1); in kobj_load_module()
2007 kobj_free(mp, sizeof (*mp)); in kobj_load_module()
2011 n = mp->hdr.e_shentsize * mp->shnum; in kobj_load_module()
2012 mp->shdrs = kobj_alloc(n, KM_WAIT); in kobj_load_module()
2014 if (kobj_read_file(file, mp->shdrs, n, mp->hdr.e_shoff) < 0) { in kobj_load_module()
2017 kobj_free(mp->shdrs, n); in kobj_load_module()
2018 kobj_free(mp->filename, strlen(file->_name) + 1); in kobj_load_module()
2019 kobj_free(mp, sizeof (*mp)); in kobj_load_module()
2024 module_assign(modp, mp); in kobj_load_module()
2027 if (get_progbits(mp, file) < 0) { in kobj_load_module()
2032 if (do_dynamic(mp, file) < 0) { in kobj_load_module()
2038 modp->mod_text = mp->text; in kobj_load_module()
2039 modp->mod_text_size = mp->text_size; in kobj_load_module()
2042 if (get_syms(mp, file) < 0) { in kobj_load_module()
2052 if (mp->depends_on == NULL) in kobj_load_module()
2053 mp->depends_on = depends_on(mp); in kobj_load_module()
2055 if (get_ctf(mp, file) < 0) { in kobj_load_module()
2061 if (!(mp->flags & KOBJ_PRIM)) in kobj_load_module()
2062 get_signature(mp, file); in kobj_load_module()
2066 _kobj_printf(ops, "krtld: file=%s\n", mp->filename); in kobj_load_module()
2067 _kobj_printf(ops, "\ttext:0x%p", mp->text); in kobj_load_module()
2068 _kobj_printf(ops, " size: 0x%lx\n", mp->text_size); in kobj_load_module()
2069 _kobj_printf(ops, "\tdata:0x%p", mp->data); in kobj_load_module()
2070 _kobj_printf(ops, " dsize: 0x%lx\n", mp->data_size); in kobj_load_module()
2090 if ((dcrval = do_common(mp)) < 0) { in kobj_load_module()
2117 if (do_relocations(mp) < 0) { in kobj_load_module()
2123 if (mp->destination) { in kobj_load_module()
2124 off_t off = (uintptr_t)mp->destination & PAGEOFFSET; in kobj_load_module()
2125 caddr_t base = (caddr_t)mp->destination - off; in kobj_load_module()
2126 size_t size = P2ROUNDUP(mp->text_size + off, PAGESIZE); in kobj_load_module()
2133 kobj_sync_instruction_memory(mp->text, mp->text_size); in kobj_load_module()
2134 kobj_export_module(mp); in kobj_load_module()
2153 struct module *mp; in kobj_load_primary_module() local
2159 mp = modp->mod_mp; in kobj_load_primary_module()
2160 mp->flags |= KOBJ_PRIM; in kobj_load_primary_module()
2163 if (mp->depends_on != NULL && (dep = in kobj_load_primary_module()
2164 mod_already_loaded(mp->depends_on)) == NULL) { in kobj_load_primary_module()
2175 add_dependent(mp, dep->mod_mp); in kobj_load_primary_module()
2181 if (do_common(mp) < 0 || do_symbols(mp, 0) < 0 || in kobj_load_primary_module()
2182 do_relocations(mp) < 0) { in kobj_load_primary_module()
2196 module_assign(struct modctl *cp, struct module *mp) in module_assign() argument
2199 cp->mod_mp = mp; in module_assign()
2203 cp->mod_mp = mp; in module_assign()
2211 struct module *mp = modp->mod_mp; in kobj_unload_module() local
2213 if ((_moddebug & MODDEBUG_KEEPTEXT) && mp) { in kobj_unload_module()
2214 _kobj_printf(ops, "text for %s ", mp->filename); in kobj_unload_module()
2215 _kobj_printf(ops, "was at %p\n", mp->text); in kobj_unload_module()
2216 mp->text = NULL; /* don't actually free it */ in kobj_unload_module()
2230 free_module_data(mp); in kobj_unload_module()
2234 free_module_data(struct module *mp) in free_module_data() argument
2240 lp = mp->head; in free_module_data()
2248 hid = mp->hi_calls; in free_module_data()
2257 if (mp->symspace) { in free_module_data()
2258 if (vmem_contains(ksyms_arena, mp->symspace, mp->symsize)) { in free_module_data()
2259 vmem_free(ksyms_arena, mp->symspace, mp->symsize); in free_module_data()
2262 if (mp->flags & KOBJ_NOKSYMS) in free_module_data()
2264 kobj_free(mp->symspace, mp->symsize); in free_module_data()
2269 if (mp->ctfdata) { in free_module_data()
2270 if (vmem_contains(ctf_arena, mp->ctfdata, mp->ctfsize)) in free_module_data()
2271 vmem_free(ctf_arena, mp->ctfdata, mp->ctfsize); in free_module_data()
2273 kobj_free(mp->ctfdata, mp->ctfsize); in free_module_data()
2276 if (mp->sigdata) in free_module_data()
2277 kobj_free(mp->sigdata, mp->sigsize); in free_module_data()
2283 if ((ksyms_exported == 0) && (mp->shdrs != NULL)) { in free_module_data()
2287 for (shn = 1; shn < mp->shnum; shn++) { in free_module_data()
2288 shp = (Shdr *)(mp->shdrs + shn * mp->hdr.e_shentsize); in free_module_data()
2299 if (!(mp->flags & KOBJ_PRIM)) { in free_module_data()
2300 kobj_free(mp->shdrs, mp->hdr.e_shentsize * mp->shnum); in free_module_data()
2304 if (mp->bss) in free_module_data()
2305 vmem_free(data_arena, (void *)mp->bss, mp->bss_size); in free_module_data()
2307 if (mp->fbt_tab) in free_module_data()
2308 kobj_texthole_free(mp->fbt_tab, mp->fbt_size); in free_module_data()
2310 if (mp->textwin_base) in free_module_data()
2311 kobj_textwin_free(mp); in free_module_data()
2313 if (mp->sdt_probes != NULL) { in free_module_data()
2314 sdt_probedesc_t *sdp = mp->sdt_probes, *next; in free_module_data()
2324 if (mp->sdt_tab) in free_module_data()
2325 kobj_texthole_free(mp->sdt_tab, mp->sdt_size); in free_module_data()
2326 if (mp->text) in free_module_data()
2327 vmem_free(text_arena, mp->text, mp->text_size); in free_module_data()
2328 if (mp->data) in free_module_data()
2329 vmem_free(data_arena, mp->data, mp->data_size); in free_module_data()
2330 if (mp->depends_on) in free_module_data()
2331 kobj_free(mp->depends_on, strlen(mp->depends_on)+1); in free_module_data()
2332 if (mp->filename) in free_module_data()
2333 kobj_free(mp->filename, strlen(mp->filename)+1); in free_module_data()
2335 kobj_free((char *)mp, sizeof (*mp)); in free_module_data()
2339 get_progbits(struct module *mp, struct _buf *file) in get_progbits() argument
2356 if (get_progbits_size(mp, tp, dp, sdp) < 0) in get_progbits()
2359 mp->text_size = tp->size; in get_progbits()
2360 mp->data_size = dp->size; in get_progbits()
2368 mp->text = kobj_segbrk(&_etext, mp->text_size, in get_progbits()
2374 if (mp->text == NULL) { in get_progbits()
2375 mp->text = kobj_segbrk(&_edata, mp->text_size, in get_progbits()
2379 mp->data = kobj_segbrk(&_edata, mp->data_size, dp->align, 0); in get_progbits()
2381 if (mp->text == NULL || mp->data == NULL) in get_progbits()
2405 mp->text_size += tp->align; in get_progbits()
2406 mp->data_size += dp->align; in get_progbits()
2408 mp->text = kobj_text_alloc(text_arena, mp->text_size); in get_progbits()
2416 mp->text, mp->text_size)) { in get_progbits()
2417 off_t off = (uintptr_t)mp->text & PAGEOFFSET; in get_progbits()
2418 size_t size = P2ROUNDUP(mp->text_size + off, PAGESIZE); in get_progbits()
2420 caddr_t orig = mp->text - off; in get_progbits()
2441 if (mp->data_size) in get_progbits()
2442 mp->data = vmem_alloc(data_arena, mp->data_size, in get_progbits()
2445 textptr = (uintptr_t)mp->text; in get_progbits()
2447 mp->destination = dest; in get_progbits()
2453 text = ALIGN((uintptr_t)mp->text, tp->align); in get_progbits()
2454 data = ALIGN((uintptr_t)mp->data, dp->align); in get_progbits()
2457 for (shn = 1; shn < mp->shnum; shn++) { in get_progbits()
2458 shp = (Shdr *)(mp->shdrs + shn * mp->hdr.e_shentsize); in get_progbits()
2508 kobj_free(mp->shdrs, mp->hdr.e_shentsize * mp->shnum); in get_progbits()
2509 mp->shdrs = NULL; in get_progbits()
2538 get_syms(struct module *mp, struct _buf *file) in get_syms() argument
2553 for (shn = 1; shn < mp->shnum; shn++) { in get_syms()
2554 shp = (Shdr *)(mp->shdrs + shn * mp->hdr.e_shentsize); in get_syms()
2557 mp->symtbl_section = shn; in get_syms()
2558 mp->symhdr = shp; in get_syms()
2581 mp->filename); in get_syms()
2597 if (mp->flags & KOBJ_EXEC) in get_syms()
2600 mp->filename); in get_syms()
2608 if (mp->symhdr == NULL || mp->symhdr->sh_link >= mp->shnum) in get_syms()
2610 mp->strhdr = (Shdr *) in get_syms()
2611 (mp->shdrs + mp->symhdr->sh_link * mp->hdr.e_shentsize); in get_syms()
2613 mp->nsyms = mp->symhdr->sh_size / mp->symhdr->sh_entsize; in get_syms()
2614 mp->hashsize = kobj_gethashsize(mp->nsyms); in get_syms()
2619 mp->symsize = mp->symhdr->sh_size + in get_syms()
2620 (mp->hashsize + mp->nsyms) * sizeof (symid_t) + mp->strhdr->sh_size; in get_syms()
2621 mp->symspace = kobj_zalloc(mp->symsize, KM_WAIT|KM_SCRATCH); in get_syms()
2623 mp->symtbl = mp->symspace; in get_syms()
2624 mp->buckets = (symid_t *)(mp->symtbl + mp->symhdr->sh_size); in get_syms()
2625 mp->chains = mp->buckets + mp->hashsize; in get_syms()
2626 mp->strings = (char *)(mp->chains + mp->nsyms); in get_syms()
2628 if (kobj_read_file(file, mp->symtbl, in get_syms()
2629 mp->symhdr->sh_size, mp->symhdr->sh_offset) < 0) { in get_syms()
2634 if (kobj_read_file(file, mp->strings, in get_syms()
2635 mp->strhdr->sh_size, mp->strhdr->sh_offset) < 0) { in get_syms()
2657 for (i = 1; i < mp->nsyms; i++) { in get_syms()
2660 sp = (Sym *)(mp->symtbl + i * mp->symhdr->sh_entsize); in get_syms()
2680 if (shndx >= mp->shnum) { in get_syms()
2686 shp = (Shdr *)(mp->shdrs + shndx * mp->hdr.e_shentsize); in get_syms()
2687 if (!(mp->flags & KOBJ_EXEC)) in get_syms()
2693 if (sp->st_name >= mp->strhdr->sh_size) in get_syms()
2696 symname = mp->strings + sp->st_name; in get_syms()
2698 if (!(mp->flags & KOBJ_EXEC) && in get_syms()
2700 ksp = kobj_lookup_all(mp, symname, 0); in get_syms()
2718 !(mp->flags & KOBJ_IGNMULDEF)) { in get_syms()
2727 sym_insert(mp, symname, i); in get_syms()
2740 get_ctf(struct module *mp, struct _buf *file) in get_ctf() argument
2750 if (mp->shstrndx >= mp->shnum) { in get_ctf()
2752 mp->filename); in get_ctf()
2754 mp->shstrndx); in get_ctf()
2758 shp = (Shdr *)(mp->shdrs + mp->shstrndx * mp->hdr.e_shentsize); in get_ctf()
2764 mp->filename); in get_ctf()
2766 mp->shstrndx); in get_ctf()
2771 for (i = 0; i < mp->shnum; i++) { in get_ctf()
2772 shp = (Shdr *)(mp->shdrs + i * mp->hdr.e_shentsize); in get_ctf()
2781 "reading .SUNW_ctf data\n", mp->filename); in get_ctf()
2787 mp->ctfdata = ctfdata; in get_ctf()
2788 mp->ctfsize = shp->sh_size; in get_ctf()
2806 crypto_es_hash(struct module *mp, char *hash, char *shstrtab) in crypto_es_hash() argument
2814 for (shn = 1; shn < mp->shnum; shn++) { in crypto_es_hash()
2815 shp = (Shdr *)(mp->shdrs + shn * mp->hdr.e_shentsize); in crypto_es_hash()
2847 get_signature(struct module *mp, struct _buf *file) in get_signature() argument
2854 if (mp->shstrndx >= mp->shnum) { in get_signature()
2856 mp->filename); in get_signature()
2858 mp->shstrndx); in get_signature()
2862 shp = (Shdr *)(mp->shdrs + mp->shstrndx * mp->hdr.e_shentsize); in get_signature()
2868 mp->filename); in get_signature()
2870 mp->shstrndx); in get_signature()
2875 for (i = 0; i < mp->shnum; i++) { in get_signature()
2876 shp = (Shdr *)(mp->shdrs + i * mp->hdr.e_shentsize); in get_signature()
2888 mp->filename); in get_signature()
2903 mp->sigdata = sigdata; in get_signature()
2904 mp->sigsize = sigsize; in get_signature()
2910 crypto_es_hash(mp, sigdata + shp->sh_size, shstrtab); in get_signature()
2917 add_dependent(struct module *mp, struct module *dep) in add_dependent() argument
2921 for (lp = mp->head; lp; lp = lp->next) { in add_dependent()
2922 if (lp->mp == dep) in add_dependent()
2929 lp->mp = dep; in add_dependent()
2931 if (mp->tail) in add_dependent()
2932 mp->tail->next = lp; in add_dependent()
2934 mp->head = lp; in add_dependent()
2935 mp->tail = lp; in add_dependent()
2942 struct module *mp; in do_dependents() local
2948 mp = modp->mod_mp; in do_dependents()
2950 if ((p = mp->depends_on) == NULL) in do_dependents()
3023 add_dependent(mp, req->mod_mp); in do_dependents()
3048 do_common(struct module *mp) in do_common() argument
3057 if ((err = do_symbols(mp, 0)) < 0) in do_common()
3063 mp->bss_size += mp->bss_align; in do_common()
3064 if (mp->bss_size) { in do_common()
3066 mp->bss = (uintptr_t)kobj_segbrk(&_edata, mp->bss_size, in do_common()
3069 mp->bss = (uintptr_t)vmem_alloc(data_arena, in do_common()
3070 mp->bss_size, VM_SLEEP | VM_BESTFIT); in do_common()
3071 bzero((void *)mp->bss, mp->bss_size); in do_common()
3073 if ((err = do_symbols(mp, ALIGN(mp->bss, mp->bss_align))) < 0) in do_common()
3080 do_symbols(struct module *mp, Elf64_Addr bss_base) in do_symbols() argument
3094 if (mp->flags & KOBJ_RESOLVED) in do_symbols()
3102 for (i = 1; i < mp->nsyms; i++) { in do_symbols()
3103 sp = (Sym *)(mp->symtbl + mp->symhdr->sh_entsize * i); in do_symbols()
3108 name = mp->strings + sp->st_name; in do_symbols()
3118 mp->filename); in do_symbols()
3131 mp->filename); in do_symbols()
3139 if ((sp1 = kobj_lookup_all(mp, name, 0)) != NULL) { in do_symbols()
3168 if (!(mp->flags & KOBJ_PRIM) && in do_symbols()
3171 mp->filename); in do_symbols()
3207 if (assign == 0 && mp->bss == 0) { in do_symbols()
3208 mp->bss_align = bss_align; in do_symbols()
3209 mp->bss_size = bss_ptr; in do_symbols()
3211 mp->flags |= KOBJ_RESOLVED; in do_symbols()
3239 struct module *mp; in kobj_getsymvalue() local
3251 mp = (struct module *)modp->mod_mp; in kobj_getsymvalue()
3252 if (mp && !(mp->flags & KOBJ_PRIM) && modp->mod_loaded && in kobj_getsymvalue()
3253 (sp = lookup_one(mp, name))) { in kobj_getsymvalue()
3270 struct module *mp; in kobj_getsymname() local
3282 mp = mod(lp); in kobj_getsymname()
3284 if ((name = kobj_searchsym(mp, value, offset)) != NULL) in kobj_getsymname()
3291 mp = (struct module *)modp->mod_mp; in kobj_getsymname()
3292 if (mp && !(mp->flags & KOBJ_PRIM) && modp->mod_loaded && in kobj_getsymname()
3293 (name = kobj_searchsym(mp, value, offset))) in kobj_getsymname()
3303 kobj_getelfsym(char *name, void *mp, int *size) in kobj_getelfsym() argument
3307 if (mp == NULL) in kobj_getelfsym()
3310 sp = lookup_one(mp, name); in kobj_getelfsym()
3333 kobj_searchsym(struct module *mp, uintptr_t value, ulong_t *offset) in kobj_searchsym() argument
3345 if (kobj_addrcheck(mp, (void *)value) != 0) in kobj_searchsym()
3348 strtabptr = mp->strings; in kobj_searchsym()
3349 symtabptr = (Sym *)mp->symtbl; in kobj_searchsym()
3355 symnum < mp->nsyms; symnum++, sym = (Sym *) in kobj_searchsym()
3356 ((uintptr_t)sym + mp->symhdr->sh_entsize)) { in kobj_searchsym()
3403 kobj_lookup_all(struct module *mp, char *name, int include_self) in kobj_lookup_all() argument
3410 if (include_self && (sp = lookup_one(mp, name)) != NULL) in kobj_lookup_all()
3413 for (mlp = mp->head; mlp; mlp = mlp->next) { in kobj_lookup_all()
3414 if ((sp = lookup_one(mlp->mp, name)) != NULL && in kobj_lookup_all()
3425 if (mmp == NULL || mp == mmp) in kobj_lookup_all()
3439 struct module *mp; in kobj_lookup_kernel() local
3446 mp = mod(lp); in kobj_lookup_kernel()
3448 if (mp == NULL) in kobj_lookup_kernel()
3451 if ((sp = lookup_one(mp, name)) != NULL) in kobj_lookup_kernel()
3458 lookup_one(struct module *mp, const char *name) in lookup_one() argument
3464 for (ip = &mp->buckets[kobj_hash_name(name) % mp->hashsize]; *ip; in lookup_one()
3465 ip = &mp->chains[*ip]) { in lookup_one()
3466 sp = (Sym *)(mp->symtbl + in lookup_one()
3467 mp->symhdr->sh_entsize * *ip); in lookup_one()
3468 name1 = mp->strings + sp->st_name; in lookup_one()
3483 sym_lookup(struct module *mp, Sym *ksp) in sym_lookup() argument
3485 char *name = mp->strings + ksp->st_name; in sym_lookup()
3489 for (ip = &mp->buckets[kobj_hash_name(name) % mp->hashsize]; *ip; in sym_lookup()
3490 ip = &mp->chains[*ip]) { in sym_lookup()
3491 sp = (Sym *)(mp->symtbl + mp->symhdr->sh_entsize * *ip); in sym_lookup()
3499 sym_insert(struct module *mp, char *name, symid_t index) in sym_insert() argument
3507 if (lastmp != mp) { in sym_insert()
3510 mp->filename); in sym_insert()
3514 lastmp = mp; in sym_insert()
3516 sp = (Sym *)(mp->symtbl + in sym_insert()
3517 index * mp->symhdr->sh_entsize); in sym_insert()
3524 for (ip = &mp->buckets[kobj_hash_name(name) % mp->hashsize]; *ip; in sym_insert()
3525 ip = &mp->chains[*ip]) { in sym_insert()
4400 kobj_textwin_alloc(struct module *mp) in kobj_textwin_alloc() argument
4404 if (mp->textwin != NULL) in kobj_textwin_alloc()
4414 if (!vmem_contains(heaptext_arena, mp->text, mp->text_size)) { in kobj_textwin_alloc()
4415 uintptr_t text = (uintptr_t)mp->text; in kobj_textwin_alloc()
4416 uintptr_t size = (uintptr_t)mp->text_size; in kobj_textwin_alloc()
4422 va = mp->textwin_base = vmem_alloc(heap_arena, sz, VM_SLEEP); in kobj_textwin_alloc()
4432 mp->textwin = mp->textwin_base + (text & PAGEOFFSET); in kobj_textwin_alloc()
4434 mp->textwin = mp->text; in kobj_textwin_alloc()
4439 kobj_textwin_free(struct module *mp) in kobj_textwin_free() argument
4441 uintptr_t text = (uintptr_t)mp->text; in kobj_textwin_free()
4442 uintptr_t tsize = (uintptr_t)mp->text_size; in kobj_textwin_free()
4446 mp->textwin = NULL; in kobj_textwin_free()
4448 if (mp->textwin_base == NULL) in kobj_textwin_free()
4451 hat_unload(kas.a_hat, mp->textwin_base, size, HAT_UNLOAD_UNLOCK); in kobj_textwin_free()
4452 vmem_free(heap_arena, mp->textwin_base, size); in kobj_textwin_free()
4453 mp->textwin_base = NULL; in kobj_textwin_free()