Lines Matching defs:dmp

51 dt_module_symhash_insert(dt_module_t *dmp, const char *name, uint_t id)
53 dt_sym_t *dsp = &dmp->dm_symchains[dmp->dm_symfree];
56 assert(dmp->dm_symfree < dmp->dm_nsymelems + 1);
59 h = dt_strtab_hash(name, NULL) % dmp->dm_nsymbuckets;
60 dsp->ds_next = dmp->dm_symbuckets[h];
61 dmp->dm_symbuckets[h] = dmp->dm_symfree++;
65 dt_module_syminit32(dt_module_t *dmp)
71 const Elf32_Sym *sym = dmp->dm_symtab.cts_data;
72 const char *base = dmp->dm_strtab.cts_data;
73 size_t ss_size = dmp->dm_strtab.cts_size;
74 uint_t i, n = dmp->dm_nsymelems;
91 dt_module_symhash_insert(dmp, name, i);
98 dt_module_syminit64(dt_module_t *dmp)
104 const Elf64_Sym *sym = dmp->dm_symtab.cts_data;
105 const char *base = dmp->dm_strtab.cts_data;
106 size_t ss_size = dmp->dm_strtab.cts_size;
107 uint_t i, n = dmp->dm_nsymelems;
124 dt_module_symhash_insert(dmp, name, i);
189 dt_module_symsort32(dt_module_t *dmp)
191 Elf32_Sym *symtab = (Elf32_Sym *)dmp->dm_symtab.cts_data;
192 Elf32_Sym **sympp = (Elf32_Sym **)dmp->dm_asmap;
193 const dt_sym_t *dsp = dmp->dm_symchains + 1;
194 uint_t i, n = dmp->dm_symfree;
203 dmp->dm_aslen = (uint_t)(sympp - (Elf32_Sym **)dmp->dm_asmap);
204 assert(dmp->dm_aslen <= dmp->dm_asrsv);
206 dt_module_strtab = dmp->dm_strtab.cts_data;
207 qsort(dmp->dm_asmap, dmp->dm_aslen,
213 dt_module_symsort64(dt_module_t *dmp)
215 Elf64_Sym *symtab = (Elf64_Sym *)dmp->dm_symtab.cts_data;
216 Elf64_Sym **sympp = (Elf64_Sym **)dmp->dm_asmap;
217 const dt_sym_t *dsp = dmp->dm_symchains + 1;
218 uint_t i, n = dmp->dm_symfree;
227 dmp->dm_aslen = (uint_t)(sympp - (Elf64_Sym **)dmp->dm_asmap);
228 assert(dmp->dm_aslen <= dmp->dm_asrsv);
230 dt_module_strtab = dmp->dm_strtab.cts_data;
231 qsort(dmp->dm_asmap, dmp->dm_aslen,
261 dt_module_symname32(dt_module_t *dmp, const char *name,
264 const Elf32_Sym *symtab = dmp->dm_symtab.cts_data;
265 const char *strtab = dmp->dm_strtab.cts_data;
271 if (dmp->dm_nsymelems == 0)
274 h = dt_strtab_hash(name, NULL) % dmp->dm_nsymbuckets;
276 for (i = dmp->dm_symbuckets[h]; i != 0; i = dsp->ds_next) {
277 dsp = &dmp->dm_symchains[i];
291 dt_module_symname64(dt_module_t *dmp, const char *name,
294 const Elf64_Sym *symtab = dmp->dm_symtab.cts_data;
295 const char *strtab = dmp->dm_strtab.cts_data;
301 if (dmp->dm_nsymelems == 0)
304 h = dt_strtab_hash(name, NULL) % dmp->dm_nsymbuckets;
306 for (i = dmp->dm_symbuckets[h]; i != 0; i = dsp->ds_next) {
307 dsp = &dmp->dm_symchains[i];
321 dt_module_symaddr32(dt_module_t *dmp, GElf_Addr addr,
324 const Elf32_Sym **asmap = (const Elf32_Sym **)dmp->dm_asmap;
325 const Elf32_Sym *symtab = dmp->dm_symtab.cts_data;
328 uint_t i, mid, lo = 0, hi = dmp->dm_aslen - 1;
331 if (dmp->dm_aslen == 0)
363 dt_module_symaddr64(dt_module_t *dmp, GElf_Addr addr,
366 const Elf64_Sym **asmap = (const Elf64_Sym **)dmp->dm_asmap;
367 const Elf64_Sym *symtab = dmp->dm_symtab.cts_data;
370 uint_t i, mid, lo = 0, hi = dmp->dm_aslen - 1;
373 if (dmp->dm_aslen == 0)
422 dt_module_t *dmp;
424 for (dmp = dtp->dt_mods[h]; dmp != NULL; dmp = dmp->dm_next) {
425 if (strcmp(dmp->dm_name, name) == 0)
426 return (dmp);
429 if ((dmp = malloc(sizeof (dt_module_t))) == NULL)
432 bzero(dmp, sizeof (dt_module_t));
433 (void) strlcpy(dmp->dm_name, name, sizeof (dmp->dm_name));
434 dt_list_append(&dtp->dt_modlist, dmp);
435 dmp->dm_next = dtp->dt_mods[h];
436 dtp->dt_mods[h] = dmp;
440 dmp->dm_ops = &dt_modops_64;
442 dmp->dm_ops = &dt_modops_32;
444 return (dmp);
451 dt_module_t *dmp;
453 for (dmp = dtp->dt_mods[h]; dmp != NULL; dmp = dmp->dm_next) {
454 if (strcmp(dmp->dm_name, name) == 0)
455 return (dmp);
469 dt_module_load_sect(dtrace_hdl_t *dtp, dt_module_t *dmp, ctf_sect_t *ctsp)
477 if (elf_getshdrstrndx(dmp->dm_elf, &shstrs) == -1)
480 for (sp = NULL; (sp = elf_nextscn(dmp->dm_elf, sp)) != NULL; ) {
482 (s = elf_strptr(dmp->dm_elf, shstrs, sh.sh_name)) == NULL)
503 dmp->dm_name, ctsp->cts_name, (ulong_t)ctsp->cts_size);
509 dt_module_load(dtrace_hdl_t *dtp, dt_module_t *dmp)
511 if (dmp->dm_flags & DT_DM_LOADED)
514 dmp->dm_ctdata.cts_name = ".SUNW_ctf";
515 dmp->dm_ctdata.cts_type = SHT_PROGBITS;
516 dmp->dm_ctdata.cts_flags = 0;
517 dmp->dm_ctdata.cts_data = NULL;
518 dmp->dm_ctdata.cts_size = 0;
519 dmp->dm_ctdata.cts_entsize = 0;
520 dmp->dm_ctdata.cts_offset = 0;
522 dmp->dm_symtab.cts_name = ".symtab";
523 dmp->dm_symtab.cts_type = SHT_SYMTAB;
524 dmp->dm_symtab.cts_flags = 0;
525 dmp->dm_symtab.cts_data = NULL;
526 dmp->dm_symtab.cts_size = 0;
527 dmp->dm_symtab.cts_entsize = dmp->dm_ops == &dt_modops_64 ?
529 dmp->dm_symtab.cts_offset = 0;
531 dmp->dm_strtab.cts_name = ".strtab";
532 dmp->dm_strtab.cts_type = SHT_STRTAB;
533 dmp->dm_strtab.cts_flags = 0;
534 dmp->dm_strtab.cts_data = NULL;
535 dmp->dm_strtab.cts_size = 0;
536 dmp->dm_strtab.cts_entsize = 0;
537 dmp->dm_strtab.cts_offset = 0;
545 if (dt_module_load_sect(dtp, dmp, &dmp->dm_ctdata) == -1 ||
546 dt_module_load_sect(dtp, dmp, &dmp->dm_symtab) == -1 ||
547 dt_module_load_sect(dtp, dmp, &dmp->dm_strtab) == -1) {
548 dt_module_unload(dtp, dmp);
558 dmp->dm_nsymelems =
559 dmp->dm_symtab.cts_size / dmp->dm_symtab.cts_entsize;
561 dmp->dm_nsymbuckets = _dtrace_strbuckets;
562 dmp->dm_symfree = 1; /* first free element is index 1 */
564 dmp->dm_symbuckets = malloc(sizeof (uint_t) * dmp->dm_nsymbuckets);
565 dmp->dm_symchains = malloc(sizeof (dt_sym_t) * dmp->dm_nsymelems + 1);
567 if (dmp->dm_symbuckets == NULL || dmp->dm_symchains == NULL) {
568 dt_module_unload(dtp, dmp);
572 bzero(dmp->dm_symbuckets, sizeof (uint_t) * dmp->dm_nsymbuckets);
573 bzero(dmp->dm_symchains, sizeof (dt_sym_t) * dmp->dm_nsymelems + 1);
580 dmp->dm_asrsv = dmp->dm_ops->do_syminit(dmp);
583 dmp->dm_name, dmp->dm_symtab.cts_name, dmp->dm_symfree - 1);
585 if ((dmp->dm_asmap = malloc(sizeof (void *) * dmp->dm_asrsv)) == NULL) {
586 dt_module_unload(dtp, dmp);
590 dmp->dm_ops->do_symsort(dmp);
593 dmp->dm_name, dmp->dm_symtab.cts_name, dmp->dm_aslen);
595 dmp->dm_flags |= DT_DM_LOADED;
600 dt_module_getctf(dtrace_hdl_t *dtp, dt_module_t *dmp)
607 if (dmp->dm_ctfp != NULL || dt_module_load(dtp, dmp) != 0)
608 return (dmp->dm_ctfp);
610 if (dmp->dm_ops == &dt_modops_64)
626 if (dmp->dm_ctdata.cts_size == 0) {
631 dmp->dm_ctfp = ctf_bufopen(&dmp->dm_ctdata,
632 &dmp->dm_symtab, &dmp->dm_strtab, &dtp->dt_ctferr);
634 if (dmp->dm_ctfp == NULL) {
639 (void) ctf_setmodel(dmp->dm_ctfp, model);
640 ctf_setspecific(dmp->dm_ctfp, dmp);
642 if ((parent = ctf_parent_name(dmp->dm_ctfp)) != NULL) {
650 if (ctf_import(dmp->dm_ctfp, pfp) == CTF_ERR) {
651 dtp->dt_ctferr = ctf_errno(dmp->dm_ctfp);
658 dmp->dm_name, (void *)dmp->dm_ctfp);
660 return (dmp->dm_ctfp);
663 ctf_close(dmp->dm_ctfp);
664 dmp->dm_ctfp = NULL;
670 dt_module_unload(dtrace_hdl_t *dtp, dt_module_t *dmp)
672 ctf_close(dmp->dm_ctfp);
673 dmp->dm_ctfp = NULL;
675 bzero(&dmp->dm_ctdata, sizeof (ctf_sect_t));
676 bzero(&dmp->dm_symtab, sizeof (ctf_sect_t));
677 bzero(&dmp->dm_strtab, sizeof (ctf_sect_t));
679 if (dmp->dm_symbuckets != NULL) {
680 free(dmp->dm_symbuckets);
681 dmp->dm_symbuckets = NULL;
684 if (dmp->dm_symchains != NULL) {
685 free(dmp->dm_symchains);
686 dmp->dm_symchains = NULL;
689 if (dmp->dm_asmap != NULL) {
690 free(dmp->dm_asmap);
691 dmp->dm_asmap = NULL;
694 dmp->dm_symfree = 0;
695 dmp->dm_nsymbuckets = 0;
696 dmp->dm_nsymelems = 0;
697 dmp->dm_asrsv = 0;
698 dmp->dm_aslen = 0;
700 dmp->dm_text_va = NULL;
701 dmp->dm_text_size = 0;
702 dmp->dm_data_va = NULL;
703 dmp->dm_data_size = 0;
704 dmp->dm_bss_va = NULL;
705 dmp->dm_bss_size = 0;
707 if (dmp->dm_extern != NULL) {
708 dt_idhash_destroy(dmp->dm_extern);
709 dmp->dm_extern = NULL;
712 (void) elf_end(dmp->dm_elf);
713 dmp->dm_elf = NULL;
715 dmp->dm_flags &= ~DT_DM_LOADED;
719 dt_module_destroy(dtrace_hdl_t *dtp, dt_module_t *dmp)
721 uint_t h = dt_strtab_hash(dmp->dm_name, NULL) % dtp->dt_modbuckets;
724 dt_list_delete(&dtp->dt_modlist, dmp);
733 while (*dmpp != dmp) {
738 *dmpp = dmp->dm_next;
740 dt_module_unload(dtp, dmp);
741 free(dmp);
751 dt_module_extern(dtrace_hdl_t *dtp, dt_module_t *dmp,
758 if (dmp->dm_extern == NULL && (dmp->dm_extern = dt_idhash_create(
759 "extern", NULL, dmp->dm_nsymelems, UINT_MAX)) == NULL) {
764 if (dt_idhash_nextid(dmp->dm_extern, &id) == -1) {
774 idp = dt_idhash_insert(dmp->dm_extern, name, DT_IDENT_SYMBOL, 0, id,
783 sip->dts_object = dmp->dm_name;
795 dt_module_modelname(dt_module_t *dmp)
797 if (dmp->dm_ops == &dt_modops_64)
814 dt_module_t *dmp;
825 (dmp = dt_module_create(dtp, name)) == NULL) {
835 * succeeds, we know that we can continue safely using dmp->dm_elf.
837 dmp->dm_elf = elf_begin(fd, ELF_C_READ, NULL);
838 err = elf_cntl(dmp->dm_elf, ELF_C_FDREAD);
841 if (dmp->dm_elf == NULL || err == -1 ||
842 elf_getshdrstrndx(dmp->dm_elf, &shstrs) == -1) {
845 dt_module_destroy(dtp, dmp);
849 switch (gelf_getclass(dmp->dm_elf)) {
851 dmp->dm_ops = &dt_modops_32;
855 dmp->dm_ops = &dt_modops_64;
860 dt_module_destroy(dtp, dmp);
868 for (sp = NULL; (sp = elf_nextscn(dmp->dm_elf, sp)) != NULL; ) {
870 (s = elf_strptr(dmp->dm_elf, shstrs, sh.sh_name)) == NULL ||
875 dmp->dm_text_size = sh.sh_size;
876 dmp->dm_text_va = sh.sh_addr;
878 dmp->dm_data_size = sh.sh_size;
879 dmp->dm_data_va = sh.sh_addr;
881 dmp->dm_bss_size = sh.sh_size;
882 dmp->dm_bss_va = sh.sh_addr;
885 bcopy(dp->d_buf, &dmp->dm_info,
886 MIN(sh.sh_size, sizeof (dmp->dm_info)));
889 (void) strlcpy(dmp->dm_file,
890 dp->d_buf, sizeof (dmp->dm_file));
894 dmp->dm_flags |= DT_DM_KERNEL;
895 dmp->dm_modid = (int)OBJFS_MODID(st.st_ino);
897 if (dmp->dm_info.objfs_info_primary)
898 dmp->dm_flags |= DT_DM_PRIMARY;
901 bits, dmp->dm_name, dmp->dm_file, dmp->dm_modid);
911 dt_module_t *dmp;
914 for (dmp = dt_list_next(&dtp->dt_modlist);
915 dmp != NULL; dmp = dt_list_next(dmp))
916 dt_module_unload(dtp, dmp);
979 dt_module_t *dmp;
983 dmp = dtp->dt_exec;
986 dmp = dtp->dt_rtld;
989 dmp = dtp->dt_cdefs;
992 dmp = dtp->dt_ddefs;
995 dmp = dt_module_create(dtp, object);
999 if (dmp == NULL)
1002 return (dmp);
1013 dt_module_t *dmp;
1024 if ((dmp = dt_module_from_object(dtp, object)) == NULL)
1027 if (dt_module_load(dtp, dmp) == -1)
1037 dmp = dt_list_next(&dtp->dt_modlist);
1044 for (; n > 0; n--, dmp = dt_list_next(dmp)) {
1045 if ((dmp->dm_flags & mask) != bits)
1048 if (dt_module_load(dtp, dmp) == -1)
1051 if (dmp->dm_ops->do_symname(dmp, name, symp, &id) != NULL) {
1053 sip->dts_object = dmp->dm_name;
1055 dmp->dm_strtab.cts_data + symp->st_name;
1061 if (dmp->dm_extern != NULL &&
1062 (idp = dt_idhash_lookup(dmp->dm_extern, name)) != NULL) {
1075 sip->dts_object = dmp->dm_name;
1095 dt_module_t *dmp;
1102 for (dmp = dt_list_next(&dtp->dt_modlist); dmp != NULL;
1103 dmp = dt_list_next(dmp)) {
1104 if (addr - dmp->dm_text_va < dmp->dm_text_size ||
1105 addr - dmp->dm_data_va < dmp->dm_data_size ||
1106 addr - dmp->dm_bss_va < dmp->dm_bss_size)
1110 if (dmp == NULL)
1113 if (dt_module_load(dtp, dmp) == -1)
1117 if (dmp->dm_ops->do_symaddr(dmp, addr, symp, &id) == NULL)
1122 sip->dts_object = dmp->dm_name;
1126 dmp->dm_strtab.cts_data + symp->st_name;
1142 dt_module_t *dmp;
1154 if ((dmp = dt_module_from_object(dtp, object)) == NULL)
1157 if (dt_module_load(dtp, dmp) == -1)
1168 dmp = dt_list_next(&dtp->dt_modlist);
1176 for (; n > 0; n--, dmp = dt_list_next(dmp)) {
1177 if ((dmp->dm_flags & mask) != bits)
1185 if (dt_module_getctf(dtp, dmp) == NULL) {
1197 if ((id = ctf_lookup_by_name(dmp->dm_ctfp, name)) != CTF_ERR) {
1198 tip->dtt_object = dmp->dm_name;
1199 tip->dtt_ctfp = dmp->dm_ctfp;
1202 if (ctf_type_kind(dmp->dm_ctfp, ctf_type_resolve(
1203 dmp->dm_ctfp, id)) != CTF_K_FORWARD)
1220 dt_module_t *dmp;
1226 if ((dmp = dt_module_lookup_by_name(dtp, sip->dts_object)) == NULL)
1229 if (symp->st_shndx == SHN_UNDEF && dmp->dm_extern != NULL) {
1231 dt_idhash_lookup(dmp->dm_extern, sip->dts_name);
1240 if (dt_module_getctf(dtp, dmp) == NULL)
1243 tip->dtt_ctfp = dmp->dm_ctfp;
1244 tip->dtt_type = ctf_lookup_by_symbol(dmp->dm_ctfp, sip->dts_id);
1256 tip->dtt_object = dmp->dm_name;
1261 dt_module_info(const dt_module_t *dmp, dtrace_objinfo_t *dto)
1263 dto->dto_name = dmp->dm_name;
1264 dto->dto_file = dmp->dm_file;
1265 dto->dto_id = dmp->dm_modid;
1268 if (dmp->dm_flags & DT_DM_KERNEL)
1270 if (dmp->dm_flags & DT_DM_PRIMARY)
1273 dto->dto_text_va = dmp->dm_text_va;
1274 dto->dto_text_size = dmp->dm_text_size;
1275 dto->dto_data_va = dmp->dm_data_va;
1276 dto->dto_data_size = dmp->dm_data_size;
1277 dto->dto_bss_va = dmp->dm_bss_va;
1278 dto->dto_bss_size = dmp->dm_bss_size;
1286 const dt_module_t *dmp = dt_list_next(&dtp->dt_modlist);
1290 for (; dmp != NULL; dmp = dt_list_next(dmp)) {
1291 if ((rv = (*func)(dtp, dt_module_info(dmp, &dto), data)) != 0)
1301 dt_module_t *dmp;
1307 if ((dmp = dt_module_from_object(dtp, object)) == NULL)
1310 if (dt_module_load(dtp, dmp) == -1)
1313 (void) dt_module_info(dmp, dto);