diff --git a/usr.sbin/pmc/Makefile b/usr.sbin/pmc/Makefile index dcef3241a66b..6a7d530aab38 100644 --- a/usr.sbin/pmc/Makefile +++ b/usr.sbin/pmc/Makefile @@ -7,6 +7,7 @@ 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 diff --git a/usr.sbin/pmc/cmd_pmc.h b/usr.sbin/pmc/cmd_pmc.h index 87d175810741..1ed4393a0363 100644 --- a/usr.sbin/pmc/cmd_pmc.h +++ b/usr.sbin/pmc/cmd_pmc.h @@ -42,6 +42,7 @@ 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 *); diff --git a/usr.sbin/pmc/cmd_pmc_list.c b/usr.sbin/pmc/cmd_pmc_list.c new file mode 100644 index 000000000000..33be47083f45 --- /dev/null +++ b/usr.sbin/pmc/cmd_pmc_list.c @@ -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); +} diff --git a/usr.sbin/pmc/pmc.c b/usr.sbin/pmc/pmc.c index 1187c292a8f8..a8a16e7bdfca 100644 --- a/usr.sbin/pmc/pmc.c +++ b/usr.sbin/pmc/pmc.c @@ -64,6 +64,7 @@ struct cmd_handler { static struct cmd_handler disp_table[] = { {"stat", cmd_pmc_stat}, {"stat-system", cmd_pmc_stat_system}, + {"list-events", cmd_pmc_list_events}, {NULL, NULL} }; @@ -73,7 +74,8 @@ 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" ); }