Lines Matching refs:mp

359 	struct module *mp;  in kobj_init()  local
456 mp = load_exec(bootaux, filename); in kobj_init()
462 if (load_primary(mp, KOBJ_LM_PRIMARY) == -1) in kobj_init()
699 struct module *mp; in load_exec() local
715 mp = kobj_zalloc(sizeof (struct module), KM_WAIT); in load_exec()
716 cp->mod_mp = mp; in load_exec()
723 mp->symtbl_section = 0; in load_exec()
724 mp->shdrs = NULL; in load_exec()
725 mp->strhdr = NULL; in load_exec()
732 mp->symhdr = kobj_zalloc(sizeof (Shdr), KM_WAIT); in load_exec()
735 mp->strhdr = kobj_zalloc(sizeof (Shdr), KM_WAIT); in load_exec()
737 mp->symhdr->sh_type = SHT_SYMTAB; in load_exec()
738 mp->strhdr->sh_type = SHT_STRTAB; in load_exec()
746 mp->symspace = mp->symtbl = (char *)dyn->d_un.d_ptr; in load_exec()
747 mp->symhdr->sh_addr = dyn->d_un.d_ptr; in load_exec()
750 mp->nsyms = *((uint_t *)dyn->d_un.d_ptr + 1); in load_exec()
751 mp->hashsize = *(uint_t *)dyn->d_un.d_ptr; in load_exec()
754 mp->strings = (char *)dyn->d_un.d_ptr; in load_exec()
755 mp->strhdr->sh_addr = dyn->d_un.d_ptr; in load_exec()
758 mp->strhdr->sh_size = dyn->d_un.d_val; in load_exec()
761 mp->symhdr->sh_entsize = dyn->d_un.d_val; in load_exec()
773 mp->depends_on = kobj_alloc(allocsize, KM_WAIT); in load_exec()
780 libname = mp->strings + dyn->d_un.d_val; in load_exec()
796 bcopy(mp->depends_on, tmp, osize); in load_exec()
797 kobj_free(mp->depends_on, allocsize); in load_exec()
798 mp->depends_on = tmp; in load_exec()
801 bcopy(libname, mp->depends_on + osize, lsize); in load_exec()
802 *(mp->depends_on + nsize) = ' '; /* separate */ in load_exec()
807 mp->depends_on[nsize - 1] = '\0'; /* terminate the string */ in load_exec()
813 bcopy(mp->depends_on, tmp, nsize); in load_exec()
814 kobj_free(mp->depends_on, allocsize); in load_exec()
815 mp->depends_on = tmp; in load_exec()
817 kobj_free(mp->depends_on, allocsize); in load_exec()
818 mp->depends_on = NULL; in load_exec()
821 mp->flags = KOBJ_EXEC|KOBJ_PRIM; /* NOT a relocatable .o */ in load_exec()
822 mp->symhdr->sh_size = mp->nsyms * mp->symhdr->sh_entsize; in load_exec()
828 mp->chains = kobj_zalloc(mp->nsyms * sizeof (symid_t), KM_WAIT); in load_exec()
830 mp->buckets = kobj_zalloc(mp->hashsize * sizeof (symid_t), KM_WAIT); in load_exec()
832 mp->text = _text; in load_exec()
833 mp->data = _data; in load_exec()
835 mp->text_size = _etext - _text; in load_exec()
836 mp->data_size = _edata - _data; in load_exec()
838 cp->mod_text = mp->text; in load_exec()
839 cp->mod_text_size = mp->text_size; in load_exec()
841 mp->filename = cp->mod_filename; in load_exec()
845 _kobj_printf(ops, "krtld: file=%s\n", mp->filename); in load_exec()
846 _kobj_printf(ops, "\ttext: 0x%p", mp->text); in load_exec()
847 _kobj_printf(ops, " size: 0x%lx\n", mp->text_size); in load_exec()
848 _kobj_printf(ops, "\tdata: 0x%p", mp->data); in load_exec()
849 _kobj_printf(ops, " dsize: 0x%lx\n", mp->data_size); in load_exec()
856 for (i = 0; i < mp->nsyms; i++) { in load_exec()
857 sp = (Sym *)(mp->symtbl + i * mp->symhdr->sh_entsize); in load_exec()
869 sym_insert(mp, mp->strings + sp->st_name, i); in load_exec()
873 return (mp); in load_exec()
883 struct module *mp; in load_linker() local
899 mp = kobj_zalloc(sizeof (struct module), KM_WAIT); in load_linker()
901 cp->mod_mp = mp; in load_linker()
902 mp->hdr = *(Ehdr *)bootaux[BA_LDELF].ba_ptr; in load_linker()
903 shsize = mp->hdr.e_shentsize * mp->hdr.e_shnum; in load_linker()
904 mp->shdrs = kobj_alloc(shsize, KM_WAIT); in load_linker()
905 bcopy(bootaux[BA_LDSHDR].ba_ptr, mp->shdrs, shsize); in load_linker()
907 for (i = 1; i < (int)mp->hdr.e_shnum; i++) { in load_linker()
908 shp = (Shdr *)(mp->shdrs + (i * mp->hdr.e_shentsize)); in load_linker()
912 if (mp->data == NULL) in load_linker()
913 mp->data = (char *)shp->sh_addr; in load_linker()
914 } else if (mp->text == NULL) { in load_linker()
915 mp->text = (char *)shp->sh_addr; in load_linker()
919 mp->symtbl_section = i; in load_linker()
920 mp->symhdr = shp; in load_linker()
921 mp->symspace = mp->symtbl = (char *)shp->sh_addr; in load_linker()
924 mp->nsyms = mp->symhdr->sh_size / mp->symhdr->sh_entsize; in load_linker()
925 mp->flags = KOBJ_INTERP|KOBJ_PRIM; in load_linker()
926 mp->strhdr = (Shdr *) in load_linker()
927 (mp->shdrs + mp->symhdr->sh_link * mp->hdr.e_shentsize); in load_linker()
928 mp->strings = (char *)mp->strhdr->sh_addr; in load_linker()
929 mp->hashsize = kobj_gethashsize(mp->nsyms); in load_linker()
931 mp->symsize = mp->symhdr->sh_size + mp->strhdr->sh_size + sizeof (int) + in load_linker()
932 (mp->hashsize + mp->nsyms) * sizeof (symid_t); in load_linker()
934 mp->chains = kobj_zalloc(mp->nsyms * sizeof (symid_t), KM_WAIT); in load_linker()
935 mp->buckets = kobj_zalloc(mp->hashsize * sizeof (symid_t), KM_WAIT); in load_linker()
937 mp->bss = bootaux[BA_BSS].ba_val; in load_linker()
938 mp->bss_align = 0; /* pre-aligned during allocation */ in load_linker()
939 mp->bss_size = (uintptr_t)_edata - mp->bss; in load_linker()
940 mp->text_size = _etext - mp->text; in load_linker()
941 mp->data_size = _edata - mp->data; in load_linker()
942 mp->filename = cp->mod_filename; in load_linker()
943 cp->mod_text = mp->text; in load_linker()
944 cp->mod_text_size = mp->text_size; in load_linker()
950 kmp->text_size = (size_t)(mp->text - kmp->text); in load_linker()
951 kmp->data_size = (size_t)(mp->data - kmp->data); in load_linker()
956 _kobj_printf(ops, "krtld: file=%s\n", mp->filename); in load_linker()
957 _kobj_printf(ops, "\ttext:0x%p", mp->text); in load_linker()
958 _kobj_printf(ops, " size: 0x%lx\n", mp->text_size); in load_linker()
959 _kobj_printf(ops, "\tdata:0x%p", mp->data); in load_linker()
960 _kobj_printf(ops, " dsize: 0x%lx\n", mp->data_size); in load_linker()
967 for (i = 0; i < mp->nsyms; i++) { in load_linker()
968 sp = (Sym *)(mp->symtbl + i * mp->symhdr->sh_entsize); in load_linker()
976 sym_insert(mp, mp->strings + sp->st_name, i); in load_linker()
1126 struct module *mp; in bind_primary() local
1132 mp = mod(lp); in bind_primary()
1138 if (mp->flags & (KOBJ_EXEC|KOBJ_INTERP)) in bind_primary()
1141 if (do_common(mp) < 0) in bind_primary()
1149 mp = mod(lp); in bind_primary()
1151 if (do_symbols(mp, 0) < 0) in bind_primary()
1159 mp = mod(lp); in bind_primary()
1161 if (mp->flags & KOBJ_EXEC) { in bind_primary()
1189 "module %s\n", mp->filename); in bind_primary()
1195 "KOBJ_EXEC\n", mp->filename); in bind_primary()
1197 if (do_relocate(mp, rela, relasz/relaent, relaent, in bind_primary()
1198 (Addr)mp->text) < 0) in bind_primary()
1201 if (do_relocations(mp) < 0) in bind_primary()
1205 kobj_sync_instruction_memory(mp->text, mp->text_size); in bind_primary()
1209 mp = mod(lp); in bind_primary()
1217 if (mp->flags & KOBJ_EXEC) { in bind_primary()
1221 file = kobj_open_file(mp->filename); in bind_primary()
1224 if (kobj_read_file(file, (char *)&mp->hdr, in bind_primary()
1225 sizeof (mp->hdr), 0) < 0) in bind_primary()
1227 n = mp->hdr.e_shentsize * mp->hdr.e_shnum; in bind_primary()
1228 mp->shdrs = kobj_alloc(n, KM_WAIT); in bind_primary()
1229 if (kobj_read_file(file, mp->shdrs, n, in bind_primary()
1230 mp->hdr.e_shoff) < 0) in bind_primary()
1232 if (get_syms(mp, file) < 0) in bind_primary()
1234 if (get_ctf(mp, file) < 0) in bind_primary()
1237 mp->flags |= KOBJ_RELOCATED; in bind_primary()
1239 } else if (mp->flags & KOBJ_INTERP) { in bind_primary()
1247 file = kobj_open_path(mp->filename, 1, 0); in bind_primary()
1250 if (get_ctf(mp, file) < 0) in bind_primary()
1253 mp->flags |= KOBJ_RELOCATED; in bind_primary()
1279 load_primary(struct module *mp, int lmid) in load_primary() argument
1286 if ((p = mp->depends_on) == NULL) in load_primary()
1329 add_dependent(mp, dmp); in load_primary()
1366 struct module *mp; in load_kmdb() local
1384 if ((mp = mctl->mod_mp) == NULL) in load_kmdb()
1387 mp->flags |= KOBJ_PRIM; in load_kmdb()
1389 if (load_primary(mp, KOBJ_LM_DEBUGGER) < 0) in load_kmdb()
1421 depends_on(struct module *mp) in depends_on() argument
1430 if ((sp = lookup_one(mp, "_depends_on")) == NULL) in depends_on()
1445 mp->filename); in depends_on()
1453 if (kobj_addrcheck(mp, q) || q[sp->st_size - 1] != '\0') { in depends_on()
1455 mp->filename); in depends_on()
1468 struct module *mp; in kobj_getmodinfo() local
1469 mp = (struct module *)xmp; in kobj_getmodinfo()
1471 modinfo->mi_base = mp->text; in kobj_getmodinfo()
1472 modinfo->mi_size = mp->text_size + mp->data_size; in kobj_getmodinfo()
1484 kobj_export_ksyms(struct module *mp) in kobj_export_ksyms() argument
1486 Sym *esp = (Sym *)(mp->symtbl + mp->symhdr->sh_size); in kobj_export_ksyms()
1492 size_t symsize = mp->symhdr->sh_entsize; in kobj_export_ksyms()
1500 bcopy(mp, omp, sizeof (struct module)); in kobj_export_ksyms()
1518 mp->nsyms = nsyms; in kobj_export_ksyms()
1519 mp->hashsize = kobj_gethashsize(mp->nsyms); in kobj_export_ksyms()
1532 mp->symsize = (2 * sizeof (Shdr)) + (nsyms * symsize) + in kobj_export_ksyms()
1533 (mp->hashsize + mp->nsyms) * sizeof (symid_t) + strsize; in kobj_export_ksyms()
1535 if (mp->flags & KOBJ_NOKSYMS) { in kobj_export_ksyms()
1536 mp->symspace = kobj_alloc(mp->symsize, KM_WAIT); in kobj_export_ksyms()
1538 mp->symspace = vmem_alloc(ksyms_arena, mp->symsize, in kobj_export_ksyms()
1541 bzero(mp->symspace, mp->symsize); in kobj_export_ksyms()
1546 mp->shdrs = mp->symspace; in kobj_export_ksyms()
1547 mp->symhdr = (Shdr *)mp->shdrs; in kobj_export_ksyms()
1548 mp->strhdr = (Shdr *)(mp->symhdr + 1); in kobj_export_ksyms()
1549 mp->symtbl = (char *)(mp->strhdr + 1); in kobj_export_ksyms()
1550 mp->buckets = (symid_t *)(mp->symtbl + (nsyms * symsize)); in kobj_export_ksyms()
1551 mp->chains = (symid_t *)(mp->buckets + mp->hashsize); in kobj_export_ksyms()
1552 mp->strings = (char *)(mp->chains + nsyms); in kobj_export_ksyms()
1557 mp->hdr.e_shnum = 2; in kobj_export_ksyms()
1558 mp->symtbl_section = 0; in kobj_export_ksyms()
1560 mp->symhdr->sh_type = SHT_SYMTAB; in kobj_export_ksyms()
1561 mp->symhdr->sh_addr = (Addr)mp->symtbl; in kobj_export_ksyms()
1562 mp->symhdr->sh_size = nsyms * symsize; in kobj_export_ksyms()
1563 mp->symhdr->sh_link = 1; in kobj_export_ksyms()
1564 mp->symhdr->sh_info = locals; in kobj_export_ksyms()
1565 mp->symhdr->sh_addralign = sizeof (Addr); in kobj_export_ksyms()
1566 mp->symhdr->sh_entsize = symsize; in kobj_export_ksyms()
1568 mp->strhdr->sh_type = SHT_STRTAB; in kobj_export_ksyms()
1569 mp->strhdr->sh_addr = (Addr)mp->strings; in kobj_export_ksyms()
1570 mp->strhdr->sh_size = strsize; in kobj_export_ksyms()
1571 mp->strhdr->sh_addralign = 1; in kobj_export_ksyms()
1583 sp = (Sym *)(mp->symtbl + symsize * nsyms); in kobj_export_ksyms()
1585 bcopy(name, mp->strings + strsize, namelen); in kobj_export_ksyms()
1587 sym_insert(mp, name, nsyms); in kobj_export_ksyms()
1597 if (!(mp->flags & KOBJ_PRIM)) { in kobj_export_ksyms()
1618 if (!(mp->flags & KOBJ_PRIM)) in kobj_export_ksyms()
1624 kobj_export_ctf(struct module *mp) in kobj_export_ctf() argument
1626 char *data = mp->ctfdata; in kobj_export_ctf()
1627 size_t size = mp->ctfsize; in kobj_export_ctf()
1631 mp->ctfdata = NULL; in kobj_export_ctf()
1632 mp->ctfsize = 0; in kobj_export_ctf()
1634 mp->ctfdata = vmem_alloc(ctf_arena, size, in kobj_export_ctf()
1636 bcopy(data, mp->ctfdata, size); in kobj_export_ctf()
1639 if (!(mp->flags & KOBJ_PRIM)) in kobj_export_ctf()
1645 kobj_export_module(struct module *mp) in kobj_export_module() argument
1647 kobj_export_ksyms(mp); in kobj_export_module()
1648 kobj_export_ctf(mp); in kobj_export_module()
1650 mp->flags |= KOBJ_EXPORTED; in kobj_export_module()
1654 process_dynamic(struct module *mp, char *dyndata, char *strdata) in process_dynamic() argument
1707 mp->flags |= KOBJ_IGNMULDEF; in process_dynamic()
1709 mp->flags |= KOBJ_NOKSYMS; in process_dynamic()
1728 mp->depends_on = depstr; in process_dynamic()
1735 do_dynamic(struct module *mp, struct _buf *file) in do_dynamic() argument
1743 for (dshp = NULL, shn = 1; shn < mp->hdr.e_shnum; shn++) { in do_dynamic()
1744 shp = (Shdr *)(mp->shdrs + shn * mp->hdr.e_shentsize); in do_dynamic()
1749 mp->filename); in do_dynamic()
1764 if (dshp->sh_link > mp->hdr.e_shnum) { in do_dynamic()
1765 _kobj_printf(ops, "krtld: get_dynamic: %s, ", mp->filename); in do_dynamic()
1769 dstrp = (Shdr *)(mp->shdrs + dshp->sh_link * mp->hdr.e_shentsize); in do_dynamic()
1772 _kobj_printf(ops, "krtld: get_dynamic: %s, ", mp->filename); in do_dynamic()
1782 _kobj_printf(ops, "krtld: get_dynamic: %s, ", mp->filename); in do_dynamic()
1792 _kobj_printf(ops, "krtld: get_dynamic: %s, ", mp->filename); in do_dynamic()
1802 rc = process_dynamic(mp, dyndata, dstrdata); in do_dynamic()
1811 kobj_set_ctf(struct module *mp, caddr_t data, size_t size) in kobj_set_ctf() argument
1814 if (mp->ctfdata != NULL) { in kobj_set_ctf()
1815 if (vmem_contains(ctf_arena, mp->ctfdata, in kobj_set_ctf()
1816 mp->ctfsize)) { in kobj_set_ctf()
1817 vmem_free(ctf_arena, mp->ctfdata, mp->ctfsize); in kobj_set_ctf()
1819 kobj_free(mp->ctfdata, mp->ctfsize); in kobj_set_ctf()
1830 mp->ctfdata = NULL; in kobj_set_ctf()
1832 mp->ctfsize = size; in kobj_set_ctf()
1833 mp->ctfdata = data; in kobj_set_ctf()
1845 struct module *mp = NULL; in kobj_load_module() local
1850 mp = kobj_zalloc(sizeof (struct module), KM_WAIT); in kobj_load_module()
1859 mp->flags |= KOBJ_NOKSYMS; in kobj_load_module()
1867 kobj_free(mp, sizeof (*mp)); in kobj_load_module()
1881 mp->filename = kobj_alloc(strlen(file->_name) + 1, KM_WAIT); in kobj_load_module()
1882 (void) strcpy(mp->filename, file->_name); in kobj_load_module()
1884 if (kobj_read_file(file, (char *)&mp->hdr, sizeof (mp->hdr), 0) < 0) { in kobj_load_module()
1887 kobj_free(mp->filename, strlen(file->_name) + 1); in kobj_load_module()
1888 kobj_free(mp, sizeof (*mp)); in kobj_load_module()
1892 if (mp->hdr.e_ident[i] != ELFMAG[i]) { in kobj_load_module()
1896 kobj_free(mp->filename, strlen(file->_name) + 1); in kobj_load_module()
1897 kobj_free(mp, sizeof (*mp)); in kobj_load_module()
1907 if (!elf_mach_ok(&mp->hdr)) { in kobj_load_module()
1911 kobj_free(mp->filename, strlen(file->_name) + 1); in kobj_load_module()
1912 kobj_free(mp, sizeof (*mp)); in kobj_load_module()
1932 if (mp->hdr.e_type != ET_REL) { in kobj_load_module()
1936 kobj_free(mp->filename, strlen(file->_name) + 1); in kobj_load_module()
1937 kobj_free(mp, sizeof (*mp)); in kobj_load_module()
1941 n = mp->hdr.e_shentsize * mp->hdr.e_shnum; in kobj_load_module()
1942 mp->shdrs = kobj_alloc(n, KM_WAIT); in kobj_load_module()
1944 if (kobj_read_file(file, mp->shdrs, n, mp->hdr.e_shoff) < 0) { in kobj_load_module()
1947 kobj_free(mp->shdrs, n); in kobj_load_module()
1948 kobj_free(mp->filename, strlen(file->_name) + 1); in kobj_load_module()
1949 kobj_free(mp, sizeof (*mp)); in kobj_load_module()
1954 module_assign(modp, mp); in kobj_load_module()
1957 if (get_progbits(mp, file) < 0) { in kobj_load_module()
1962 if (do_dynamic(mp, file) < 0) { in kobj_load_module()
1968 modp->mod_text = mp->text; in kobj_load_module()
1969 modp->mod_text_size = mp->text_size; in kobj_load_module()
1972 if (get_syms(mp, file) < 0) { in kobj_load_module()
1982 if (mp->depends_on == NULL) in kobj_load_module()
1983 mp->depends_on = depends_on(mp); in kobj_load_module()
1985 if (get_ctf(mp, file) < 0) { in kobj_load_module()
1991 if (!(mp->flags & KOBJ_PRIM)) in kobj_load_module()
1992 get_signature(mp, file); in kobj_load_module()
1996 _kobj_printf(ops, "krtld: file=%s\n", mp->filename); in kobj_load_module()
1997 _kobj_printf(ops, "\ttext:0x%p", mp->text); in kobj_load_module()
1998 _kobj_printf(ops, " size: 0x%lx\n", mp->text_size); in kobj_load_module()
1999 _kobj_printf(ops, "\tdata:0x%p", mp->data); in kobj_load_module()
2000 _kobj_printf(ops, " dsize: 0x%lx\n", mp->data_size); in kobj_load_module()
2020 if ((dcrval = do_common(mp)) < 0) { in kobj_load_module()
2047 if (do_relocations(mp) < 0) { in kobj_load_module()
2053 if (mp->destination) { in kobj_load_module()
2054 off_t off = (uintptr_t)mp->destination & PAGEOFFSET; in kobj_load_module()
2055 caddr_t base = (caddr_t)mp->destination - off; in kobj_load_module()
2056 size_t size = P2ROUNDUP(mp->text_size + off, PAGESIZE); in kobj_load_module()
2063 kobj_sync_instruction_memory(mp->text, mp->text_size); in kobj_load_module()
2064 kobj_export_module(mp); in kobj_load_module()
2083 struct module *mp; in kobj_load_primary_module() local
2089 mp = modp->mod_mp; in kobj_load_primary_module()
2090 mp->flags |= KOBJ_PRIM; in kobj_load_primary_module()
2093 if (mp->depends_on != NULL && (dep = in kobj_load_primary_module()
2094 mod_already_loaded(mp->depends_on)) == NULL) { in kobj_load_primary_module()
2105 add_dependent(mp, dep->mod_mp); in kobj_load_primary_module()
2111 if (do_common(mp) < 0 || do_symbols(mp, 0) < 0 || in kobj_load_primary_module()
2112 do_relocations(mp) < 0) { in kobj_load_primary_module()
2126 module_assign(struct modctl *cp, struct module *mp) in module_assign() argument
2129 cp->mod_mp = mp; in module_assign()
2133 cp->mod_mp = mp; in module_assign()
2141 struct module *mp = modp->mod_mp; in kobj_unload_module() local
2143 if ((_moddebug & MODDEBUG_KEEPTEXT) && mp) { in kobj_unload_module()
2144 _kobj_printf(ops, "text for %s ", mp->filename); in kobj_unload_module()
2145 _kobj_printf(ops, "was at %p\n", mp->text); in kobj_unload_module()
2146 mp->text = NULL; /* don't actually free it */ in kobj_unload_module()
2160 free_module_data(mp); in kobj_unload_module()
2164 free_module_data(struct module *mp) in free_module_data() argument
2170 lp = mp->head; in free_module_data()
2178 hid = mp->hi_calls; in free_module_data()
2187 if (mp->symspace) { in free_module_data()
2188 if (vmem_contains(ksyms_arena, mp->symspace, mp->symsize)) { in free_module_data()
2189 vmem_free(ksyms_arena, mp->symspace, mp->symsize); in free_module_data()
2192 if (mp->flags & KOBJ_NOKSYMS) in free_module_data()
2194 kobj_free(mp->symspace, mp->symsize); in free_module_data()
2199 if (mp->ctfdata) { in free_module_data()
2200 if (vmem_contains(ctf_arena, mp->ctfdata, mp->ctfsize)) in free_module_data()
2201 vmem_free(ctf_arena, mp->ctfdata, mp->ctfsize); in free_module_data()
2203 kobj_free(mp->ctfdata, mp->ctfsize); in free_module_data()
2206 if (mp->sigdata) in free_module_data()
2207 kobj_free(mp->sigdata, mp->sigsize); in free_module_data()
2213 if ((ksyms_exported == 0) && (mp->shdrs != NULL)) { in free_module_data()
2217 for (shn = 1; shn < mp->hdr.e_shnum; shn++) { in free_module_data()
2218 shp = (Shdr *)(mp->shdrs + shn * mp->hdr.e_shentsize); in free_module_data()
2229 if (!(mp->flags & KOBJ_PRIM)) { in free_module_data()
2230 kobj_free(mp->shdrs, in free_module_data()
2231 mp->hdr.e_shentsize * mp->hdr.e_shnum); in free_module_data()
2235 if (mp->bss) in free_module_data()
2236 vmem_free(data_arena, (void *)mp->bss, mp->bss_size); in free_module_data()
2238 if (mp->fbt_tab) in free_module_data()
2239 kobj_texthole_free(mp->fbt_tab, mp->fbt_size); in free_module_data()
2241 if (mp->textwin_base) in free_module_data()
2242 kobj_textwin_free(mp); in free_module_data()
2244 if (mp->sdt_probes != NULL) { in free_module_data()
2245 sdt_probedesc_t *sdp = mp->sdt_probes, *next; in free_module_data()
2255 if (mp->sdt_tab) in free_module_data()
2256 kobj_texthole_free(mp->sdt_tab, mp->sdt_size); in free_module_data()
2257 if (mp->text) in free_module_data()
2258 vmem_free(text_arena, mp->text, mp->text_size); in free_module_data()
2259 if (mp->data) in free_module_data()
2260 vmem_free(data_arena, mp->data, mp->data_size); in free_module_data()
2261 if (mp->depends_on) in free_module_data()
2262 kobj_free(mp->depends_on, strlen(mp->depends_on)+1); in free_module_data()
2263 if (mp->filename) in free_module_data()
2264 kobj_free(mp->filename, strlen(mp->filename)+1); in free_module_data()
2266 kobj_free((char *)mp, sizeof (*mp)); in free_module_data()
2270 get_progbits(struct module *mp, struct _buf *file) in get_progbits() argument
2287 if (get_progbits_size(mp, tp, dp, sdp) < 0) in get_progbits()
2290 mp->text_size = tp->size; in get_progbits()
2291 mp->data_size = dp->size; in get_progbits()
2299 mp->text = kobj_segbrk(&_etext, mp->text_size, in get_progbits()
2305 if (mp->text == NULL) { in get_progbits()
2306 mp->text = kobj_segbrk(&_edata, mp->text_size, in get_progbits()
2310 mp->data = kobj_segbrk(&_edata, mp->data_size, dp->align, 0); in get_progbits()
2312 if (mp->text == NULL || mp->data == NULL) in get_progbits()
2336 mp->text_size += tp->align; in get_progbits()
2337 mp->data_size += dp->align; in get_progbits()
2339 mp->text = kobj_text_alloc(text_arena, mp->text_size); in get_progbits()
2347 mp->text, mp->text_size)) { in get_progbits()
2348 off_t off = (uintptr_t)mp->text & PAGEOFFSET; in get_progbits()
2349 size_t size = P2ROUNDUP(mp->text_size + off, PAGESIZE); in get_progbits()
2351 caddr_t orig = mp->text - off; in get_progbits()
2372 if (mp->data_size) in get_progbits()
2373 mp->data = vmem_alloc(data_arena, mp->data_size, in get_progbits()
2376 textptr = (uintptr_t)mp->text; in get_progbits()
2378 mp->destination = dest; in get_progbits()
2384 text = ALIGN((uintptr_t)mp->text, tp->align); in get_progbits()
2385 data = ALIGN((uintptr_t)mp->data, dp->align); in get_progbits()
2388 for (shn = 1; shn < mp->hdr.e_shnum; shn++) { in get_progbits()
2389 shp = (Shdr *)(mp->shdrs + shn * mp->hdr.e_shentsize); in get_progbits()
2439 kobj_free(mp->shdrs, mp->hdr.e_shentsize * mp->hdr.e_shnum); in get_progbits()
2440 mp->shdrs = NULL; in get_progbits()
2469 get_syms(struct module *mp, struct _buf *file) in get_syms() argument
2481 for (shn = 1; shn < mp->hdr.e_shnum; shn++) { in get_syms()
2482 shp = (Shdr *)(mp->shdrs + shn * mp->hdr.e_shentsize); in get_syms()
2485 mp->symtbl_section = shn; in get_syms()
2486 mp->symhdr = shp; in get_syms()
2505 mp->filename); in get_syms()
2521 if (mp->flags & KOBJ_EXEC) in get_syms()
2524 mp->filename); in get_syms()
2532 if ((mp->symhdr == 0) || (mp->symhdr->sh_link >= mp->hdr.e_shnum)) in get_syms()
2534 mp->strhdr = (Shdr *) in get_syms()
2535 (mp->shdrs + mp->symhdr->sh_link * mp->hdr.e_shentsize); in get_syms()
2537 mp->nsyms = mp->symhdr->sh_size / mp->symhdr->sh_entsize; in get_syms()
2538 mp->hashsize = kobj_gethashsize(mp->nsyms); in get_syms()
2543 mp->symsize = mp->symhdr->sh_size + in get_syms()
2544 (mp->hashsize + mp->nsyms) * sizeof (symid_t) + mp->strhdr->sh_size; in get_syms()
2545 mp->symspace = kobj_zalloc(mp->symsize, KM_WAIT|KM_SCRATCH); in get_syms()
2547 mp->symtbl = mp->symspace; in get_syms()
2548 mp->buckets = (symid_t *)(mp->symtbl + mp->symhdr->sh_size); in get_syms()
2549 mp->chains = mp->buckets + mp->hashsize; in get_syms()
2550 mp->strings = (char *)(mp->chains + mp->nsyms); in get_syms()
2552 if (kobj_read_file(file, mp->symtbl, in get_syms()
2553 mp->symhdr->sh_size, mp->symhdr->sh_offset) < 0 || in get_syms()
2554 kobj_read_file(file, mp->strings, in get_syms()
2555 mp->strhdr->sh_size, mp->strhdr->sh_offset) < 0) in get_syms()
2563 for (i = 1; i < mp->nsyms; i++) { in get_syms()
2564 sp = (Sym *)(mp->symtbl + i * mp->symhdr->sh_entsize); in get_syms()
2566 if (sp->st_shndx >= mp->hdr.e_shnum) { in get_syms()
2573 (mp->shdrs + in get_syms()
2574 sp->st_shndx * mp->hdr.e_shentsize); in get_syms()
2575 if (!(mp->flags & KOBJ_EXEC)) in get_syms()
2581 if (sp->st_name >= mp->strhdr->sh_size) in get_syms()
2584 symname = mp->strings + sp->st_name; in get_syms()
2586 if (!(mp->flags & KOBJ_EXEC) && in get_syms()
2588 ksp = kobj_lookup_all(mp, symname, 0); in get_syms()
2606 !(mp->flags & KOBJ_IGNMULDEF)) { in get_syms()
2615 sym_insert(mp, symname, i); in get_syms()
2622 get_ctf(struct module *mp, struct _buf *file) in get_ctf() argument
2632 if (mp->hdr.e_shstrndx >= mp->hdr.e_shnum) { in get_ctf()
2634 mp->filename); in get_ctf()
2636 mp->hdr.e_shstrndx); in get_ctf()
2640 shp = (Shdr *)(mp->shdrs + mp->hdr.e_shstrndx * mp->hdr.e_shentsize); in get_ctf()
2646 mp->filename); in get_ctf()
2648 mp->hdr.e_shstrndx); in get_ctf()
2653 for (i = 0; i < mp->hdr.e_shnum; i++) { in get_ctf()
2654 shp = (Shdr *)(mp->shdrs + i * mp->hdr.e_shentsize); in get_ctf()
2663 "reading .SUNW_ctf data\n", mp->filename); in get_ctf()
2669 mp->ctfdata = ctfdata; in get_ctf()
2670 mp->ctfsize = shp->sh_size; in get_ctf()
2688 crypto_es_hash(struct module *mp, char *hash, char *shstrtab) in crypto_es_hash() argument
2696 for (shn = 1; shn < mp->hdr.e_shnum; shn++) { in crypto_es_hash()
2697 shp = (Shdr *)(mp->shdrs + shn * mp->hdr.e_shentsize); in crypto_es_hash()
2729 get_signature(struct module *mp, struct _buf *file) in get_signature() argument
2736 if (mp->hdr.e_shstrndx >= mp->hdr.e_shnum) { in get_signature()
2738 mp->filename); in get_signature()
2740 mp->hdr.e_shstrndx); in get_signature()
2744 shp = (Shdr *)(mp->shdrs + mp->hdr.e_shstrndx * mp->hdr.e_shentsize); in get_signature()
2750 mp->filename); in get_signature()
2752 mp->hdr.e_shstrndx); in get_signature()
2757 for (i = 0; i < mp->hdr.e_shnum; i++) { in get_signature()
2758 shp = (Shdr *)(mp->shdrs + i * mp->hdr.e_shentsize); in get_signature()
2770 mp->filename); in get_signature()
2785 mp->sigdata = sigdata; in get_signature()
2786 mp->sigsize = sigsize; in get_signature()
2792 crypto_es_hash(mp, sigdata + shp->sh_size, shstrtab); in get_signature()
2799 add_dependent(struct module *mp, struct module *dep) in add_dependent() argument
2803 for (lp = mp->head; lp; lp = lp->next) { in add_dependent()
2804 if (lp->mp == dep) in add_dependent()
2811 lp->mp = dep; in add_dependent()
2813 if (mp->tail) in add_dependent()
2814 mp->tail->next = lp; in add_dependent()
2816 mp->head = lp; in add_dependent()
2817 mp->tail = lp; in add_dependent()
2824 struct module *mp; in do_dependents() local
2830 mp = modp->mod_mp; in do_dependents()
2832 if ((p = mp->depends_on) == NULL) in do_dependents()
2905 add_dependent(mp, req->mod_mp); in do_dependents()
2930 do_common(struct module *mp) in do_common() argument
2939 if ((err = do_symbols(mp, 0)) < 0) in do_common()
2945 mp->bss_size += mp->bss_align; in do_common()
2946 if (mp->bss_size) { in do_common()
2948 mp->bss = (uintptr_t)kobj_segbrk(&_edata, mp->bss_size, in do_common()
2951 mp->bss = (uintptr_t)vmem_alloc(data_arena, in do_common()
2952 mp->bss_size, VM_SLEEP | VM_BESTFIT); in do_common()
2953 bzero((void *)mp->bss, mp->bss_size); in do_common()
2955 if ((err = do_symbols(mp, ALIGN(mp->bss, mp->bss_align))) < 0) in do_common()
2962 do_symbols(struct module *mp, Elf64_Addr bss_base) in do_symbols() argument
2976 if (mp->flags & KOBJ_RESOLVED) in do_symbols()
2984 for (i = 1; i < mp->nsyms; i++) { in do_symbols()
2985 sp = (Sym *)(mp->symtbl + mp->symhdr->sh_entsize * i); in do_symbols()
2990 name = mp->strings + sp->st_name; in do_symbols()
3000 mp->filename); in do_symbols()
3013 mp->filename); in do_symbols()
3021 if ((sp1 = kobj_lookup_all(mp, name, 0)) != NULL) { in do_symbols()
3050 if (!(mp->flags & KOBJ_PRIM) && in do_symbols()
3053 mp->filename); in do_symbols()
3089 if (assign == 0 && mp->bss == 0) { in do_symbols()
3090 mp->bss_align = bss_align; in do_symbols()
3091 mp->bss_size = bss_ptr; in do_symbols()
3093 mp->flags |= KOBJ_RESOLVED; in do_symbols()
3121 struct module *mp; in kobj_getsymvalue() local
3133 mp = (struct module *)modp->mod_mp; in kobj_getsymvalue()
3134 if (mp && !(mp->flags & KOBJ_PRIM) && modp->mod_loaded && in kobj_getsymvalue()
3135 (sp = lookup_one(mp, name))) { in kobj_getsymvalue()
3152 struct module *mp; in kobj_getsymname() local
3158 mp = mod(lp); in kobj_getsymname()
3160 if ((name = kobj_searchsym(mp, value, offset)) != NULL) in kobj_getsymname()
3167 mp = (struct module *)modp->mod_mp; in kobj_getsymname()
3168 if (mp && !(mp->flags & KOBJ_PRIM) && modp->mod_loaded && in kobj_getsymname()
3169 (name = kobj_searchsym(mp, value, offset))) in kobj_getsymname()
3179 kobj_getelfsym(char *name, void *mp, int *size) in kobj_getelfsym() argument
3183 if (mp == NULL) in kobj_getelfsym()
3186 sp = lookup_one(mp, name); in kobj_getelfsym()
3209 kobj_searchsym(struct module *mp, uintptr_t value, ulong_t *offset) in kobj_searchsym() argument
3221 if (kobj_addrcheck(mp, (void *)value) != 0) in kobj_searchsym()
3224 strtabptr = mp->strings; in kobj_searchsym()
3225 symtabptr = (Sym *)mp->symtbl; in kobj_searchsym()
3231 symnum < mp->nsyms; symnum++, sym = (Sym *) in kobj_searchsym()
3232 ((uintptr_t)sym + mp->symhdr->sh_entsize)) { in kobj_searchsym()
3279 kobj_lookup_all(struct module *mp, char *name, int include_self) in kobj_lookup_all() argument
3286 if (include_self && (sp = lookup_one(mp, name)) != NULL) in kobj_lookup_all()
3289 for (mlp = mp->head; mlp; mlp = mlp->next) { in kobj_lookup_all()
3290 if ((sp = lookup_one(mlp->mp, name)) != NULL && in kobj_lookup_all()
3301 if (mmp == NULL || mp == mmp) in kobj_lookup_all()
3315 struct module *mp; in kobj_lookup_kernel() local
3322 mp = mod(lp); in kobj_lookup_kernel()
3324 if (mp == NULL) in kobj_lookup_kernel()
3327 if ((sp = lookup_one(mp, name)) != NULL) in kobj_lookup_kernel()
3334 lookup_one(struct module *mp, const char *name) in lookup_one() argument
3340 for (ip = &mp->buckets[kobj_hash_name(name) % mp->hashsize]; *ip; in lookup_one()
3341 ip = &mp->chains[*ip]) { in lookup_one()
3342 sp = (Sym *)(mp->symtbl + in lookup_one()
3343 mp->symhdr->sh_entsize * *ip); in lookup_one()
3344 name1 = mp->strings + sp->st_name; in lookup_one()
3359 sym_lookup(struct module *mp, Sym *ksp) in sym_lookup() argument
3361 char *name = mp->strings + ksp->st_name; in sym_lookup()
3365 for (ip = &mp->buckets[kobj_hash_name(name) % mp->hashsize]; *ip; in sym_lookup()
3366 ip = &mp->chains[*ip]) { in sym_lookup()
3367 sp = (Sym *)(mp->symtbl + mp->symhdr->sh_entsize * *ip); in sym_lookup()
3375 sym_insert(struct module *mp, char *name, symid_t index) in sym_insert() argument
3383 if (lastmp != mp) { in sym_insert()
3386 mp->filename); in sym_insert()
3390 lastmp = mp; in sym_insert()
3392 sp = (Sym *)(mp->symtbl + in sym_insert()
3393 index * mp->symhdr->sh_entsize); in sym_insert()
3400 for (ip = &mp->buckets[kobj_hash_name(name) % mp->hashsize]; *ip; in sym_insert()
3401 ip = &mp->chains[*ip]) { in sym_insert()
4276 kobj_textwin_alloc(struct module *mp) in kobj_textwin_alloc() argument
4280 if (mp->textwin != NULL) in kobj_textwin_alloc()
4290 if (!vmem_contains(heaptext_arena, mp->text, mp->text_size)) { in kobj_textwin_alloc()
4291 uintptr_t text = (uintptr_t)mp->text; in kobj_textwin_alloc()
4292 uintptr_t size = (uintptr_t)mp->text_size; in kobj_textwin_alloc()
4298 va = mp->textwin_base = vmem_alloc(heap_arena, sz, VM_SLEEP); in kobj_textwin_alloc()
4308 mp->textwin = mp->textwin_base + (text & PAGEOFFSET); in kobj_textwin_alloc()
4310 mp->textwin = mp->text; in kobj_textwin_alloc()
4315 kobj_textwin_free(struct module *mp) in kobj_textwin_free() argument
4317 uintptr_t text = (uintptr_t)mp->text; in kobj_textwin_free()
4318 uintptr_t tsize = (uintptr_t)mp->text_size; in kobj_textwin_free()
4322 mp->textwin = NULL; in kobj_textwin_free()
4324 if (mp->textwin_base == NULL) in kobj_textwin_free()
4327 hat_unload(kas.a_hat, mp->textwin_base, size, HAT_UNLOAD_UNLOCK); in kobj_textwin_free()
4328 vmem_free(heap_arena, mp->textwin_base, size); in kobj_textwin_free()
4329 mp->textwin_base = NULL; in kobj_textwin_free()