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