Lines Matching defs:P

98 get_saddrs(struct ps_prochandle *P, uintptr_t ehdr_start, uint_t *n)
103 if (P->status.pr_dmodel == PR_MODEL_ILP32) {
108 if (read_ehdr32(P, &ehdr, &phnum, ehdr_start) != 0)
114 if (Pread(P, &phdr, sizeof (phdr), a) !=
136 if (read_ehdr64(P, &ehdr, &phnum, ehdr_start) != 0)
142 if (Pread(P, &phdr, sizeof (phdr), a) !=
172 file_info_new(struct ps_prochandle *P, map_info_t *mptr)
182 list_link(fptr, &P->file_head);
187 P->num_files++;
197 if ((fptr->file_saddrs = get_saddrs(P, mptr->map_pmap.pr_vaddr,
201 mp = P->mappings;
203 while (mp < P->mappings + P->map_count && i < fptr->file_nsaddrs) {
243 file_info_free(struct ps_prochandle *P, file_info_t *fptr)
284 P->num_files--;
292 map_info_free(struct ps_prochandle *P, map_info_t *mptr)
299 file_info_free(P, fptr);
301 if (P->execname && mptr == P->map_exec) {
302 free(P->execname);
303 P->execname = NULL;
305 if (P->auxv && (mptr == P->map_exec || mptr == P->map_ldso)) {
306 free(P->auxv);
307 P->auxv = NULL;
308 P->nauxv = 0;
310 if (mptr == P->map_exec)
311 P->map_exec = NULL;
312 if (mptr == P->map_ldso)
313 P->map_ldso = NULL;
324 struct ps_prochandle *P = cd;
330 if ((mptr = Paddr2mptr(P, lop->rl_base)) == NULL) {
336 (fptr = file_info_new(P, mptr)) == NULL) {
344 file_info_free(P, fptr);
365 if (Pread_string(P, buf, sizeof (buf), lop->rl_nameaddr) > 0) {
373 if ((Pfindmap(P, mptr, buf, sizeof (buf)) != NULL) &&
383 map_set(struct ps_prochandle *P, map_info_t *mptr, const char *lname)
389 (fptr = file_info_new(P, mptr)) == NULL)
396 file_info_free(P, fptr);
412 if ((Pfindmap(P, mptr, buf, sizeof (buf)) != NULL) &&
418 load_static_maps(struct ps_prochandle *P)
425 if ((mptr = object_name_to_map(P, PR_LMID_EVERY, PR_OBJ_EXEC)) != NULL)
426 map_set(P, mptr, "a.out");
432 if (Pgetauxval(P, AT_BASE) != -1L &&
433 (mptr = object_name_to_map(P, PR_LMID_EVERY, PR_OBJ_LDSO)) != NULL)
434 map_set(P, mptr, "ld.so.1");
438 Preadmaps(struct ps_prochandle *P, prmap_t **Pmapp, ssize_t *nmapp)
440 return (P->ops.pop_read_maps(P, Pmapp, nmapp, P->data));
451 Pupdate_maps(struct ps_prochandle *P)
461 if (P->info_valid || P->state == PS_UNDEAD)
464 Preadauxvec(P);
466 if (Preadmaps(P, &Pmap, &nmap) != 0)
476 mptr = P->mappings;
479 oldmapcount = P->map_count;
505 if (P->map_exec == mptr)
506 P->map_exec = newp;
507 if (P->map_ldso == mptr)
508 P->map_ldso = newp;
523 map_info_free(P, mptr);
543 map_info_free(P, mptr);
549 if (P->mappings != NULL)
550 free(P->mappings);
551 P->mappings = newmap;
552 P->map_count = P->map_alloc = nmap;
553 P->info_valid = 1;
559 if (P->rap != NULL)
560 (void) rd_loadobj_iter(P->rap, map_iter, P);
568 Pupdate_syms(struct ps_prochandle *P)
573 Pupdate_maps(P);
575 for (i = 0, fptr = list_next(&P->file_head); i < P->num_files;
577 Pbuild_file_symtab(P, fptr);
578 (void) Pbuild_file_ctf(P, fptr);
590 Prd_agent(struct ps_prochandle *P)
592 if (P->rap == NULL && P->state != PS_DEAD && P->state != PS_IDLE) {
593 Pupdate_maps(P);
594 if (P->num_files == 0)
595 load_static_maps(P);
597 if ((P->rap = rd_new(P)) != NULL)
598 (void) rd_loadobj_iter(P->rap, map_iter, P);
600 return (P->rap);
608 Paddr_to_text_map(struct ps_prochandle *P, uintptr_t addr)
612 if (!P->info_valid)
613 Pupdate_maps(P);
615 if ((mptr = Paddr2mptr(P, addr)) != NULL) {
616 file_info_t *fptr = build_map_symtab(P, mptr);
641 Paddr_to_map(struct ps_prochandle *P, uintptr_t addr)
645 if (!P->info_valid)
646 Pupdate_maps(P);
648 if ((mptr = Paddr2mptr(P, addr)) != NULL)
659 Plmid_to_map(struct ps_prochandle *P, Lmid_t lmid, const char *name)
666 if ((mptr = object_name_to_map(P, lmid, name)) != NULL)
673 Pname_to_map(struct ps_prochandle *P, const char *name)
675 return (Plmid_to_map(P, PR_LMID_EVERY, name));
679 Paddr_to_loadobj(struct ps_prochandle *P, uintptr_t addr)
683 if (!P->info_valid)
684 Pupdate_maps(P);
686 if ((mptr = Paddr2mptr(P, addr)) == NULL)
693 (void) build_map_symtab(P, mptr);
699 Plmid_to_loadobj(struct ps_prochandle *P, Lmid_t lmid, const char *name)
706 if ((mptr = object_name_to_map(P, lmid, name)) == NULL)
713 (void) build_map_symtab(P, mptr);
719 Pname_to_loadobj(struct ps_prochandle *P, const char *name)
721 return (Plmid_to_loadobj(P, PR_LMID_EVERY, name));
725 Pbuild_file_ctf(struct ps_prochandle *P, file_info_t *fptr)
734 Pbuild_file_symtab(P, fptr);
803 Paddr_to_ctf(struct ps_prochandle *P, uintptr_t addr)
808 if (!P->info_valid)
809 Pupdate_maps(P);
811 if ((mptr = Paddr2mptr(P, addr)) == NULL ||
815 return (Pbuild_file_ctf(P, fptr));
819 Plmid_to_ctf(struct ps_prochandle *P, Lmid_t lmid, const char *name)
827 if ((mptr = object_name_to_map(P, lmid, name)) == NULL ||
831 return (Pbuild_file_ctf(P, fptr));
835 Pname_to_ctf(struct ps_prochandle *P, const char *name)
837 return (Plmid_to_ctf(P, PR_LMID_EVERY, name));
841 Preadauxvec(struct ps_prochandle *P)
843 if (P->auxv != NULL) {
844 free(P->auxv);
845 P->auxv = NULL;
846 P->nauxv = 0;
849 P->ops.pop_read_aux(P, &P->auxv, &P->nauxv, P->data);
857 Pgetauxval(struct ps_prochandle *P, int type)
861 if (P->auxv == NULL)
862 Preadauxvec(P);
864 if (P->auxv == NULL)
867 for (auxv = P->auxv; auxv->a_type != AT_NULL; auxv++) {
880 Pgetauxvec(struct ps_prochandle *P)
884 if (P->auxv == NULL)
885 Preadauxvec(P);
887 if (P->auxv == NULL)
890 return (P->auxv);
898 is_mapping_in_file(struct ps_prochandle *P, map_info_t *mptr, file_info_t *fptr)
931 (fptr->file_saddrs = get_saddrs(P,
952 build_map_symtab(struct ps_prochandle *P, map_info_t *mptr)
959 Pbuild_file_symtab(P, fptr);
970 for (i = 0, fptr = list_next(&P->file_head); i < P->num_files;
973 fptr->file_lo && is_mapping_in_file(P, mptr, fptr)) {
976 Pbuild_file_symtab(P, fptr);
988 if ((fptr = file_info_new(P, mptr)) == NULL)
991 if (P->map_ldso != mptr) {
992 if (P->rap != NULL)
993 (void) rd_loadobj_iter(P->rap, map_iter, P);
995 (void) Prd_agent(P);
1011 Pbuild_file_symtab(P, fptr);
1017 read_ehdr32(struct ps_prochandle *P, Elf32_Ehdr *ehdr, uint_t *phnum,
1020 if (Pread(P, ehdr, sizeof (*ehdr), addr) != sizeof (*ehdr))
1040 Pread(P, &shdr0, sizeof (shdr0), addr + ehdr->e_shoff) !=
1052 read_dynamic_phdr32(struct ps_prochandle *P, const Elf32_Ehdr *ehdr,
1059 if (Pread(P, phdr, sizeof (*phdr), a) != sizeof (*phdr))
1071 read_ehdr64(struct ps_prochandle *P, Elf64_Ehdr *ehdr, uint_t *phnum,
1074 if (Pread(P, ehdr, sizeof (Elf64_Ehdr), addr) != sizeof (Elf64_Ehdr))
1094 Pread(P, &shdr0, sizeof (shdr0), addr + ehdr->e_shoff) !=
1106 read_dynamic_phdr64(struct ps_prochandle *P, const Elf64_Ehdr *ehdr,
1113 if (Pread(P, phdr, sizeof (*phdr), a) != sizeof (*phdr))
1160 file_differs(struct ps_prochandle *P, Elf *elf, file_info_t *fptr)
1173 if ((Pcontent(P) & (CC_CONTENT_TEXT | CC_CONTENT_DATA)) !=
1192 if (P->status.pr_dmodel == PR_MODEL_ILP32)
1195 else if (P->status.pr_dmodel == PR_MODEL_LP64)
1222 if (P->status.pr_dmodel == PR_MODEL_ILP32) {
1228 if (read_ehdr32(P, &ehdr, &phnum, addr) != 0 ||
1229 read_dynamic_phdr32(P, &ehdr, phnum, &phdr, addr) != 0)
1237 if (Pread(P, dynp, phdr.p_filesz, phdr.p_vaddr) !=
1257 } else if (P->status.pr_dmodel == PR_MODEL_LP64) {
1263 if (read_ehdr64(P, &ehdr, &phnum, addr) != 0 ||
1264 read_dynamic_phdr64(P, &ehdr, phnum, &phdr, addr) != 0)
1272 if (Pread(P, dynp, phdr.p_filesz, phdr.p_vaddr) !=
1303 fake_elf(struct ps_prochandle *P, file_info_t *fptr)
1312 if ((Pcontent(P) & (CC_CONTENT_TEXT | CC_CONTENT_DATA)) !=
1318 if (P->status.pr_dmodel == PR_MODEL_ILP32) {
1322 if ((read_ehdr32(P, &ehdr, &phnum, addr) != 0) ||
1323 read_dynamic_phdr32(P, &ehdr, phnum, &phdr, addr) != 0)
1326 elf = fake_elf32(P, fptr, addr, &ehdr, phnum, &phdr);
1332 if (read_ehdr64(P, &ehdr, &phnum, addr) != 0 ||
1333 read_dynamic_phdr64(P, &ehdr, phnum, &phdr, addr) != 0)
1336 elf = fake_elf64(P, fptr, addr, &ehdr, phnum, &phdr);
1546 build_fake_elf(struct ps_prochandle *P, file_info_t *fptr, GElf_Ehdr *ehdr,
1553 if ((elf = fake_elf(P, fptr)) == NULL ||
1573 Pbuild_file_symtab(struct ps_prochandle *P, file_info_t *fptr)
1606 if (P->state == PS_DEAD || P->state == PS_IDLE) {
1630 procfs_path, (int)P->pid, fptr->file_pname);
1640 if (_libproc_incore_elf || (P->flags & INCORE)) {
1644 if ((elf = build_fake_elf(P, fptr, &ehdr, &nshdrs, &shdata)) ==
1652 if ((elf = build_fake_elf(P, fptr, &ehdr, &nshdrs, &shdata)) ==
1669 if ((elf = build_fake_elf(P, fptr, &ehdr, &nshdrs, &shdata)) ==
1673 } else if (file_differs(P, elf, fptr)) {
1686 if ((newelf = build_fake_elf(P, fptr, &ehdr, &nshdrs, &shdata))
1699 if (fptr->file_rname != NULL && P->execname != NULL &&
1700 strcmp(fptr->file_rname, P->execname) == 0) {
1702 "on P->execname; discarding\n");
1703 free(P->execname);
1704 P->execname = NULL;
1954 Paddr2mptr(struct ps_prochandle *P, uintptr_t addr)
1957 int hi = P->map_count - 1;
1964 mp = &P->mappings[mid];
1984 exec_map(struct ps_prochandle *P)
1992 for (i = 0, mptr = P->mappings; i < P->map_count; i++, mptr++) {
2038 object_to_map(struct ps_prochandle *P, Lmid_t lmid, const char *objname)
2049 if (P->rap == NULL)
2056 for (i = 0, mp = P->mappings; i < P->map_count; i++, mp++) {
2083 for (i = 0, mp = P->mappings; i < P->map_count; i++, mp++) {
2114 return (P->map_exec);
2120 object_name_to_map(struct ps_prochandle *P, Lmid_t lmid, const char *name)
2124 if (!P->info_valid)
2125 Pupdate_maps(P);
2127 if (P->map_exec == NULL && ((mptr = Paddr2mptr(P,
2128 Pgetauxval(P, AT_ENTRY))) != NULL || (mptr = exec_map(P)) != NULL))
2129 P->map_exec = mptr;
2131 if (P->map_ldso == NULL && (mptr = Paddr2mptr(P,
2132 Pgetauxval(P, AT_BASE))) != NULL)
2133 P->map_ldso = mptr;
2136 mptr = P->map_exec;
2138 mptr = P->map_ldso;
2139 else if (Prd_agent(P) != NULL || P->state == PS_IDLE)
2140 mptr = object_to_map(P, lmid, name);
2387 struct ps_prochandle *P,
2406 (void) Prd_agent(P);
2408 if ((mptr = Paddr2mptr(P, addr)) == NULL || /* no such address */
2409 (fptr = build_map_symtab(P, mptr)) == NULL || /* no mapped file */
2456 Pxlookup_by_addr(struct ps_prochandle *P, uintptr_t addr, char *buf,
2459 return (i_Pxlookup_by_addr(P, B_FALSE, addr, buf, bufsize, symp, sip));
2463 Pxlookup_by_addr_resolved(struct ps_prochandle *P, uintptr_t addr, char *buf,
2466 return (i_Pxlookup_by_addr(P, B_TRUE, addr, buf, bufsize, symp, sip));
2470 Plookup_by_addr(struct ps_prochandle *P, uintptr_t addr, char *buf,
2473 return (i_Pxlookup_by_addr(P, B_FALSE, addr, buf, size, symp, NULL));
2484 struct ps_prochandle *P,
2502 (void) Prd_agent(P);
2503 cnt = P->num_files;
2504 fptr = list_next(&P->file_head);
2507 if ((mptr = object_name_to_map(P, lmid, oname)) == NULL ||
2508 (fptr = build_map_symtab(P, mptr)) == NULL)
2520 Pbuild_file_symtab(P, fptr);
2581 Plookup_by_name(struct ps_prochandle *P, const char *object,
2584 return (Pxlookup_by_name(P, PR_LMID_EVERY, object, symbol, symp, NULL));
2591 i_Pmapping_iter(struct ps_prochandle *P, boolean_t lmresolve,
2601 (void) Prd_agent(P);
2603 for (i = 0, mptr = P->mappings; i < P->map_count; i++, mptr++) {
2617 Pmapping_iter(struct ps_prochandle *P, proc_map_f *func, void *cd)
2619 return (i_Pmapping_iter(P, B_FALSE, func, cd));
2623 Pmapping_iter_resolved(struct ps_prochandle *P, proc_map_f *func, void *cd)
2625 return (i_Pmapping_iter(P, B_TRUE, func, cd));
2632 i_Pobject_iter(struct ps_prochandle *P, boolean_t lmresolve,
2640 (void) Prd_agent(P); /* create file_info_t's for all the mappings */
2641 Pupdate_maps(P);
2643 for (cnt = P->num_files, fptr = list_next(&P->file_head);
2660 if (!P->info_valid)
2661 Pupdate_maps(P);
2667 Pobject_iter(struct ps_prochandle *P, proc_map_f *func, void *cd)
2669 return (i_Pobject_iter(P, B_FALSE, func, cd));
2673 Pobject_iter_resolved(struct ps_prochandle *P, proc_map_f *func, void *cd)
2675 return (i_Pobject_iter(P, B_TRUE, func, cd));
2679 i_Pobjname(struct ps_prochandle *P, boolean_t lmresolve, uintptr_t addr,
2686 (void) Prd_agent(P);
2688 if ((mptr = Paddr2mptr(P, addr)) == NULL)
2700 if (Pfindmap(P, mptr, buffer, bufsize) != NULL)
2712 Pobjname(struct ps_prochandle *P, uintptr_t addr,
2715 return (i_Pobjname(P, B_FALSE, addr, buffer, bufsize));
2727 Pobjname_resolved(struct ps_prochandle *P, uintptr_t addr,
2730 return (i_Pobjname(P, B_TRUE, addr, buffer, bufsize));
2738 Plmid(struct ps_prochandle *P, uintptr_t addr, Lmid_t *lmidp)
2744 (void) Prd_agent(P);
2746 if ((mptr = Paddr2mptr(P, addr)) != NULL &&
2761 Psymbol_iter_com(struct ps_prochandle *P, Lmid_t lmid, const char *object_name,
2780 if ((mptr = object_name_to_map(P, lmid, object_name)) == NULL)
2783 if ((fptr = build_map_symtab(P, mptr)) == NULL || /* no mapped file */
2886 Pxsymbol_iter(struct ps_prochandle *P, Lmid_t lmid, const char *object_name,
2889 return (Psymbol_iter_com(P, lmid, object_name, which, mask,
2894 Psymbol_iter_by_lmid(struct ps_prochandle *P, Lmid_t lmid,
2897 return (Psymbol_iter_com(P, lmid, object_name, which, mask,
2902 Psymbol_iter(struct ps_prochandle *P,
2905 return (Psymbol_iter_com(P, PR_LMID_EVERY, object_name, which, mask,
2910 Psymbol_iter_by_addr(struct ps_prochandle *P,
2913 return (Psymbol_iter_com(P, PR_LMID_EVERY, object_name, which, mask,
2918 Psymbol_iter_by_name(struct ps_prochandle *P,
2921 return (Psymbol_iter_com(P, PR_LMID_EVERY, object_name, which, mask,
2929 Pplatform(struct ps_prochandle *P, char *s, size_t n)
2931 return (P->ops.pop_platform(P, s, n, P->data));
2938 Puname(struct ps_prochandle *P, struct utsname *u)
2940 return (P->ops.pop_uname(P, u, P->data));
2948 Pinitsym(struct ps_prochandle *P)
2950 P->num_files = 0;
2951 list_link(&P->file_head, NULL);
2959 Preset_maps(struct ps_prochandle *P)
2963 if (P->rap != NULL) {
2964 rd_delete(P->rap);
2965 P->rap = NULL;
2968 if (P->execname != NULL) {
2969 free(P->execname);
2970 P->execname = NULL;
2973 if (P->auxv != NULL) {
2974 free(P->auxv);
2975 P->auxv = NULL;
2976 P->nauxv = 0;
2979 for (i = 0; i < P->map_count; i++)
2980 map_info_free(P, &P->mappings[i]);
2982 if (P->mappings != NULL) {
2983 free(P->mappings);
2984 P->mappings = NULL;
2986 P->map_count = P->map_alloc = 0;
2988 P->info_valid = 0;
3000 getenv_func(void *data, struct ps_prochandle *P, uintptr_t addr,
3022 Pgetenv(struct ps_prochandle *P, const char *name, char *buf, size_t buflen)
3031 if (Penv_iter(P, getenv_func, &d) == 1) {
3050 Penv_iter(struct ps_prochandle *P, proc_env_f *func, void *data)
3066 if ((psp = Ppsinfo(P)) == NULL)
3071 if (Plookup_by_name(P, PR_OBJ_EXEC, "_environ", &sym) == 0) {
3072 if (P->status.pr_dmodel == PR_MODEL_NATIVE) {
3073 if (Pread(P, &envpoff, sizeof (envpoff),
3076 } else if (P->status.pr_dmodel == PR_MODEL_ILP32) {
3079 if (Pread(P, &envpoff32, sizeof (envpoff32),
3096 if (P->status.pr_dmodel == PR_MODEL_NATIVE) {
3097 if (Pread(P, envp,
3102 } else if (P->status.pr_dmodel == PR_MODEL_ILP32) {
3107 if (Pread(P, e32, sizeof (e32), envpoff) <= 0) {
3124 ret = Pread_string(P, buf, buflen, envoff);
3142 if ((ret = func(data, P, envoff, nameval)) != 0)
3145 envpoff += (P->status.pr_dmodel == PR_MODEL_LP64)? 8 : 4;