Lines Matching refs:mp
360 struct module *mp; in kobj_init() local
457 mp = load_exec(bootaux, filename); in kobj_init()
463 if (load_primary(mp, KOBJ_LM_PRIMARY) == -1) in kobj_init()
700 struct module *mp; in load_exec() local
716 mp = kobj_zalloc(sizeof (struct module), KM_WAIT); in load_exec()
717 cp->mod_mp = mp; in load_exec()
724 mp->symtbl_section = 0; in load_exec()
725 mp->shdrs = NULL; in load_exec()
726 mp->strhdr = NULL; in load_exec()
733 mp->symhdr = kobj_zalloc(sizeof (Shdr), KM_WAIT); in load_exec()
736 mp->strhdr = kobj_zalloc(sizeof (Shdr), KM_WAIT); in load_exec()
738 mp->symhdr->sh_type = SHT_SYMTAB; in load_exec()
739 mp->strhdr->sh_type = SHT_STRTAB; in load_exec()
747 mp->symspace = mp->symtbl = (char *)dyn->d_un.d_ptr; in load_exec()
748 mp->symhdr->sh_addr = dyn->d_un.d_ptr; in load_exec()
751 mp->nsyms = *((uint_t *)dyn->d_un.d_ptr + 1); in load_exec()
752 mp->hashsize = *(uint_t *)dyn->d_un.d_ptr; in load_exec()
755 mp->strings = (char *)dyn->d_un.d_ptr; in load_exec()
756 mp->strhdr->sh_addr = dyn->d_un.d_ptr; in load_exec()
759 mp->strhdr->sh_size = dyn->d_un.d_val; in load_exec()
762 mp->symhdr->sh_entsize = dyn->d_un.d_val; in load_exec()
774 mp->depends_on = kobj_alloc(allocsize, KM_WAIT); in load_exec()
781 libname = mp->strings + dyn->d_un.d_val; in load_exec()
797 bcopy(mp->depends_on, tmp, osize); in load_exec()
798 kobj_free(mp->depends_on, allocsize); in load_exec()
799 mp->depends_on = tmp; in load_exec()
802 bcopy(libname, mp->depends_on + osize, lsize); in load_exec()
803 *(mp->depends_on + nsize) = ' '; /* separate */ in load_exec()
808 mp->depends_on[nsize - 1] = '\0'; /* terminate the string */ in load_exec()
814 bcopy(mp->depends_on, tmp, nsize); in load_exec()
815 kobj_free(mp->depends_on, allocsize); in load_exec()
816 mp->depends_on = tmp; in load_exec()
818 kobj_free(mp->depends_on, allocsize); in load_exec()
819 mp->depends_on = NULL; in load_exec()
822 mp->flags = KOBJ_EXEC|KOBJ_PRIM; /* NOT a relocatable .o */ in load_exec()
823 mp->symhdr->sh_size = mp->nsyms * mp->symhdr->sh_entsize; in load_exec()
829 mp->chains = kobj_zalloc(mp->nsyms * sizeof (symid_t), KM_WAIT); in load_exec()
831 mp->buckets = kobj_zalloc(mp->hashsize * sizeof (symid_t), KM_WAIT); in load_exec()
833 mp->text = _text; in load_exec()
834 mp->data = _data; in load_exec()
836 mp->text_size = _etext - _text; in load_exec()
837 mp->data_size = _edata - _data; in load_exec()
839 cp->mod_text = mp->text; in load_exec()
840 cp->mod_text_size = mp->text_size; in load_exec()
842 mp->filename = cp->mod_filename; in load_exec()
846 _kobj_printf(ops, "krtld: file=%s\n", mp->filename); in load_exec()
847 _kobj_printf(ops, "\ttext: 0x%p", mp->text); in load_exec()
848 _kobj_printf(ops, " size: 0x%lx\n", mp->text_size); in load_exec()
849 _kobj_printf(ops, "\tdata: 0x%p", mp->data); in load_exec()
850 _kobj_printf(ops, " dsize: 0x%lx\n", mp->data_size); in load_exec()
857 for (i = 0; i < mp->nsyms; i++) { in load_exec()
858 sp = (Sym *)(mp->symtbl + i * mp->symhdr->sh_entsize); in load_exec()
870 sym_insert(mp, mp->strings + sp->st_name, i); in load_exec()
874 return (mp); in load_exec()
884 struct module *mp; in load_linker() local
900 mp = kobj_zalloc(sizeof (struct module), KM_WAIT); in load_linker()
902 cp->mod_mp = mp; in load_linker()
903 mp->hdr = *(Ehdr *)bootaux[BA_LDELF].ba_ptr; in load_linker()
904 shsize = mp->hdr.e_shentsize * mp->hdr.e_shnum; in load_linker()
905 mp->shdrs = kobj_alloc(shsize, KM_WAIT); in load_linker()
906 bcopy(bootaux[BA_LDSHDR].ba_ptr, mp->shdrs, shsize); in load_linker()
908 for (i = 1; i < (int)mp->hdr.e_shnum; i++) { in load_linker()
909 shp = (Shdr *)(mp->shdrs + (i * mp->hdr.e_shentsize)); in load_linker()
913 if (mp->data == NULL) in load_linker()
914 mp->data = (char *)shp->sh_addr; in load_linker()
915 } else if (mp->text == NULL) { in load_linker()
916 mp->text = (char *)shp->sh_addr; in load_linker()
920 mp->symtbl_section = i; in load_linker()
921 mp->symhdr = shp; in load_linker()
922 mp->symspace = mp->symtbl = (char *)shp->sh_addr; in load_linker()
925 mp->nsyms = mp->symhdr->sh_size / mp->symhdr->sh_entsize; in load_linker()
926 mp->flags = KOBJ_INTERP|KOBJ_PRIM; in load_linker()
927 mp->strhdr = (Shdr *) in load_linker()
928 (mp->shdrs + mp->symhdr->sh_link * mp->hdr.e_shentsize); in load_linker()
929 mp->strings = (char *)mp->strhdr->sh_addr; in load_linker()
930 mp->hashsize = kobj_gethashsize(mp->nsyms); in load_linker()
932 mp->symsize = mp->symhdr->sh_size + mp->strhdr->sh_size + sizeof (int) + in load_linker()
933 (mp->hashsize + mp->nsyms) * sizeof (symid_t); in load_linker()
935 mp->chains = kobj_zalloc(mp->nsyms * sizeof (symid_t), KM_WAIT); in load_linker()
936 mp->buckets = kobj_zalloc(mp->hashsize * sizeof (symid_t), KM_WAIT); in load_linker()
938 mp->bss = bootaux[BA_BSS].ba_val; in load_linker()
939 mp->bss_align = 0; /* pre-aligned during allocation */ in load_linker()
940 mp->bss_size = (uintptr_t)_edata - mp->bss; in load_linker()
941 mp->text_size = _etext - mp->text; in load_linker()
942 mp->data_size = _edata - mp->data; in load_linker()
943 mp->filename = cp->mod_filename; in load_linker()
944 cp->mod_text = mp->text; in load_linker()
945 cp->mod_text_size = mp->text_size; in load_linker()
951 kmp->text_size = (size_t)(mp->text - kmp->text); in load_linker()
952 kmp->data_size = (size_t)(mp->data - kmp->data); in load_linker()
957 _kobj_printf(ops, "krtld: file=%s\n", mp->filename); in load_linker()
958 _kobj_printf(ops, "\ttext:0x%p", mp->text); in load_linker()
959 _kobj_printf(ops, " size: 0x%lx\n", mp->text_size); in load_linker()
960 _kobj_printf(ops, "\tdata:0x%p", mp->data); in load_linker()
961 _kobj_printf(ops, " dsize: 0x%lx\n", mp->data_size); in load_linker()
968 for (i = 0; i < mp->nsyms; i++) { in load_linker()
969 sp = (Sym *)(mp->symtbl + i * mp->symhdr->sh_entsize); in load_linker()
977 sym_insert(mp, mp->strings + sp->st_name, i); in load_linker()
1127 struct module *mp; in bind_primary() local
1133 mp = mod(lp); in bind_primary()
1139 if (mp->flags & (KOBJ_EXEC|KOBJ_INTERP)) in bind_primary()
1142 if (do_common(mp) < 0) in bind_primary()
1150 mp = mod(lp); in bind_primary()
1152 if (do_symbols(mp, 0) < 0) in bind_primary()
1160 mp = mod(lp); in bind_primary()
1162 if (mp->flags & KOBJ_EXEC) { in bind_primary()
1190 "module %s\n", mp->filename); in bind_primary()
1196 "KOBJ_EXEC\n", mp->filename); in bind_primary()
1198 if (do_relocate(mp, rela, relasz/relaent, relaent, in bind_primary()
1199 (Addr)mp->text) < 0) in bind_primary()
1202 if (do_relocations(mp) < 0) in bind_primary()
1206 kobj_sync_instruction_memory(mp->text, mp->text_size); in bind_primary()
1210 mp = mod(lp); in bind_primary()
1218 if (mp->flags & KOBJ_EXEC) { in bind_primary()
1222 file = kobj_open_file(mp->filename); in bind_primary()
1225 if (kobj_read_file(file, (char *)&mp->hdr, in bind_primary()
1226 sizeof (mp->hdr), 0) < 0) in bind_primary()
1228 n = mp->hdr.e_shentsize * mp->hdr.e_shnum; in bind_primary()
1229 mp->shdrs = kobj_alloc(n, KM_WAIT); in bind_primary()
1230 if (kobj_read_file(file, mp->shdrs, n, in bind_primary()
1231 mp->hdr.e_shoff) < 0) in bind_primary()
1233 if (get_syms(mp, file) < 0) in bind_primary()
1235 if (get_ctf(mp, file) < 0) in bind_primary()
1238 mp->flags |= KOBJ_RELOCATED; in bind_primary()
1240 } else if (mp->flags & KOBJ_INTERP) { in bind_primary()
1248 file = kobj_open_path(mp->filename, 1, 0); in bind_primary()
1251 if (get_ctf(mp, file) < 0) in bind_primary()
1254 mp->flags |= KOBJ_RELOCATED; in bind_primary()
1280 load_primary(struct module *mp, int lmid) in load_primary() argument
1287 if ((p = mp->depends_on) == NULL) in load_primary()
1330 add_dependent(mp, dmp); in load_primary()
1367 struct module *mp; in load_kmdb() local
1385 if ((mp = mctl->mod_mp) == NULL) in load_kmdb()
1388 mp->flags |= KOBJ_PRIM; in load_kmdb()
1390 if (load_primary(mp, KOBJ_LM_DEBUGGER) < 0) in load_kmdb()
1422 depends_on(struct module *mp) in depends_on() argument
1431 if ((sp = lookup_one(mp, "_depends_on")) == NULL) in depends_on()
1446 mp->filename); in depends_on()
1454 if (kobj_addrcheck(mp, q) || q[sp->st_size - 1] != '\0') { in depends_on()
1456 mp->filename); in depends_on()
1469 struct module *mp; in kobj_getmodinfo() local
1470 mp = (struct module *)xmp; in kobj_getmodinfo()
1472 modinfo->mi_base = mp->text; in kobj_getmodinfo()
1473 modinfo->mi_size = mp->text_size + mp->data_size; in kobj_getmodinfo()
1485 kobj_export_ksyms(struct module *mp) in kobj_export_ksyms() argument
1487 Sym *esp = (Sym *)(mp->symtbl + mp->symhdr->sh_size); in kobj_export_ksyms()
1493 size_t symsize = mp->symhdr->sh_entsize; in kobj_export_ksyms()
1501 bcopy(mp, omp, sizeof (struct module)); in kobj_export_ksyms()
1519 mp->nsyms = nsyms; in kobj_export_ksyms()
1520 mp->hashsize = kobj_gethashsize(mp->nsyms); in kobj_export_ksyms()
1533 mp->symsize = (2 * sizeof (Shdr)) + (nsyms * symsize) + in kobj_export_ksyms()
1534 (mp->hashsize + mp->nsyms) * sizeof (symid_t) + strsize; in kobj_export_ksyms()
1536 if (mp->flags & KOBJ_NOKSYMS) { in kobj_export_ksyms()
1537 mp->symspace = kobj_alloc(mp->symsize, KM_WAIT); in kobj_export_ksyms()
1539 mp->symspace = vmem_alloc(ksyms_arena, mp->symsize, in kobj_export_ksyms()
1542 bzero(mp->symspace, mp->symsize); in kobj_export_ksyms()
1547 mp->shdrs = mp->symspace; in kobj_export_ksyms()
1548 mp->symhdr = (Shdr *)mp->shdrs; in kobj_export_ksyms()
1549 mp->strhdr = (Shdr *)(mp->symhdr + 1); in kobj_export_ksyms()
1550 mp->symtbl = (char *)(mp->strhdr + 1); in kobj_export_ksyms()
1551 mp->buckets = (symid_t *)(mp->symtbl + (nsyms * symsize)); in kobj_export_ksyms()
1552 mp->chains = (symid_t *)(mp->buckets + mp->hashsize); in kobj_export_ksyms()
1553 mp->strings = (char *)(mp->chains + nsyms); in kobj_export_ksyms()
1558 mp->hdr.e_shnum = 2; in kobj_export_ksyms()
1559 mp->symtbl_section = 0; in kobj_export_ksyms()
1561 mp->symhdr->sh_type = SHT_SYMTAB; in kobj_export_ksyms()
1562 mp->symhdr->sh_addr = (Addr)mp->symtbl; in kobj_export_ksyms()
1563 mp->symhdr->sh_size = nsyms * symsize; in kobj_export_ksyms()
1564 mp->symhdr->sh_link = 1; in kobj_export_ksyms()
1565 mp->symhdr->sh_info = locals; in kobj_export_ksyms()
1566 mp->symhdr->sh_addralign = sizeof (Addr); in kobj_export_ksyms()
1567 mp->symhdr->sh_entsize = symsize; in kobj_export_ksyms()
1569 mp->strhdr->sh_type = SHT_STRTAB; in kobj_export_ksyms()
1570 mp->strhdr->sh_addr = (Addr)mp->strings; in kobj_export_ksyms()
1571 mp->strhdr->sh_size = strsize; in kobj_export_ksyms()
1572 mp->strhdr->sh_addralign = 1; in kobj_export_ksyms()
1584 sp = (Sym *)(mp->symtbl + symsize * nsyms); in kobj_export_ksyms()
1586 bcopy(name, mp->strings + strsize, namelen); in kobj_export_ksyms()
1588 sym_insert(mp, name, nsyms); in kobj_export_ksyms()
1598 if (!(mp->flags & KOBJ_PRIM)) { in kobj_export_ksyms()
1619 if (!(mp->flags & KOBJ_PRIM)) in kobj_export_ksyms()
1625 kobj_export_ctf(struct module *mp) in kobj_export_ctf() argument
1627 char *data = mp->ctfdata; in kobj_export_ctf()
1628 size_t size = mp->ctfsize; in kobj_export_ctf()
1632 mp->ctfdata = NULL; in kobj_export_ctf()
1633 mp->ctfsize = 0; in kobj_export_ctf()
1635 mp->ctfdata = vmem_alloc(ctf_arena, size, in kobj_export_ctf()
1637 bcopy(data, mp->ctfdata, size); in kobj_export_ctf()
1640 if (!(mp->flags & KOBJ_PRIM)) in kobj_export_ctf()
1646 kobj_export_module(struct module *mp) in kobj_export_module() argument
1648 kobj_export_ksyms(mp); in kobj_export_module()
1649 kobj_export_ctf(mp); in kobj_export_module()
1651 mp->flags |= KOBJ_EXPORTED; in kobj_export_module()
1655 process_dynamic(struct module *mp, char *dyndata, char *strdata) in process_dynamic() argument
1708 mp->flags |= KOBJ_IGNMULDEF; in process_dynamic()
1710 mp->flags |= KOBJ_NOKSYMS; in process_dynamic()
1729 mp->depends_on = depstr; in process_dynamic()
1736 do_dynamic(struct module *mp, struct _buf *file) in do_dynamic() argument
1744 for (dshp = NULL, shn = 1; shn < mp->hdr.e_shnum; shn++) { in do_dynamic()
1745 shp = (Shdr *)(mp->shdrs + shn * mp->hdr.e_shentsize); in do_dynamic()
1750 mp->filename); in do_dynamic()
1765 if (dshp->sh_link > mp->hdr.e_shnum) { in do_dynamic()
1766 _kobj_printf(ops, "krtld: get_dynamic: %s, ", mp->filename); in do_dynamic()
1770 dstrp = (Shdr *)(mp->shdrs + dshp->sh_link * mp->hdr.e_shentsize); in do_dynamic()
1773 _kobj_printf(ops, "krtld: get_dynamic: %s, ", mp->filename); in do_dynamic()
1783 _kobj_printf(ops, "krtld: get_dynamic: %s, ", mp->filename); in do_dynamic()
1793 _kobj_printf(ops, "krtld: get_dynamic: %s, ", mp->filename); in do_dynamic()
1803 rc = process_dynamic(mp, dyndata, dstrdata); in do_dynamic()
1812 kobj_set_ctf(struct module *mp, caddr_t data, size_t size) in kobj_set_ctf() argument
1815 if (mp->ctfdata != NULL) { in kobj_set_ctf()
1816 if (vmem_contains(ctf_arena, mp->ctfdata, in kobj_set_ctf()
1817 mp->ctfsize)) { in kobj_set_ctf()
1818 vmem_free(ctf_arena, mp->ctfdata, mp->ctfsize); in kobj_set_ctf()
1820 kobj_free(mp->ctfdata, mp->ctfsize); in kobj_set_ctf()
1831 mp->ctfdata = NULL; in kobj_set_ctf()
1833 mp->ctfsize = size; in kobj_set_ctf()
1834 mp->ctfdata = data; in kobj_set_ctf()
1846 struct module *mp = NULL; in kobj_load_module() local
1851 mp = kobj_zalloc(sizeof (struct module), KM_WAIT); in kobj_load_module()
1860 mp->flags |= KOBJ_NOKSYMS; in kobj_load_module()
1868 kobj_free(mp, sizeof (*mp)); in kobj_load_module()
1882 mp->filename = kobj_alloc(strlen(file->_name) + 1, KM_WAIT); in kobj_load_module()
1883 (void) strcpy(mp->filename, file->_name); in kobj_load_module()
1885 if (kobj_read_file(file, (char *)&mp->hdr, sizeof (mp->hdr), 0) < 0) { in kobj_load_module()
1888 kobj_free(mp->filename, strlen(file->_name) + 1); in kobj_load_module()
1889 kobj_free(mp, sizeof (*mp)); in kobj_load_module()
1893 if (mp->hdr.e_ident[i] != ELFMAG[i]) { in kobj_load_module()
1897 kobj_free(mp->filename, strlen(file->_name) + 1); in kobj_load_module()
1898 kobj_free(mp, sizeof (*mp)); in kobj_load_module()
1908 if (!elf_mach_ok(&mp->hdr)) { in kobj_load_module()
1912 kobj_free(mp->filename, strlen(file->_name) + 1); in kobj_load_module()
1913 kobj_free(mp, sizeof (*mp)); in kobj_load_module()
1933 if (mp->hdr.e_type != ET_REL) { in kobj_load_module()
1937 kobj_free(mp->filename, strlen(file->_name) + 1); in kobj_load_module()
1938 kobj_free(mp, sizeof (*mp)); in kobj_load_module()
1942 n = mp->hdr.e_shentsize * mp->hdr.e_shnum; in kobj_load_module()
1943 mp->shdrs = kobj_alloc(n, KM_WAIT); in kobj_load_module()
1945 if (kobj_read_file(file, mp->shdrs, n, mp->hdr.e_shoff) < 0) { in kobj_load_module()
1948 kobj_free(mp->shdrs, n); in kobj_load_module()
1949 kobj_free(mp->filename, strlen(file->_name) + 1); in kobj_load_module()
1950 kobj_free(mp, sizeof (*mp)); in kobj_load_module()
1955 module_assign(modp, mp); in kobj_load_module()
1958 if (get_progbits(mp, file) < 0) { in kobj_load_module()
1963 if (do_dynamic(mp, file) < 0) { in kobj_load_module()
1969 modp->mod_text = mp->text; in kobj_load_module()
1970 modp->mod_text_size = mp->text_size; in kobj_load_module()
1973 if (get_syms(mp, file) < 0) { in kobj_load_module()
1983 if (mp->depends_on == NULL) in kobj_load_module()
1984 mp->depends_on = depends_on(mp); in kobj_load_module()
1986 if (get_ctf(mp, file) < 0) { in kobj_load_module()
1992 if (!(mp->flags & KOBJ_PRIM)) in kobj_load_module()
1993 get_signature(mp, file); in kobj_load_module()
1997 _kobj_printf(ops, "krtld: file=%s\n", mp->filename); in kobj_load_module()
1998 _kobj_printf(ops, "\ttext:0x%p", mp->text); in kobj_load_module()
1999 _kobj_printf(ops, " size: 0x%lx\n", mp->text_size); in kobj_load_module()
2000 _kobj_printf(ops, "\tdata:0x%p", mp->data); in kobj_load_module()
2001 _kobj_printf(ops, " dsize: 0x%lx\n", mp->data_size); in kobj_load_module()
2021 if ((dcrval = do_common(mp)) < 0) { in kobj_load_module()
2048 if (do_relocations(mp) < 0) { in kobj_load_module()
2054 if (mp->destination) { in kobj_load_module()
2055 off_t off = (uintptr_t)mp->destination & PAGEOFFSET; in kobj_load_module()
2056 caddr_t base = (caddr_t)mp->destination - off; in kobj_load_module()
2057 size_t size = P2ROUNDUP(mp->text_size + off, PAGESIZE); in kobj_load_module()
2064 kobj_sync_instruction_memory(mp->text, mp->text_size); in kobj_load_module()
2065 kobj_export_module(mp); in kobj_load_module()
2084 struct module *mp; in kobj_load_primary_module() local
2090 mp = modp->mod_mp; in kobj_load_primary_module()
2091 mp->flags |= KOBJ_PRIM; in kobj_load_primary_module()
2094 if (mp->depends_on != NULL && (dep = in kobj_load_primary_module()
2095 mod_already_loaded(mp->depends_on)) == NULL) { in kobj_load_primary_module()
2106 add_dependent(mp, dep->mod_mp); in kobj_load_primary_module()
2112 if (do_common(mp) < 0 || do_symbols(mp, 0) < 0 || in kobj_load_primary_module()
2113 do_relocations(mp) < 0) { in kobj_load_primary_module()
2127 module_assign(struct modctl *cp, struct module *mp) in module_assign() argument
2130 cp->mod_mp = mp; in module_assign()
2134 cp->mod_mp = mp; in module_assign()
2142 struct module *mp = modp->mod_mp; in kobj_unload_module() local
2144 if ((_moddebug & MODDEBUG_KEEPTEXT) && mp) { in kobj_unload_module()
2145 _kobj_printf(ops, "text for %s ", mp->filename); in kobj_unload_module()
2146 _kobj_printf(ops, "was at %p\n", mp->text); in kobj_unload_module()
2147 mp->text = NULL; /* don't actually free it */ in kobj_unload_module()
2161 free_module_data(mp); in kobj_unload_module()
2165 free_module_data(struct module *mp) in free_module_data() argument
2171 lp = mp->head; in free_module_data()
2179 hid = mp->hi_calls; in free_module_data()
2188 if (mp->symspace) { in free_module_data()
2189 if (vmem_contains(ksyms_arena, mp->symspace, mp->symsize)) { in free_module_data()
2190 vmem_free(ksyms_arena, mp->symspace, mp->symsize); in free_module_data()
2193 if (mp->flags & KOBJ_NOKSYMS) in free_module_data()
2195 kobj_free(mp->symspace, mp->symsize); in free_module_data()
2200 if (mp->ctfdata) { in free_module_data()
2201 if (vmem_contains(ctf_arena, mp->ctfdata, mp->ctfsize)) in free_module_data()
2202 vmem_free(ctf_arena, mp->ctfdata, mp->ctfsize); in free_module_data()
2204 kobj_free(mp->ctfdata, mp->ctfsize); in free_module_data()
2207 if (mp->sigdata) in free_module_data()
2208 kobj_free(mp->sigdata, mp->sigsize); in free_module_data()
2214 if ((ksyms_exported == 0) && (mp->shdrs != NULL)) { in free_module_data()
2218 for (shn = 1; shn < mp->hdr.e_shnum; shn++) { in free_module_data()
2219 shp = (Shdr *)(mp->shdrs + shn * mp->hdr.e_shentsize); in free_module_data()
2230 if (!(mp->flags & KOBJ_PRIM)) { in free_module_data()
2231 kobj_free(mp->shdrs, in free_module_data()
2232 mp->hdr.e_shentsize * mp->hdr.e_shnum); in free_module_data()
2236 if (mp->bss) in free_module_data()
2237 vmem_free(data_arena, (void *)mp->bss, mp->bss_size); in free_module_data()
2239 if (mp->fbt_tab) in free_module_data()
2240 kobj_texthole_free(mp->fbt_tab, mp->fbt_size); in free_module_data()
2242 if (mp->textwin_base) in free_module_data()
2243 kobj_textwin_free(mp); in free_module_data()
2245 if (mp->sdt_probes != NULL) { in free_module_data()
2246 sdt_probedesc_t *sdp = mp->sdt_probes, *next; in free_module_data()
2256 if (mp->sdt_tab) in free_module_data()
2257 kobj_texthole_free(mp->sdt_tab, mp->sdt_size); in free_module_data()
2258 if (mp->text) in free_module_data()
2259 vmem_free(text_arena, mp->text, mp->text_size); in free_module_data()
2260 if (mp->data) in free_module_data()
2261 vmem_free(data_arena, mp->data, mp->data_size); in free_module_data()
2262 if (mp->depends_on) in free_module_data()
2263 kobj_free(mp->depends_on, strlen(mp->depends_on)+1); in free_module_data()
2264 if (mp->filename) in free_module_data()
2265 kobj_free(mp->filename, strlen(mp->filename)+1); in free_module_data()
2267 kobj_free((char *)mp, sizeof (*mp)); in free_module_data()
2271 get_progbits(struct module *mp, struct _buf *file) in get_progbits() argument
2288 if (get_progbits_size(mp, tp, dp, sdp) < 0) in get_progbits()
2291 mp->text_size = tp->size; in get_progbits()
2292 mp->data_size = dp->size; in get_progbits()
2300 mp->text = kobj_segbrk(&_etext, mp->text_size, in get_progbits()
2306 if (mp->text == NULL) { in get_progbits()
2307 mp->text = kobj_segbrk(&_edata, mp->text_size, in get_progbits()
2311 mp->data = kobj_segbrk(&_edata, mp->data_size, dp->align, 0); in get_progbits()
2313 if (mp->text == NULL || mp->data == NULL) in get_progbits()
2337 mp->text_size += tp->align; in get_progbits()
2338 mp->data_size += dp->align; in get_progbits()
2340 mp->text = kobj_text_alloc(text_arena, mp->text_size); in get_progbits()
2348 mp->text, mp->text_size)) { in get_progbits()
2349 off_t off = (uintptr_t)mp->text & PAGEOFFSET; in get_progbits()
2350 size_t size = P2ROUNDUP(mp->text_size + off, PAGESIZE); in get_progbits()
2352 caddr_t orig = mp->text - off; in get_progbits()
2373 if (mp->data_size) in get_progbits()
2374 mp->data = vmem_alloc(data_arena, mp->data_size, in get_progbits()
2377 textptr = (uintptr_t)mp->text; in get_progbits()
2379 mp->destination = dest; in get_progbits()
2385 text = ALIGN((uintptr_t)mp->text, tp->align); in get_progbits()
2386 data = ALIGN((uintptr_t)mp->data, dp->align); in get_progbits()
2389 for (shn = 1; shn < mp->hdr.e_shnum; shn++) { in get_progbits()
2390 shp = (Shdr *)(mp->shdrs + shn * mp->hdr.e_shentsize); in get_progbits()
2440 kobj_free(mp->shdrs, mp->hdr.e_shentsize * mp->hdr.e_shnum); in get_progbits()
2441 mp->shdrs = NULL; in get_progbits()
2470 get_syms(struct module *mp, struct _buf *file) in get_syms() argument
2482 for (shn = 1; shn < mp->hdr.e_shnum; shn++) { in get_syms()
2483 shp = (Shdr *)(mp->shdrs + shn * mp->hdr.e_shentsize); in get_syms()
2486 mp->symtbl_section = shn; in get_syms()
2487 mp->symhdr = shp; in get_syms()
2506 mp->filename); in get_syms()
2522 if (mp->flags & KOBJ_EXEC) in get_syms()
2525 mp->filename); in get_syms()
2533 if ((mp->symhdr == 0) || (mp->symhdr->sh_link >= mp->hdr.e_shnum)) in get_syms()
2535 mp->strhdr = (Shdr *) in get_syms()
2536 (mp->shdrs + mp->symhdr->sh_link * mp->hdr.e_shentsize); in get_syms()
2538 mp->nsyms = mp->symhdr->sh_size / mp->symhdr->sh_entsize; in get_syms()
2539 mp->hashsize = kobj_gethashsize(mp->nsyms); in get_syms()
2544 mp->symsize = mp->symhdr->sh_size + in get_syms()
2545 (mp->hashsize + mp->nsyms) * sizeof (symid_t) + mp->strhdr->sh_size; in get_syms()
2546 mp->symspace = kobj_zalloc(mp->symsize, KM_WAIT|KM_SCRATCH); in get_syms()
2548 mp->symtbl = mp->symspace; in get_syms()
2549 mp->buckets = (symid_t *)(mp->symtbl + mp->symhdr->sh_size); in get_syms()
2550 mp->chains = mp->buckets + mp->hashsize; in get_syms()
2551 mp->strings = (char *)(mp->chains + mp->nsyms); in get_syms()
2553 if (kobj_read_file(file, mp->symtbl, in get_syms()
2554 mp->symhdr->sh_size, mp->symhdr->sh_offset) < 0 || in get_syms()
2555 kobj_read_file(file, mp->strings, in get_syms()
2556 mp->strhdr->sh_size, mp->strhdr->sh_offset) < 0) in get_syms()
2564 for (i = 1; i < mp->nsyms; i++) { in get_syms()
2565 sp = (Sym *)(mp->symtbl + i * mp->symhdr->sh_entsize); in get_syms()
2567 if (sp->st_shndx >= mp->hdr.e_shnum) { in get_syms()
2574 (mp->shdrs + in get_syms()
2575 sp->st_shndx * mp->hdr.e_shentsize); in get_syms()
2576 if (!(mp->flags & KOBJ_EXEC)) in get_syms()
2582 if (sp->st_name >= mp->strhdr->sh_size) in get_syms()
2585 symname = mp->strings + sp->st_name; in get_syms()
2587 if (!(mp->flags & KOBJ_EXEC) && in get_syms()
2589 ksp = kobj_lookup_all(mp, symname, 0); in get_syms()
2607 !(mp->flags & KOBJ_IGNMULDEF)) { in get_syms()
2616 sym_insert(mp, symname, i); in get_syms()
2623 get_ctf(struct module *mp, struct _buf *file) in get_ctf() argument
2633 if (mp->hdr.e_shstrndx >= mp->hdr.e_shnum) { in get_ctf()
2635 mp->filename); in get_ctf()
2637 mp->hdr.e_shstrndx); in get_ctf()
2641 shp = (Shdr *)(mp->shdrs + mp->hdr.e_shstrndx * mp->hdr.e_shentsize); in get_ctf()
2647 mp->filename); in get_ctf()
2649 mp->hdr.e_shstrndx); in get_ctf()
2654 for (i = 0; i < mp->hdr.e_shnum; i++) { in get_ctf()
2655 shp = (Shdr *)(mp->shdrs + i * mp->hdr.e_shentsize); in get_ctf()
2664 "reading .SUNW_ctf data\n", mp->filename); in get_ctf()
2670 mp->ctfdata = ctfdata; in get_ctf()
2671 mp->ctfsize = shp->sh_size; in get_ctf()
2689 crypto_es_hash(struct module *mp, char *hash, char *shstrtab) in crypto_es_hash() argument
2697 for (shn = 1; shn < mp->hdr.e_shnum; shn++) { in crypto_es_hash()
2698 shp = (Shdr *)(mp->shdrs + shn * mp->hdr.e_shentsize); in crypto_es_hash()
2730 get_signature(struct module *mp, struct _buf *file) in get_signature() argument
2737 if (mp->hdr.e_shstrndx >= mp->hdr.e_shnum) { in get_signature()
2739 mp->filename); in get_signature()
2741 mp->hdr.e_shstrndx); in get_signature()
2745 shp = (Shdr *)(mp->shdrs + mp->hdr.e_shstrndx * mp->hdr.e_shentsize); in get_signature()
2751 mp->filename); in get_signature()
2753 mp->hdr.e_shstrndx); in get_signature()
2758 for (i = 0; i < mp->hdr.e_shnum; i++) { in get_signature()
2759 shp = (Shdr *)(mp->shdrs + i * mp->hdr.e_shentsize); in get_signature()
2771 mp->filename); in get_signature()
2786 mp->sigdata = sigdata; in get_signature()
2787 mp->sigsize = sigsize; in get_signature()
2793 crypto_es_hash(mp, sigdata + shp->sh_size, shstrtab); in get_signature()
2800 add_dependent(struct module *mp, struct module *dep) in add_dependent() argument
2804 for (lp = mp->head; lp; lp = lp->next) { in add_dependent()
2805 if (lp->mp == dep) in add_dependent()
2812 lp->mp = dep; in add_dependent()
2814 if (mp->tail) in add_dependent()
2815 mp->tail->next = lp; in add_dependent()
2817 mp->head = lp; in add_dependent()
2818 mp->tail = lp; in add_dependent()
2825 struct module *mp; in do_dependents() local
2831 mp = modp->mod_mp; in do_dependents()
2833 if ((p = mp->depends_on) == NULL) in do_dependents()
2906 add_dependent(mp, req->mod_mp); in do_dependents()
2931 do_common(struct module *mp) in do_common() argument
2940 if ((err = do_symbols(mp, 0)) < 0) in do_common()
2946 mp->bss_size += mp->bss_align; in do_common()
2947 if (mp->bss_size) { in do_common()
2949 mp->bss = (uintptr_t)kobj_segbrk(&_edata, mp->bss_size, in do_common()
2952 mp->bss = (uintptr_t)vmem_alloc(data_arena, in do_common()
2953 mp->bss_size, VM_SLEEP | VM_BESTFIT); in do_common()
2954 bzero((void *)mp->bss, mp->bss_size); in do_common()
2956 if ((err = do_symbols(mp, ALIGN(mp->bss, mp->bss_align))) < 0) in do_common()
2963 do_symbols(struct module *mp, Elf64_Addr bss_base) in do_symbols() argument
2977 if (mp->flags & KOBJ_RESOLVED) in do_symbols()
2985 for (i = 1; i < mp->nsyms; i++) { in do_symbols()
2986 sp = (Sym *)(mp->symtbl + mp->symhdr->sh_entsize * i); in do_symbols()
2991 name = mp->strings + sp->st_name; in do_symbols()
3001 mp->filename); in do_symbols()
3014 mp->filename); in do_symbols()
3022 if ((sp1 = kobj_lookup_all(mp, name, 0)) != NULL) { in do_symbols()
3051 if (!(mp->flags & KOBJ_PRIM) && in do_symbols()
3054 mp->filename); in do_symbols()
3090 if (assign == 0 && mp->bss == 0) { in do_symbols()
3091 mp->bss_align = bss_align; in do_symbols()
3092 mp->bss_size = bss_ptr; in do_symbols()
3094 mp->flags |= KOBJ_RESOLVED; in do_symbols()
3122 struct module *mp; in kobj_getsymvalue() local
3134 mp = (struct module *)modp->mod_mp; in kobj_getsymvalue()
3135 if (mp && !(mp->flags & KOBJ_PRIM) && modp->mod_loaded && in kobj_getsymvalue()
3136 (sp = lookup_one(mp, name))) { in kobj_getsymvalue()
3153 struct module *mp; in kobj_getsymname() local
3165 mp = mod(lp); in kobj_getsymname()
3167 if ((name = kobj_searchsym(mp, value, offset)) != NULL) in kobj_getsymname()
3174 mp = (struct module *)modp->mod_mp; in kobj_getsymname()
3175 if (mp && !(mp->flags & KOBJ_PRIM) && modp->mod_loaded && in kobj_getsymname()
3176 (name = kobj_searchsym(mp, value, offset))) in kobj_getsymname()
3186 kobj_getelfsym(char *name, void *mp, int *size) in kobj_getelfsym() argument
3190 if (mp == NULL) in kobj_getelfsym()
3193 sp = lookup_one(mp, name); in kobj_getelfsym()
3216 kobj_searchsym(struct module *mp, uintptr_t value, ulong_t *offset) in kobj_searchsym() argument
3228 if (kobj_addrcheck(mp, (void *)value) != 0) in kobj_searchsym()
3231 strtabptr = mp->strings; in kobj_searchsym()
3232 symtabptr = (Sym *)mp->symtbl; in kobj_searchsym()
3238 symnum < mp->nsyms; symnum++, sym = (Sym *) in kobj_searchsym()
3239 ((uintptr_t)sym + mp->symhdr->sh_entsize)) { in kobj_searchsym()
3286 kobj_lookup_all(struct module *mp, char *name, int include_self) in kobj_lookup_all() argument
3293 if (include_self && (sp = lookup_one(mp, name)) != NULL) in kobj_lookup_all()
3296 for (mlp = mp->head; mlp; mlp = mlp->next) { in kobj_lookup_all()
3297 if ((sp = lookup_one(mlp->mp, name)) != NULL && in kobj_lookup_all()
3308 if (mmp == NULL || mp == mmp) in kobj_lookup_all()
3322 struct module *mp; in kobj_lookup_kernel() local
3329 mp = mod(lp); in kobj_lookup_kernel()
3331 if (mp == NULL) in kobj_lookup_kernel()
3334 if ((sp = lookup_one(mp, name)) != NULL) in kobj_lookup_kernel()
3341 lookup_one(struct module *mp, const char *name) in lookup_one() argument
3347 for (ip = &mp->buckets[kobj_hash_name(name) % mp->hashsize]; *ip; in lookup_one()
3348 ip = &mp->chains[*ip]) { in lookup_one()
3349 sp = (Sym *)(mp->symtbl + in lookup_one()
3350 mp->symhdr->sh_entsize * *ip); in lookup_one()
3351 name1 = mp->strings + sp->st_name; in lookup_one()
3366 sym_lookup(struct module *mp, Sym *ksp) in sym_lookup() argument
3368 char *name = mp->strings + ksp->st_name; in sym_lookup()
3372 for (ip = &mp->buckets[kobj_hash_name(name) % mp->hashsize]; *ip; in sym_lookup()
3373 ip = &mp->chains[*ip]) { in sym_lookup()
3374 sp = (Sym *)(mp->symtbl + mp->symhdr->sh_entsize * *ip); in sym_lookup()
3382 sym_insert(struct module *mp, char *name, symid_t index) in sym_insert() argument
3390 if (lastmp != mp) { in sym_insert()
3393 mp->filename); in sym_insert()
3397 lastmp = mp; in sym_insert()
3399 sp = (Sym *)(mp->symtbl + in sym_insert()
3400 index * mp->symhdr->sh_entsize); in sym_insert()
3407 for (ip = &mp->buckets[kobj_hash_name(name) % mp->hashsize]; *ip; in sym_insert()
3408 ip = &mp->chains[*ip]) { in sym_insert()
4283 kobj_textwin_alloc(struct module *mp) in kobj_textwin_alloc() argument
4287 if (mp->textwin != NULL) in kobj_textwin_alloc()
4297 if (!vmem_contains(heaptext_arena, mp->text, mp->text_size)) { in kobj_textwin_alloc()
4298 uintptr_t text = (uintptr_t)mp->text; in kobj_textwin_alloc()
4299 uintptr_t size = (uintptr_t)mp->text_size; in kobj_textwin_alloc()
4305 va = mp->textwin_base = vmem_alloc(heap_arena, sz, VM_SLEEP); in kobj_textwin_alloc()
4315 mp->textwin = mp->textwin_base + (text & PAGEOFFSET); in kobj_textwin_alloc()
4317 mp->textwin = mp->text; in kobj_textwin_alloc()
4322 kobj_textwin_free(struct module *mp) in kobj_textwin_free() argument
4324 uintptr_t text = (uintptr_t)mp->text; in kobj_textwin_free()
4325 uintptr_t tsize = (uintptr_t)mp->text_size; in kobj_textwin_free()
4329 mp->textwin = NULL; in kobj_textwin_free()
4331 if (mp->textwin_base == NULL) in kobj_textwin_free()
4334 hat_unload(kas.a_hat, mp->textwin_base, size, HAT_UNLOAD_UNLOCK); in kobj_textwin_free()
4335 vmem_free(heap_arena, mp->textwin_base, size); in kobj_textwin_free()
4336 mp->textwin_base = NULL; in kobj_textwin_free()