13fc980b1SBrian Feldman #ifndef lint 23fc980b1SBrian Feldman static const char rcsid[] = 33fc980b1SBrian Feldman "$FreeBSD$"; 43fc980b1SBrian Feldman #endif /* not lint */ 53fc980b1SBrian Feldman 63fc980b1SBrian Feldman #include <sys/param.h> 73fc980b1SBrian Feldman #include <sys/linker.h> 83fc980b1SBrian Feldman #include <sys/sysctl.h> 93fc980b1SBrian Feldman #include <sys/errno.h> 103fc980b1SBrian Feldman 113fc980b1SBrian Feldman #include <err.h> 123fc980b1SBrian Feldman #include <stdlib.h> 133fc980b1SBrian Feldman 143fc980b1SBrian Feldman #include "gprof.h" 153fc980b1SBrian Feldman 163fc980b1SBrian Feldman /* Things which get -E excluded by default. */ 173fc980b1SBrian Feldman static char *excludes[] = { ".mcount", "_mcleanup", NULL }; 183fc980b1SBrian Feldman 193fc980b1SBrian Feldman int 203fc980b1SBrian Feldman kernel_getnfile(const char *unused, char ***defaultEs) 213fc980b1SBrian Feldman { 223fc980b1SBrian Feldman char *namelist; 233fc980b1SBrian Feldman size_t len; 243fc980b1SBrian Feldman char *name; 253fc980b1SBrian Feldman 263fc980b1SBrian Feldman if (sysctlbyname("kern.function_list", NULL, &len, NULL, 0) == -1) 273fc980b1SBrian Feldman err(1, "sysctlbyname: function_list size"); 283fc980b1SBrian Feldman for (;;) { 293fc980b1SBrian Feldman namelist = malloc(len); 303fc980b1SBrian Feldman if (namelist == NULL) 313fc980b1SBrian Feldman err(1, "malloc"); 323fc980b1SBrian Feldman if (sysctlbyname("kern.function_list", namelist, &len, NULL, 333fc980b1SBrian Feldman 0) == 0) 343fc980b1SBrian Feldman break; 353fc980b1SBrian Feldman if (errno == ENOMEM) 363fc980b1SBrian Feldman free(namelist); 373fc980b1SBrian Feldman else 383fc980b1SBrian Feldman err(1, "sysctlbyname: function_list"); 393fc980b1SBrian Feldman } 403fc980b1SBrian Feldman nname = 0; 413fc980b1SBrian Feldman for (name = namelist; *name != '\0'; name += strlen(name) + 1) 423fc980b1SBrian Feldman nname++; 433fc980b1SBrian Feldman /* Allocate memory for them, plus a terminating entry. */ 443fc980b1SBrian Feldman if ((nl = (nltype *)calloc(nname + 1, sizeof(nltype))) == NULL) 453fc980b1SBrian Feldman errx(1, "Insufficient memory for symbol table"); 463fc980b1SBrian Feldman npe = nl; 473fc980b1SBrian Feldman for (name = namelist; *name != '\0'; name += strlen(name) + 1) { 483fc980b1SBrian Feldman struct kld_sym_lookup ksl; 493fc980b1SBrian Feldman 503fc980b1SBrian Feldman ksl.version = sizeof(ksl); 513fc980b1SBrian Feldman ksl.symname = name; 523fc980b1SBrian Feldman if (kldsym(0, KLDSYM_LOOKUP, &ksl)) 533fc980b1SBrian Feldman err(1, "kldsym(%s)", name); 543fc980b1SBrian Feldman /* aflag not supported */ 553fc980b1SBrian Feldman if (uflag && strchr(name, '.') != NULL) 563fc980b1SBrian Feldman continue; 573fc980b1SBrian Feldman npe->value = ksl.symvalue; 583fc980b1SBrian Feldman npe->name = name; 593fc980b1SBrian Feldman npe++; 603fc980b1SBrian Feldman } 613fc980b1SBrian Feldman npe->value = -1; 623fc980b1SBrian Feldman 633fc980b1SBrian Feldman *defaultEs = excludes; 643fc980b1SBrian Feldman } 65