Index: head/usr.sbin/pmc/Makefile =================================================================== --- head/usr.sbin/pmc/Makefile (revision 334464) +++ head/usr.sbin/pmc/Makefile (revision 334465) @@ -1,12 +1,13 @@ # # $FreeBSD$ # PROG= pmc MAN= LIBADD= kvm pmc m ncursesw pmcstat elf -SRCS= pmc.c pmc_util.c cmd_pmc_stat.c +SRCS= pmc.c pmc_util.c cmd_pmc_stat.c \ + cmd_pmc_list.c .include Index: head/usr.sbin/pmc/cmd_pmc.h =================================================================== --- head/usr.sbin/pmc/cmd_pmc.h (revision 334464) +++ head/usr.sbin/pmc/cmd_pmc.h (revision 334465) @@ -1,52 +1,53 @@ /*- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD * * Copyright (c) 2018, Matthew Macy * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $FreeBSD$ * */ #ifndef _CMD_PMC_H_ #define _CMD_PMC_H_ #define DEFAULT_DISPLAY_HEIGHT 256 /* file virtual height */ #define DEFAULT_DISPLAY_WIDTH 1024 /* file virtual width */ extern int pmc_displayheight; extern int pmc_displaywidth; extern int pmc_kq; extern struct pmcstat_args pmc_args; typedef int (*cmd_disp_t)(int, char **); int cmd_pmc_stat(int, char **); int cmd_pmc_stat_system(int, char **); +int cmd_pmc_list_events(int, char **); int pmc_util_get_pid(struct pmcstat_args *); void pmc_util_start_pmcs(struct pmcstat_args *); void pmc_util_cleanup(struct pmcstat_args *); void pmc_util_shutdown_logging(struct pmcstat_args *args); void pmc_util_kill_process(struct pmcstat_args *args); #endif Index: head/usr.sbin/pmc/cmd_pmc_list.c =================================================================== --- head/usr.sbin/pmc/cmd_pmc_list.c (nonexistent) +++ head/usr.sbin/pmc/cmd_pmc_list.c (revision 334465) @@ -0,0 +1,128 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2018, Matthew Macy + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include "cmd_pmc.h" + + +static struct option longopts[] = { + {"long-desc", no_argument, NULL, 'U'}, + {"desc", no_argument, NULL, 'u'}, + {"full", no_argument, NULL, 'f'}, + {NULL, 0, NULL, 0} +}; + +static void +usage(void) +{ + errx(EX_USAGE, + "\t list events\n" + "\t -u, desc -- short description of event\n" + "\t -U, long-desc -- long description of event\n" + "\t -f, full -- full event details\n" + ); +} + +int +cmd_pmc_list_events(int argc, char **argv) +{ + int do_long_descr, do_descr, do_full; + int option; + + do_long_descr = do_descr = do_full = 0; + while ((option = getopt_long(argc, argv, "Uuf", longopts, NULL)) != -1) { + switch (option) { + case 'U': + do_long_descr = 1; + break; + case 'u': + do_descr = 1; + break; + case 'f': + do_full = 1; + break; + case '?': + default: + usage(); + } + } + argc -= optind; + argv += optind; + if ((do_long_descr | do_descr | do_full) && argc == 0) { + warnx("event or event substring required when option provided\n"); + usage(); + } + if (do_full) + pmc_pmu_print_counter_full(argc ? argv[0] : NULL); + else if (do_long_descr) + pmc_pmu_print_counter_desc_long(argv[0]); + else if (do_descr) + pmc_pmu_print_counter_desc(argv[0]); + else + pmc_pmu_print_counters(argv[0]); + + return (0); +} Property changes on: head/usr.sbin/pmc/cmd_pmc_list.c ___________________________________________________________________ Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Index: head/usr.sbin/pmc/pmc.c =================================================================== --- head/usr.sbin/pmc/pmc.c (revision 334464) +++ head/usr.sbin/pmc/pmc.c (revision 334465) @@ -1,114 +1,116 @@ /*- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD * * Copyright (c) 2018, Matthew Macy * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $FreeBSD$ * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "cmd_pmc.h" int pmc_displayheight = DEFAULT_DISPLAY_HEIGHT; int pmc_displaywidth = DEFAULT_DISPLAY_WIDTH; int pmc_kq; struct pmcstat_args pmc_args; struct pmcstat_pmcs pmcstat_pmcs = LIST_HEAD_INITIALIZER(pmcstat_pmcs); struct pmcstat_image_hash_list pmcstat_image_hash[PMCSTAT_NHASH]; struct pmcstat_process_hash_list pmcstat_process_hash[PMCSTAT_NHASH]; struct cmd_handler { const char *ch_name; cmd_disp_t ch_fn; }; static struct cmd_handler disp_table[] = { {"stat", cmd_pmc_stat}, {"stat-system", cmd_pmc_stat_system}, + {"list-events", cmd_pmc_list_events}, {NULL, NULL} }; static void usage(void) { errx(EX_USAGE, "\t pmc management utility\n" "\t stat run program and print stats\n" - "\t stat-system run program and print system wide stats for duration of execution\n" + "\t stat-system run program and print system wide stats for duration of execution\n" + "\t list-events list PMC events available on host\n" ); } static cmd_disp_t disp_lookup(char *name) { struct cmd_handler *hnd; for (hnd = disp_table; hnd->ch_name != NULL; hnd++) if (strcmp(hnd->ch_name, name) == 0) return (hnd->ch_fn); return (NULL); } int main(int argc, char **argv) { cmd_disp_t disp; pmc_args.pa_printfile = stderr; STAILQ_INIT(&pmc_args.pa_events); SLIST_INIT(&pmc_args.pa_targets); if (argc == 1) usage(); if ((disp = disp_lookup(argv[1])) == NULL) usage(); argc--; argv++; /* Allocate a kqueue */ if ((pmc_kq = kqueue()) < 0) err(EX_OSERR, "ERROR: Cannot allocate kqueue"); if (pmc_init() < 0) err(EX_UNAVAILABLE, "ERROR: Initialization of the pmc(3) library failed" ); return (disp(argc, argv)); }