diff options
Diffstat (limited to 'cddl/contrib/opensolaris/lib/libdtrace/common/dt_module.c')
-rw-r--r-- | cddl/contrib/opensolaris/lib/libdtrace/common/dt_module.c | 105 |
1 files changed, 7 insertions, 98 deletions
diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_module.c b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_module.c index af17501..2519703 100644 --- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_module.c +++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_module.c @@ -26,23 +26,15 @@ #pragma ident "%Z%%M% %I% %E% SMI" #include <sys/types.h> -#if defined(sun) #include <sys/modctl.h> #include <sys/kobj.h> #include <sys/kobj_impl.h> #include <sys/sysmacros.h> #include <sys/elf.h> #include <sys/task.h> -#else -#include <sys/param.h> -#include <sys/linker.h> -#include <sys/stat.h> -#endif #include <unistd.h> -#if defined(sun) #include <project.h> -#endif #include <strings.h> #include <stdlib.h> #include <libelf.h> @@ -50,9 +42,6 @@ #include <assert.h> #include <errno.h> #include <dirent.h> -#if !defined(sun) -#include <fcntl.h> -#endif #include <dt_strtab.h> #include <dt_module.h> @@ -77,7 +66,7 @@ dt_module_symhash_insert(dt_module_t *dmp, const char *name, uint_t id) static uint_t dt_module_syminit32(dt_module_t *dmp) { - Elf32_Sym *sym = dmp->dm_symtab.cts_data; + const Elf32_Sym *sym = dmp->dm_symtab.cts_data; const char *base = dmp->dm_strtab.cts_data; size_t ss_size = dmp->dm_strtab.cts_size; uint_t i, n = dmp->dm_nsymelems; @@ -94,14 +83,9 @@ dt_module_syminit32(dt_module_t *dmp) continue; /* skip null or invalid names */ if (sym->st_value != 0 && - (ELF32_ST_BIND(sym->st_info) != STB_LOCAL || sym->st_size)) { + (ELF32_ST_BIND(sym->st_info) != STB_LOCAL || sym->st_size)) asrsv++; /* reserve space in the address map */ -#if !defined(sun) - sym->st_value += (Elf_Addr) dmp->dm_reloc_offset; -#endif - } - dt_module_symhash_insert(dmp, name, i); } @@ -111,7 +95,7 @@ dt_module_syminit32(dt_module_t *dmp) static uint_t dt_module_syminit64(dt_module_t *dmp) { - Elf64_Sym *sym = dmp->dm_symtab.cts_data; + const Elf64_Sym *sym = dmp->dm_symtab.cts_data; const char *base = dmp->dm_strtab.cts_data; size_t ss_size = dmp->dm_strtab.cts_size; uint_t i, n = dmp->dm_nsymelems; @@ -128,14 +112,9 @@ dt_module_syminit64(dt_module_t *dmp) continue; /* skip null or invalid names */ if (sym->st_value != 0 && - (ELF64_ST_BIND(sym->st_info) != STB_LOCAL || sym->st_size)) { + (ELF64_ST_BIND(sym->st_info) != STB_LOCAL || sym->st_size)) asrsv++; /* reserve space in the address map */ -#if !defined(sun) - sym->st_value += (Elf_Addr) dmp->dm_reloc_offset; -#endif - } - dt_module_symhash_insert(dmp, name, i); } @@ -510,13 +489,7 @@ dt_module_load_sect(dtrace_hdl_t *dtp, dt_module_t *dmp, ctf_sect_t *ctsp) if (sp == NULL || (dp = elf_getdata(sp, NULL)) == NULL) return (0); -#if defined(sun) ctsp->cts_data = dp->d_buf; -#else - if ((ctsp->cts_data = malloc(dp->d_size)) == NULL) - return (0); - memcpy(ctsp->cts_data, dp->d_buf, dp->d_size); -#endif ctsp->cts_size = dp->d_size; dt_dprintf("loaded %s [%s] (%lu bytes)\n", @@ -692,18 +665,6 @@ dt_module_unload(dtrace_hdl_t *dtp, dt_module_t *dmp) ctf_close(dmp->dm_ctfp); dmp->dm_ctfp = NULL; -#if !defined(sun) - if (dmp->dm_ctdata.cts_data != NULL) { - free(dmp->dm_ctdata.cts_data); - } - if (dmp->dm_symtab.cts_data != NULL) { - free(dmp->dm_symtab.cts_data); - } - if (dmp->dm_strtab.cts_data != NULL) { - free(dmp->dm_strtab.cts_data); - } -#endif - bzero(&dmp->dm_ctdata, sizeof (ctf_sect_t)); bzero(&dmp->dm_symtab, sizeof (ctf_sect_t)); bzero(&dmp->dm_strtab, sizeof (ctf_sect_t)); @@ -729,11 +690,11 @@ dt_module_unload(dtrace_hdl_t *dtp, dt_module_t *dmp) dmp->dm_asrsv = 0; dmp->dm_aslen = 0; - dmp->dm_text_va = 0; + dmp->dm_text_va = NULL; dmp->dm_text_size = 0; - dmp->dm_data_va = 0; + dmp->dm_data_va = NULL; dmp->dm_data_size = 0; - dmp->dm_bss_va = 0; + dmp->dm_bss_va = NULL; dmp->dm_bss_size = 0; if (dmp->dm_extern != NULL) { @@ -820,16 +781,9 @@ dt_module_modelname(dt_module_t *dmp) /* * Update our module cache by adding an entry for the specified module 'name'. * We create the dt_module_t and populate it using /system/object/<name>/. - * - * On FreeBSD, the module name is passed as the full module file name, - * including the path. */ static void -#if defined(sun) dt_module_update(dtrace_hdl_t *dtp, const char *name) -#else -dt_module_update(dtrace_hdl_t *dtp, struct kld_file_stat *k_stat) -#endif { char fname[MAXPATHLEN]; struct stat64 st; @@ -842,17 +796,8 @@ dt_module_update(dtrace_hdl_t *dtp, struct kld_file_stat *k_stat) Elf_Data *dp; Elf_Scn *sp; -#if defined(sun) (void) snprintf(fname, sizeof (fname), "%s/%s/object", OBJFS_ROOT, name); -#else - GElf_Phdr ph; - char name[MAXPATHLEN]; - int i = 0; - - (void) strlcpy(name, k_stat->name, sizeof(name)); - (void) strlcpy(fname, k_stat->pathname, sizeof(fname)); -#endif if ((fd = open(fname, O_RDONLY)) == -1 || fstat64(fd, &st) == -1 || (dmp = dt_module_create(dtp, name)) == NULL) { @@ -924,23 +869,7 @@ dt_module_update(dtrace_hdl_t *dtp, struct kld_file_stat *k_stat) } dmp->dm_flags |= DT_DM_KERNEL; -#if defined(sun) dmp->dm_modid = (int)OBJFS_MODID(st.st_ino); -#else -#if defined(__i386__) - /* - * Find the first load section and figure out the relocation - * offset for the symbols. The kernel module will not need - * relocation, but the kernel linker modules will. - */ - for (i = 0; gelf_getphdr(dmp->dm_elf, i, &ph) != NULL; i++) { - if (ph.p_type == PT_LOAD) { - dmp->dm_reloc_offset = k_stat->address - ph.p_vaddr; - break; - } - } -#endif -#endif if (dmp->dm_info.objfs_info_primary) dmp->dm_flags |= DT_DM_PRIMARY; @@ -958,15 +887,11 @@ dtrace_update(dtrace_hdl_t *dtp) { dt_module_t *dmp; DIR *dirp; -#if defined(__FreeBSD__) - int fileid; -#endif for (dmp = dt_list_next(&dtp->dt_modlist); dmp != NULL; dmp = dt_list_next(dmp)) dt_module_unload(dtp, dmp); -#if defined(sun) /* * Open /system/object and attempt to create a libdtrace module for * each kernel module that is loaded on the current system. @@ -982,18 +907,6 @@ dtrace_update(dtrace_hdl_t *dtp) (void) closedir(dirp); } -#elif defined(__FreeBSD__) - /* - * Use FreeBSD's kernel loader interface to discover what kernel - * modules are loaded and create a libdtrace module for each one. - */ - for (fileid = kldnext(0); fileid > 0; fileid = kldnext(fileid)) { - struct kld_file_stat k_stat; - k_stat.version = sizeof(k_stat); - if (kldstat(fileid, &k_stat) == 0) - dt_module_update(dtp, &k_stat); - } -#endif /* * Look up all the macro identifiers and set di_id to the latest value. @@ -1006,13 +919,9 @@ dtrace_update(dtrace_hdl_t *dtp) dt_idhash_lookup(dtp->dt_macros, "pid")->di_id = getpid(); dt_idhash_lookup(dtp->dt_macros, "pgid")->di_id = getpgid(0); dt_idhash_lookup(dtp->dt_macros, "ppid")->di_id = getppid(); -#if defined(sun) dt_idhash_lookup(dtp->dt_macros, "projid")->di_id = getprojid(); -#endif dt_idhash_lookup(dtp->dt_macros, "sid")->di_id = getsid(0); -#if defined(sun) dt_idhash_lookup(dtp->dt_macros, "taskid")->di_id = gettaskid(); -#endif dt_idhash_lookup(dtp->dt_macros, "uid")->di_id = getuid(); /* |