Lines Matching refs:mp

369 	struct module *mp;
467 mp = load_exec(bootaux, filename);
473 if (load_primary(mp, KOBJ_LM_PRIMARY) == -1)
710 struct module *mp;
726 mp = kobj_zalloc(sizeof (struct module), KM_WAIT);
727 cp->mod_mp = mp;
734 mp->symtbl_section = 0;
735 mp->shdrs = NULL;
736 mp->strhdr = NULL;
743 mp->symhdr = kobj_zalloc(sizeof (Shdr), KM_WAIT);
746 mp->strhdr = kobj_zalloc(sizeof (Shdr), KM_WAIT);
748 mp->symhdr->sh_type = SHT_SYMTAB;
749 mp->strhdr->sh_type = SHT_STRTAB;
757 mp->symspace = mp->symtbl = (char *)dyn->d_un.d_ptr;
758 mp->symhdr->sh_addr = dyn->d_un.d_ptr;
761 mp->nsyms = *((uint_t *)dyn->d_un.d_ptr + 1);
762 mp->hashsize = *(uint_t *)dyn->d_un.d_ptr;
765 mp->strings = (char *)dyn->d_un.d_ptr;
766 mp->strhdr->sh_addr = dyn->d_un.d_ptr;
769 mp->strhdr->sh_size = dyn->d_un.d_val;
772 mp->symhdr->sh_entsize = dyn->d_un.d_val;
784 mp->depends_on = kobj_alloc(allocsize, KM_WAIT);
791 libname = mp->strings + dyn->d_un.d_val;
807 bcopy(mp->depends_on, tmp, osize);
808 kobj_free(mp->depends_on, allocsize);
809 mp->depends_on = tmp;
812 bcopy(libname, mp->depends_on + osize, lsize);
813 *(mp->depends_on + nsize) = ' '; /* separate */
818 mp->depends_on[nsize - 1] = '\0'; /* terminate the string */
824 bcopy(mp->depends_on, tmp, nsize);
825 kobj_free(mp->depends_on, allocsize);
826 mp->depends_on = tmp;
828 kobj_free(mp->depends_on, allocsize);
829 mp->depends_on = NULL;
832 mp->flags = KOBJ_EXEC|KOBJ_PRIM; /* NOT a relocatable .o */
833 mp->symhdr->sh_size = mp->nsyms * mp->symhdr->sh_entsize;
839 mp->chains = kobj_zalloc(mp->nsyms * sizeof (symid_t), KM_WAIT);
841 mp->buckets = kobj_zalloc(mp->hashsize * sizeof (symid_t), KM_WAIT);
843 mp->text = _text;
844 mp->data = _data;
846 mp->text_size = _etext - _text;
847 mp->data_size = _edata - _data;
849 cp->mod_text = mp->text;
850 cp->mod_text_size = mp->text_size;
852 mp->filename = cp->mod_filename;
856 _kobj_printf(ops, "krtld: file=%s\n", mp->filename);
857 _kobj_printf(ops, "\ttext: 0x%p", mp->text);
858 _kobj_printf(ops, " size: 0x%x\n", mp->text_size);
859 _kobj_printf(ops, "\tdata: 0x%p", mp->data);
860 _kobj_printf(ops, " dsize: 0x%x\n", mp->data_size);
867 for (i = 0; i < mp->nsyms; i++) {
868 sp = (Sym *)(mp->symtbl + i * mp->symhdr->sh_entsize);
880 sym_insert(mp, mp->strings + sp->st_name, i);
884 return (mp);
894 struct module *mp;
910 mp = kobj_zalloc(sizeof (struct module), KM_WAIT);
912 cp->mod_mp = mp;
913 mp->hdr = *(Ehdr *)bootaux[BA_LDELF].ba_ptr;
914 shsize = mp->hdr.e_shentsize * mp->hdr.e_shnum;
915 mp->shdrs = kobj_alloc(shsize, KM_WAIT);
916 bcopy(bootaux[BA_LDSHDR].ba_ptr, mp->shdrs, shsize);
918 for (i = 1; i < (int)mp->hdr.e_shnum; i++) {
919 shp = (Shdr *)(mp->shdrs + (i * mp->hdr.e_shentsize));
923 if (mp->data == NULL)
924 mp->data = (char *)shp->sh_addr;
925 } else if (mp->text == NULL) {
926 mp->text = (char *)shp->sh_addr;
930 mp->symtbl_section = i;
931 mp->symhdr = shp;
932 mp->symspace = mp->symtbl = (char *)shp->sh_addr;
935 mp->nsyms = mp->symhdr->sh_size / mp->symhdr->sh_entsize;
936 mp->flags = KOBJ_INTERP|KOBJ_PRIM;
937 mp->strhdr = (Shdr *)
938 (mp->shdrs + mp->symhdr->sh_link * mp->hdr.e_shentsize);
939 mp->strings = (char *)mp->strhdr->sh_addr;
940 mp->hashsize = kobj_gethashsize(mp->nsyms);
942 mp->symsize = mp->symhdr->sh_size + mp->strhdr->sh_size + sizeof (int) +
943 (mp->hashsize + mp->nsyms) * sizeof (symid_t);
945 mp->chains = kobj_zalloc(mp->nsyms * sizeof (symid_t), KM_WAIT);
946 mp->buckets = kobj_zalloc(mp->hashsize * sizeof (symid_t), KM_WAIT);
948 mp->bss = bootaux[BA_BSS].ba_val;
949 mp->bss_align = 0; /* pre-aligned during allocation */
950 mp->bss_size = (uintptr_t)_edata - mp->bss;
951 mp->text_size = _etext - mp->text;
952 mp->data_size = _edata - mp->data;
953 mp->filename = cp->mod_filename;
954 cp->mod_text = mp->text;
955 cp->mod_text_size = mp->text_size;
961 kmp->text_size = (size_t)(mp->text - kmp->text);
962 kmp->data_size = (size_t)(mp->data - kmp->data);
967 _kobj_printf(ops, "krtld: file=%s\n", mp->filename);
968 _kobj_printf(ops, "\ttext:0x%p", mp->text);
969 _kobj_printf(ops, " size: 0x%x\n", mp->text_size);
970 _kobj_printf(ops, "\tdata:0x%p", mp->data);
971 _kobj_printf(ops, " dsize: 0x%x\n", mp->data_size);
978 for (i = 0; i < mp->nsyms; i++) {
979 sp = (Sym *)(mp->symtbl + i * mp->symhdr->sh_entsize);
987 sym_insert(mp, mp->strings + sp->st_name, i);
1139 struct module *mp;
1145 mp = mod(lp);
1151 if (mp->flags & (KOBJ_EXEC|KOBJ_INTERP))
1154 if (do_common(mp) < 0)
1162 mp = mod(lp);
1164 if (do_symbols(mp, 0) < 0)
1172 mp = mod(lp);
1174 if (mp->flags & KOBJ_EXEC) {
1205 "module %s\n", mp->filename);
1211 "KOBJ_EXEC\n", mp->filename);
1213 if (do_relocate(mp, rela, shtype, relasz/relaent,
1214 relaent, (Addr)mp->text) < 0)
1217 if (do_relocations(mp) < 0)
1221 kobj_sync_instruction_memory(mp->text, mp->text_size);
1225 mp = mod(lp);
1233 if (mp->flags & KOBJ_EXEC) {
1237 file = kobj_open_file(mp->filename);
1240 if (kobj_read_file(file, (char *)&mp->hdr,
1241 sizeof (mp->hdr), 0) < 0)
1243 n = mp->hdr.e_shentsize * mp->hdr.e_shnum;
1244 mp->shdrs = kobj_alloc(n, KM_WAIT);
1245 if (kobj_read_file(file, mp->shdrs, n,
1246 mp->hdr.e_shoff) < 0)
1248 if (get_syms(mp, file) < 0)
1250 if (get_ctf(mp, file) < 0)
1253 mp->flags |= KOBJ_RELOCATED;
1255 } else if (mp->flags & KOBJ_INTERP) {
1259 * The interpreter path fragment in mp->filename
1263 file = kobj_open_path(mp->filename, 1, 0);
1266 if (get_ctf(mp, file) < 0)
1269 mp->flags |= KOBJ_RELOCATED;
1295 load_primary(struct module *mp, int lmid)
1302 if ((p = mp->depends_on) == NULL)
1345 add_dependent(mp, dmp);
1382 struct module *mp;
1400 if ((mp = mctl->mod_mp) == NULL)
1403 mp->flags |= KOBJ_PRIM;
1405 if (load_primary(mp, KOBJ_LM_DEBUGGER) < 0)
1437 depends_on(struct module *mp)
1446 if ((sp = lookup_one(mp, "_depends_on")) == NULL)
1461 mp->filename);
1469 if (kobj_addrcheck(mp, q) || q[sp->st_size - 1] != '\0') {
1471 mp->filename);
1484 struct module *mp;
1485 mp = (struct module *)xmp;
1487 modinfo->mi_base = mp->text;
1488 modinfo->mi_size = mp->text_size + mp->data_size;
1500 kobj_export_ksyms(struct module *mp)
1502 Sym *esp = (Sym *)(mp->symtbl + mp->symhdr->sh_size);
1508 size_t symsize = mp->symhdr->sh_entsize;
1516 bcopy(mp, omp, sizeof (struct module));
1534 mp->nsyms = nsyms;
1535 mp->hashsize = kobj_gethashsize(mp->nsyms);
1548 mp->symsize = (2 * sizeof (Shdr)) + (nsyms * symsize) +
1549 (mp->hashsize + mp->nsyms) * sizeof (symid_t) + strsize;
1551 if (mp->flags & KOBJ_NOKSYMS) {
1552 mp->symspace = kobj_alloc(mp->symsize, KM_WAIT);
1554 mp->symspace = vmem_alloc(ksyms_arena, mp->symsize,
1557 bzero(mp->symspace, mp->symsize);
1562 mp->shdrs = mp->symspace;
1563 mp->symhdr = (Shdr *)mp->shdrs;
1564 mp->strhdr = (Shdr *)(mp->symhdr + 1);
1565 mp->symtbl = (char *)(mp->strhdr + 1);
1566 mp->buckets = (symid_t *)(mp->symtbl + (nsyms * symsize));
1567 mp->chains = (symid_t *)(mp->buckets + mp->hashsize);
1568 mp->strings = (char *)(mp->chains + nsyms);
1573 mp->hdr.e_shnum = 2;
1574 mp->symtbl_section = 0;
1576 mp->symhdr->sh_type = SHT_SYMTAB;
1577 mp->symhdr->sh_addr = (Addr)mp->symtbl;
1578 mp->symhdr->sh_size = nsyms * symsize;
1579 mp->symhdr->sh_link = 1;
1580 mp->symhdr->sh_info = locals;
1581 mp->symhdr->sh_addralign = sizeof (Addr);
1582 mp->symhdr->sh_entsize = symsize;
1584 mp->strhdr->sh_type = SHT_STRTAB;
1585 mp->strhdr->sh_addr = (Addr)mp->strings;
1586 mp->strhdr->sh_size = strsize;
1587 mp->strhdr->sh_addralign = 1;
1599 sp = (Sym *)(mp->symtbl + symsize * nsyms);
1601 bcopy(name, mp->strings + strsize, namelen);
1603 sym_insert(mp, name, nsyms);
1613 if (!(mp->flags & KOBJ_PRIM)) {
1634 if (!(mp->flags & KOBJ_PRIM))
1640 kobj_export_ctf(struct module *mp)
1642 char *data = mp->ctfdata;
1643 size_t size = mp->ctfsize;
1647 mp->ctfdata = NULL;
1648 mp->ctfsize = 0;
1650 mp->ctfdata = vmem_alloc(ctf_arena, size,
1652 bcopy(data, mp->ctfdata, size);
1655 if (!(mp->flags & KOBJ_PRIM))
1661 kobj_export_module(struct module *mp)
1663 kobj_export_ksyms(mp);
1664 kobj_export_ctf(mp);
1666 mp->flags |= KOBJ_EXPORTED;
1670 process_dynamic(struct module *mp, char *dyndata, char *strdata)
1723 mp->flags |= KOBJ_IGNMULDEF;
1725 mp->flags |= KOBJ_NOKSYMS;
1744 mp->depends_on = depstr;
1751 do_dynamic(struct module *mp, struct _buf *file)
1759 for (dshp = NULL, shn = 1; shn < mp->hdr.e_shnum; shn++) {
1760 shp = (Shdr *)(mp->shdrs + shn * mp->hdr.e_shentsize);
1765 mp->filename);
1780 if (dshp->sh_link > mp->hdr.e_shnum) {
1781 _kobj_printf(ops, "krtld: get_dynamic: %s, ", mp->filename);
1785 dstrp = (Shdr *)(mp->shdrs + dshp->sh_link * mp->hdr.e_shentsize);
1788 _kobj_printf(ops, "krtld: get_dynamic: %s, ", mp->filename);
1798 _kobj_printf(ops, "krtld: get_dynamic: %s, ", mp->filename);
1808 _kobj_printf(ops, "krtld: get_dynamic: %s, ", mp->filename);
1818 rc = process_dynamic(mp, dyndata, dstrdata);
1827 kobj_set_ctf(struct module *mp, caddr_t data, size_t size)
1830 if (mp->ctfdata != NULL) {
1831 if (vmem_contains(ctf_arena, mp->ctfdata,
1832 mp->ctfsize)) {
1833 vmem_free(ctf_arena, mp->ctfdata, mp->ctfsize);
1835 kobj_free(mp->ctfdata, mp->ctfsize);
1846 mp->ctfdata = NULL;
1848 mp->ctfsize = size;
1849 mp->ctfdata = data;
1861 struct module *mp = NULL;
1866 mp = kobj_zalloc(sizeof (struct module), KM_WAIT);
1875 mp->flags |= KOBJ_NOKSYMS;
1883 kobj_free(mp, sizeof (*mp));
1897 mp->filename = kobj_alloc(strlen(file->_name) + 1, KM_WAIT);
1898 (void) strcpy(mp->filename, file->_name);
1900 if (kobj_read_file(file, (char *)&mp->hdr, sizeof (mp->hdr), 0) < 0) {
1903 kobj_free(mp->filename, strlen(file->_name) + 1);
1904 kobj_free(mp, sizeof (*mp));
1908 if (mp->hdr.e_ident[i] != ELFMAG[i]) {
1912 kobj_free(mp->filename, strlen(file->_name) + 1);
1913 kobj_free(mp, sizeof (*mp));
1923 if (!elf_mach_ok(&mp->hdr)) {
1927 kobj_free(mp->filename, strlen(file->_name) + 1);
1928 kobj_free(mp, sizeof (*mp));
1948 if (mp->hdr.e_type != ET_REL) {
1952 kobj_free(mp->filename, strlen(file->_name) + 1);
1953 kobj_free(mp, sizeof (*mp));
1957 n = mp->hdr.e_shentsize * mp->hdr.e_shnum;
1958 mp->shdrs = kobj_alloc(n, KM_WAIT);
1960 if (kobj_read_file(file, mp->shdrs, n, mp->hdr.e_shoff) < 0) {
1963 kobj_free(mp->shdrs, n);
1964 kobj_free(mp->filename, strlen(file->_name) + 1);
1965 kobj_free(mp, sizeof (*mp));
1970 module_assign(modp, mp);
1973 if (get_progbits(mp, file) < 0) {
1978 if (do_dynamic(mp, file) < 0) {
1984 modp->mod_text = mp->text;
1985 modp->mod_text_size = mp->text_size;
1988 if (get_syms(mp, file) < 0) {
1998 if (mp->depends_on == NULL)
1999 mp->depends_on = depends_on(mp);
2001 if (get_ctf(mp, file) < 0) {
2007 if (!(mp->flags & KOBJ_PRIM))
2008 get_signature(mp, file);
2012 _kobj_printf(ops, "krtld: file=%s\n", mp->filename);
2013 _kobj_printf(ops, "\ttext:0x%p", mp->text);
2014 _kobj_printf(ops, " size: 0x%x\n", mp->text_size);
2015 _kobj_printf(ops, "\tdata:0x%p", mp->data);
2016 _kobj_printf(ops, " dsize: 0x%x\n", mp->data_size);
2036 if ((dcrval = do_common(mp)) < 0) {
2063 if (do_relocations(mp) < 0) {
2069 if (mp->destination) {
2070 off_t off = (uintptr_t)mp->destination & PAGEOFFSET;
2071 caddr_t base = (caddr_t)mp->destination - off;
2072 size_t size = P2ROUNDUP(mp->text_size + off, PAGESIZE);
2079 kobj_sync_instruction_memory(mp->text, mp->text_size);
2080 kobj_export_module(mp);
2099 struct module *mp;
2104 mp = modp->mod_mp;
2105 mp->flags |= KOBJ_PRIM;
2108 if (mp->depends_on != NULL && (dep =
2109 mod_already_loaded(mp->depends_on)) == NULL) {
2119 add_dependent(mp, dep->mod_mp);
2125 if (do_common(mp) < 0 || do_symbols(mp, 0) < 0 ||
2126 do_relocations(mp) < 0) {
2140 module_assign(struct modctl *cp, struct module *mp)
2143 cp->mod_mp = mp;
2147 cp->mod_mp = mp;
2155 struct module *mp = modp->mod_mp;
2157 if ((_moddebug & MODDEBUG_KEEPTEXT) && mp) {
2158 _kobj_printf(ops, "text for %s ", mp->filename);
2159 _kobj_printf(ops, "was at %p\n", mp->text);
2160 mp->text = NULL; /* don't actually free it */
2174 free_module_data(mp);
2178 free_module_data(struct module *mp)
2183 lp = mp->head;
2191 if (mp->symspace) {
2192 if (vmem_contains(ksyms_arena, mp->symspace, mp->symsize)) {
2193 vmem_free(ksyms_arena, mp->symspace, mp->symsize);
2196 if (mp->flags & KOBJ_NOKSYMS)
2198 kobj_free(mp->symspace, mp->symsize);
2203 if (mp->ctfdata) {
2204 if (vmem_contains(ctf_arena, mp->ctfdata, mp->ctfsize))
2205 vmem_free(ctf_arena, mp->ctfdata, mp->ctfsize);
2207 kobj_free(mp->ctfdata, mp->ctfsize);
2210 if (mp->sigdata)
2211 kobj_free(mp->sigdata, mp->sigsize);
2217 if ((ksyms_exported == 0) && (mp->shdrs != NULL)) {
2221 for (shn = 1; shn < mp->hdr.e_shnum; shn++) {
2222 shp = (Shdr *)(mp->shdrs + shn * mp->hdr.e_shentsize);
2233 if (!(mp->flags & KOBJ_PRIM)) {
2234 kobj_free(mp->shdrs,
2235 mp->hdr.e_shentsize * mp->hdr.e_shnum);
2239 if (mp->bss)
2240 vmem_free(data_arena, (void *)mp->bss, mp->bss_size);
2242 if (mp->fbt_tab)
2243 kobj_texthole_free(mp->fbt_tab, mp->fbt_size);
2245 if (mp->textwin_base)
2246 kobj_textwin_free(mp);
2248 if (mp->sdt_probes != NULL) {
2249 sdt_probedesc_t *sdp = mp->sdt_probes, *next;
2259 if (mp->sdt_tab)
2260 kobj_texthole_free(mp->sdt_tab, mp->sdt_size);
2261 if (mp->text)
2262 vmem_free(text_arena, mp->text, mp->text_size);
2263 if (mp->data)
2264 vmem_free(data_arena, mp->data, mp->data_size);
2265 if (mp->depends_on)
2266 kobj_free(mp->depends_on, strlen(mp->depends_on)+1);
2267 if (mp->filename)
2268 kobj_free(mp->filename, strlen(mp->filename)+1);
2270 kobj_free((char *)mp, sizeof (*mp));
2274 get_progbits(struct module *mp, struct _buf *file)
2291 if (get_progbits_size(mp, tp, dp, sdp) < 0)
2294 mp->text_size = tp->size;
2295 mp->data_size = dp->size;
2303 mp->text = kobj_segbrk(&_etext, mp->text_size,
2309 if (mp->text == NULL) {
2310 mp->text = kobj_segbrk(&_edata, mp->text_size,
2314 mp->data = kobj_segbrk(&_edata, mp->data_size, dp->align, 0);
2316 if (mp->text == NULL || mp->data == NULL)
2340 mp->text_size += tp->align;
2341 mp->data_size += dp->align;
2343 mp->text = kobj_text_alloc(text_arena, mp->text_size);
2351 mp->text, mp->text_size)) {
2352 off_t off = (uintptr_t)mp->text & PAGEOFFSET;
2353 size_t size = P2ROUNDUP(mp->text_size + off, PAGESIZE);
2355 caddr_t orig = mp->text - off;
2376 if (mp->data_size)
2377 mp->data = vmem_alloc(data_arena, mp->data_size,
2380 textptr = (uintptr_t)mp->text;
2382 mp->destination = dest;
2388 text = ALIGN((uintptr_t)mp->text, tp->align);
2389 data = ALIGN((uintptr_t)mp->data, dp->align);
2392 for (shn = 1; shn < mp->hdr.e_shnum; shn++) {
2393 shp = (Shdr *)(mp->shdrs + shn * mp->hdr.e_shentsize);
2443 kobj_free(mp->shdrs, mp->hdr.e_shentsize * mp->hdr.e_shnum);
2444 mp->shdrs = NULL;
2473 get_syms(struct module *mp, struct _buf *file)
2485 for (shn = 1; shn < mp->hdr.e_shnum; shn++) {
2486 shp = (Shdr *)(mp->shdrs + shn * mp->hdr.e_shentsize);
2489 mp->symtbl_section = shn;
2490 mp->symhdr = shp;
2509 mp->filename);
2525 if (mp->flags & KOBJ_EXEC)
2528 mp->filename);
2536 if ((mp->symhdr == 0) || (mp->symhdr->sh_link >= mp->hdr.e_shnum))
2538 mp->strhdr = (Shdr *)
2539 (mp->shdrs + mp->symhdr->sh_link * mp->hdr.e_shentsize);
2541 mp->nsyms = mp->symhdr->sh_size / mp->symhdr->sh_entsize;
2542 mp->hashsize = kobj_gethashsize(mp->nsyms);
2547 mp->symsize = mp->symhdr->sh_size +
2548 (mp->hashsize + mp->nsyms) * sizeof (symid_t) + mp->strhdr->sh_size;
2549 mp->symspace = kobj_zalloc(mp->symsize, KM_WAIT|KM_SCRATCH);
2551 mp->symtbl = mp->symspace;
2552 mp->buckets = (symid_t *)(mp->symtbl + mp->symhdr->sh_size);
2553 mp->chains = mp->buckets + mp->hashsize;
2554 mp->strings = (char *)(mp->chains + mp->nsyms);
2556 if (kobj_read_file(file, mp->symtbl,
2557 mp->symhdr->sh_size, mp->symhdr->sh_offset) < 0 ||
2558 kobj_read_file(file, mp->strings,
2559 mp->strhdr->sh_size, mp->strhdr->sh_offset) < 0)
2567 for (i = 1; i < mp->nsyms; i++) {
2568 sp = (Sym *)(mp->symtbl + i * mp->symhdr->sh_entsize);
2570 if (sp->st_shndx >= mp->hdr.e_shnum) {
2577 (mp->shdrs +
2578 sp->st_shndx * mp->hdr.e_shentsize);
2579 if (!(mp->flags & KOBJ_EXEC))
2585 if (sp->st_name >= mp->strhdr->sh_size)
2588 symname = mp->strings + sp->st_name;
2590 if (!(mp->flags & KOBJ_EXEC) &&
2592 ksp = kobj_lookup_all(mp, symname, 0);
2610 !(mp->flags & KOBJ_IGNMULDEF)) {
2619 sym_insert(mp, symname, i);
2626 get_ctf(struct module *mp, struct _buf *file)
2636 if (mp->hdr.e_shstrndx >= mp->hdr.e_shnum) {
2638 mp->filename);
2640 mp->hdr.e_shstrndx);
2644 shp = (Shdr *)(mp->shdrs + mp->hdr.e_shstrndx * mp->hdr.e_shentsize);
2650 mp->filename);
2652 mp->hdr.e_shstrndx);
2657 for (i = 0; i < mp->hdr.e_shnum; i++) {
2658 shp = (Shdr *)(mp->shdrs + i * mp->hdr.e_shentsize);
2667 "reading .SUNW_ctf data\n", mp->filename);
2673 mp->ctfdata = ctfdata;
2674 mp->ctfsize = shp->sh_size;
2692 crypto_es_hash(struct module *mp, char *hash, char *shstrtab)
2700 for (shn = 1; shn < mp->hdr.e_shnum; shn++) {
2701 shp = (Shdr *)(mp->shdrs + shn * mp->hdr.e_shentsize);
2733 get_signature(struct module *mp, struct _buf *file)
2740 if (mp->hdr.e_shstrndx >= mp->hdr.e_shnum) {
2742 mp->filename);
2744 mp->hdr.e_shstrndx);
2748 shp = (Shdr *)(mp->shdrs + mp->hdr.e_shstrndx * mp->hdr.e_shentsize);
2754 mp->filename);
2756 mp->hdr.e_shstrndx);
2761 for (i = 0; i < mp->hdr.e_shnum; i++) {
2762 shp = (Shdr *)(mp->shdrs + i * mp->hdr.e_shentsize);
2774 mp->filename);
2789 mp->sigdata = sigdata;
2790 mp->sigsize = sigsize;
2796 crypto_es_hash(mp, sigdata + shp->sh_size, shstrtab);
2803 add_dependent(struct module *mp, struct module *dep)
2807 for (lp = mp->head; lp; lp = lp->next) {
2808 if (lp->mp == dep)
2815 lp->mp = dep;
2817 if (mp->tail)
2818 mp->tail->next = lp;
2820 mp->head = lp;
2821 mp->tail = lp;
2828 struct module *mp;
2834 mp = modp->mod_mp;
2836 if ((p = mp->depends_on) == NULL)
2909 add_dependent(mp, req->mod_mp);
2934 do_common(struct module *mp)
2943 if ((err = do_symbols(mp, 0)) < 0)
2949 mp->bss_size += mp->bss_align;
2950 if (mp->bss_size) {
2952 mp->bss = (uintptr_t)kobj_segbrk(&_edata, mp->bss_size,
2955 mp->bss = (uintptr_t)vmem_alloc(data_arena,
2956 mp->bss_size, VM_SLEEP | VM_BESTFIT);
2957 bzero((void *)mp->bss, mp->bss_size);
2959 if ((err = do_symbols(mp, ALIGN(mp->bss, mp->bss_align))) < 0)
2966 do_symbols(struct module *mp, Elf64_Addr bss_base)
2980 if (mp->flags & KOBJ_RESOLVED)
2988 for (i = 1; i < mp->nsyms; i++) {
2989 sp = (Sym *)(mp->symtbl + mp->symhdr->sh_entsize * i);
2994 name = mp->strings + sp->st_name;
3004 mp->filename);
3017 mp->filename);
3025 if ((sp1 = kobj_lookup_all(mp, name, 0)) != NULL) {
3044 if (!(mp->flags & KOBJ_PRIM) &&
3047 mp->filename);
3083 if (assign == 0 && mp->bss == NULL) {
3084 mp->bss_align = bss_align;
3085 mp->bss_size = bss_ptr;
3087 mp->flags |= KOBJ_RESOLVED;
3115 struct module *mp;
3127 mp = (struct module *)modp->mod_mp;
3128 if (mp && !(mp->flags & KOBJ_PRIM) && modp->mod_loaded &&
3129 (sp = lookup_one(mp, name))) {
3146 struct module *mp;
3152 mp = mod(lp);
3154 if ((name = kobj_searchsym(mp, value, offset)) != NULL)
3161 mp = (struct module *)modp->mod_mp;
3162 if (mp && !(mp->flags & KOBJ_PRIM) && modp->mod_loaded &&
3163 (name = kobj_searchsym(mp, value, offset)))
3173 kobj_getelfsym(char *name, void *mp, int *size)
3177 if (mp == NULL)
3180 sp = lookup_one(mp, name);
3203 kobj_searchsym(struct module *mp, uintptr_t value, ulong_t *offset)
3215 if (kobj_addrcheck(mp, (void *)value) != 0)
3218 strtabptr = mp->strings;
3219 symtabptr = (Sym *)mp->symtbl;
3225 symnum < mp->nsyms; symnum++, sym = (Sym *)
3226 ((uintptr_t)sym + mp->symhdr->sh_entsize)) {
3273 kobj_lookup_all(struct module *mp, char *name, int include_self)
3280 if (include_self && (sp = lookup_one(mp, name)) != NULL)
3283 for (mlp = mp->head; mlp; mlp = mlp->next) {
3284 if ((sp = lookup_one(mlp->mp, name)) != NULL &&
3295 if (mmp == NULL || mp == mmp)
3309 struct module *mp;
3316 mp = mod(lp);
3318 if (mp == NULL)
3321 if ((sp = lookup_one(mp, name)) != NULL)
3328 lookup_one(struct module *mp, const char *name)
3334 for (ip = &mp->buckets[kobj_hash_name(name) % mp->hashsize]; *ip;
3335 ip = &mp->chains[*ip]) {
3336 sp = (Sym *)(mp->symtbl +
3337 mp->symhdr->sh_entsize * *ip);
3338 name1 = mp->strings + sp->st_name;
3353 sym_lookup(struct module *mp, Sym *ksp)
3355 char *name = mp->strings + ksp->st_name;
3359 for (ip = &mp->buckets[kobj_hash_name(name) % mp->hashsize]; *ip;
3360 ip = &mp->chains[*ip]) {
3361 sp = (Sym *)(mp->symtbl + mp->symhdr->sh_entsize * *ip);
3369 sym_insert(struct module *mp, char *name, symid_t index)
3377 if (lastmp != mp) {
3380 mp->filename);
3384 lastmp = mp;
3386 sp = (Sym *)(mp->symtbl +
3387 index * mp->symhdr->sh_entsize);
3394 for (ip = &mp->buckets[kobj_hash_name(name) % mp->hashsize]; *ip;
3395 ip = &mp->chains[*ip]) {
4270 kobj_textwin_alloc(struct module *mp)
4274 if (mp->textwin != NULL)
4284 if (!vmem_contains(heaptext_arena, mp->text, mp->text_size)) {
4285 uintptr_t text = (uintptr_t)mp->text;
4286 uintptr_t size = (uintptr_t)mp->text_size;
4292 va = mp->textwin_base = vmem_alloc(heap_arena, sz, VM_SLEEP);
4302 mp->textwin = mp->textwin_base + (text & PAGEOFFSET);
4304 mp->textwin = mp->text;
4309 kobj_textwin_free(struct module *mp)
4311 uintptr_t text = (uintptr_t)mp->text;
4312 uintptr_t tsize = (uintptr_t)mp->text_size;
4316 mp->textwin = NULL;
4318 if (mp->textwin_base == NULL)
4321 hat_unload(kas.a_hat, mp->textwin_base, size, HAT_UNLOAD_UNLOCK);
4322 vmem_free(heap_arena, mp->textwin_base, size);
4323 mp->textwin_base = NULL;
4474 struct module *mp = mod->mod_mp;
4476 if (!(mp->flags & KOBJ_TNF_PROBE))
4480 if (kobj_addrcheck(mp, (char *)*p) == 0)
4486 if (kobj_addrcheck(mp, (char *)*q) == 0)