pmcstat.h revision 169069
1147708Sjkoshy/*- 2169069Sjkoshy * Copyright (c) 2005-2007, Joseph Koshy 3147708Sjkoshy * All rights reserved. 4147708Sjkoshy * 5147708Sjkoshy * Redistribution and use in source and binary forms, with or without 6147708Sjkoshy * modification, are permitted provided that the following conditions 7147708Sjkoshy * are met: 8147708Sjkoshy * 1. Redistributions of source code must retain the above copyright 9147708Sjkoshy * notice, this list of conditions and the following disclaimer. 10147708Sjkoshy * 2. Redistributions in binary form must reproduce the above copyright 11147708Sjkoshy * notice, this list of conditions and the following disclaimer in the 12147708Sjkoshy * documentation and/or other materials provided with the distribution. 13147708Sjkoshy * 14147708Sjkoshy * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15147708Sjkoshy * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16147708Sjkoshy * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17147708Sjkoshy * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18147708Sjkoshy * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19147708Sjkoshy * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20147708Sjkoshy * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21147708Sjkoshy * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22147708Sjkoshy * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23147708Sjkoshy * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24147708Sjkoshy * SUCH DAMAGE. 25147708Sjkoshy * 26147708Sjkoshy * $FreeBSD: head/usr.sbin/pmcstat/pmcstat.h 169069 2007-04-27 12:09:31Z jkoshy $ 27147708Sjkoshy */ 28147708Sjkoshy 29147708Sjkoshy#ifndef _PMCSTAT_H_ 30147708Sjkoshy#define _PMCSTAT_H_ 31147708Sjkoshy 32169069Sjkoshy#define FLAG_HAS_TARGET 0x00000001 /* process target */ 33147708Sjkoshy#define FLAG_HAS_WAIT_INTERVAL 0x00000002 /* -w secs */ 34147708Sjkoshy#define FLAG_HAS_OUTPUT_LOGFILE 0x00000004 /* -O file or pipe */ 35147708Sjkoshy#define FLAG_HAS_COMMANDLINE 0x00000008 /* command */ 36147708Sjkoshy#define FLAG_HAS_SAMPLING_PMCS 0x00000010 /* -S or -P */ 37147708Sjkoshy#define FLAG_HAS_COUNTING_PMCS 0x00000020 /* -s or -p */ 38147708Sjkoshy#define FLAG_HAS_PROCESS_PMCS 0x00000040 /* -P or -p */ 39147708Sjkoshy#define FLAG_HAS_SYSTEM_PMCS 0x00000080 /* -S or -s */ 40147708Sjkoshy#define FLAG_HAS_PIPE 0x00000100 /* implicit log */ 41147708Sjkoshy#define FLAG_READ_LOGFILE 0x00000200 /* -R file */ 42147708Sjkoshy#define FLAG_DO_GPROF 0x00000400 /* -g */ 43147708Sjkoshy#define FLAG_HAS_SAMPLESDIR 0x00000800 /* -D dir */ 44147708Sjkoshy#define FLAG_HAS_KERNELPATH 0x00001000 /* -k kernel */ 45147708Sjkoshy#define FLAG_DO_PRINT 0x00002000 /* -o */ 46147708Sjkoshy 47147708Sjkoshy#define DEFAULT_SAMPLE_COUNT 65536 48147708Sjkoshy#define DEFAULT_WAIT_INTERVAL 5.0 49147708Sjkoshy#define DEFAULT_DISPLAY_HEIGHT 23 50147708Sjkoshy#define DEFAULT_BUFFER_SIZE 4096 51147708Sjkoshy 52147708Sjkoshy#define PRINT_HEADER_PREFIX "# " 53147708Sjkoshy#define READPIPEFD 0 54147708Sjkoshy#define WRITEPIPEFD 1 55147708Sjkoshy#define NPIPEFD 2 56147708Sjkoshy 57168949Sjkoshy#define NSOCKPAIRFD 2 58168949Sjkoshy#define PARENTSOCKET 0 59168949Sjkoshy#define CHILDSOCKET 1 60168949Sjkoshy 61147708Sjkoshy#define PMCSTAT_OPEN_FOR_READ 0 62147708Sjkoshy#define PMCSTAT_OPEN_FOR_WRITE 1 63147708Sjkoshy#define PMCSTAT_DEFAULT_NW_HOST "localhost" 64147708Sjkoshy#define PMCSTAT_DEFAULT_NW_PORT "9000" 65147708Sjkoshy#define PMCSTAT_NHASH 256 66147708Sjkoshy#define PMCSTAT_HASH_MASK 0xFF 67147708Sjkoshy 68147708Sjkoshy#define PMCSTAT_LDD_COMMAND "/usr/bin/ldd" 69147708Sjkoshy 70147708Sjkoshy#define PMCSTAT_PRINT_ENTRY(A,T,...) do { \ 71147708Sjkoshy fprintf((A)->pa_printfile, "%-8s", T); \ 72147708Sjkoshy fprintf((A)->pa_printfile, " " __VA_ARGS__); \ 73147708Sjkoshy fprintf((A)->pa_printfile, "\n"); \ 74147708Sjkoshy } while (0) 75147708Sjkoshy 76147708Sjkoshyenum pmcstat_state { 77147708Sjkoshy PMCSTAT_FINISHED = 0, 78147708Sjkoshy PMCSTAT_EXITING = 1, 79147708Sjkoshy PMCSTAT_RUNNING = 2 80147708Sjkoshy}; 81147708Sjkoshy 82147708Sjkoshystruct pmcstat_ev { 83147708Sjkoshy STAILQ_ENTRY(pmcstat_ev) ev_next; 84147708Sjkoshy int ev_count; /* associated count if in sampling mode */ 85168949Sjkoshy uint32_t ev_cpu; /* cpus for this event */ 86168949Sjkoshy int ev_cumulative; /* show cumulative counts */ 87147708Sjkoshy int ev_flags; /* PMC_F_* */ 88168949Sjkoshy int ev_fieldskip; /* #leading spaces */ 89147708Sjkoshy int ev_fieldwidth; /* print width */ 90168949Sjkoshy enum pmc_mode ev_mode; /* desired mode */ 91168949Sjkoshy char *ev_name; /* (derived) event name */ 92147708Sjkoshy pmc_id_t ev_pmcid; /* allocated ID */ 93168949Sjkoshy pmc_value_t ev_saved; /* for incremental counts */ 94168949Sjkoshy char *ev_spec; /* event specification */ 95147708Sjkoshy}; 96147708Sjkoshy 97169069Sjkoshystruct pmcstat_target { 98169069Sjkoshy SLIST_ENTRY(pmcstat_target) pt_next; 99169069Sjkoshy pid_t pt_pid; 100169069Sjkoshy}; 101169069Sjkoshy 102147708Sjkoshystruct pmcstat_args { 103147708Sjkoshy int pa_flags; /* argument flags */ 104147708Sjkoshy int pa_required; /* required features */ 105157144Sjkoshy int pa_verbosity; /* verbosity level */ 106147708Sjkoshy FILE *pa_printfile; /* where to send printed output */ 107147708Sjkoshy int pa_logfd; /* output log file */ 108147708Sjkoshy char *pa_inputpath; /* path to input log */ 109147708Sjkoshy char *pa_outputpath; /* path to output log */ 110147708Sjkoshy void *pa_logparser; /* log file parser */ 111157144Sjkoshy const char *pa_fsroot; /* FS root where executables reside */ 112157144Sjkoshy char *pa_kernel; /* pathname of the kernel */ 113147708Sjkoshy const char *pa_samplesdir; /* directory for profile files */ 114157144Sjkoshy const char *pa_mapfilename;/* mapfile name */ 115147708Sjkoshy double pa_interval; /* printing interval in seconds */ 116147708Sjkoshy int pa_argc; 117147708Sjkoshy char **pa_argv; 118169069Sjkoshy STAILQ_HEAD(, pmcstat_ev) pa_events; 119169069Sjkoshy SLIST_HEAD(, pmcstat_target) pa_targets; 120147708Sjkoshy} args; 121147708Sjkoshy 122147708Sjkoshy/* Function prototypes */ 123168949Sjkoshyvoid pmcstat_attach_pmcs(struct pmcstat_args *_a); 124147708Sjkoshyvoid pmcstat_cleanup(struct pmcstat_args *_a); 125168949Sjkoshyvoid pmcstat_clone_event_descriptor(struct pmcstat_args *_a, 126168949Sjkoshy struct pmcstat_ev *_ev, uint32_t _cpumask); 127147708Sjkoshyint pmcstat_close_log(struct pmcstat_args *_a); 128168949Sjkoshyvoid pmcstat_create_process(struct pmcstat_args *_a); 129169069Sjkoshyvoid pmcstat_find_targets(struct pmcstat_args *_a, const char *_arg); 130147708Sjkoshyvoid pmcstat_initialize_logging(struct pmcstat_args *_a); 131169069Sjkoshyvoid pmcstat_kill_process(struct pmcstat_args *_a); 132157144Sjkoshyint pmcstat_open_log(const char *_p, int _mode); 133147708Sjkoshyvoid pmcstat_print_counters(struct pmcstat_args *_a); 134147708Sjkoshyvoid pmcstat_print_headers(struct pmcstat_args *_a); 135147708Sjkoshyvoid pmcstat_print_pmcs(struct pmcstat_args *_a); 136147708Sjkoshyvoid pmcstat_show_usage(void); 137157144Sjkoshyvoid pmcstat_shutdown_logging(struct pmcstat_args *_a); 138147708Sjkoshyvoid pmcstat_start_pmcs(struct pmcstat_args *_a); 139168949Sjkoshyvoid pmcstat_start_process(void); 140147863Sjkoshyint pmcstat_process_log(struct pmcstat_args *_a); 141168949Sjkoshyuint32_t pmcstat_get_cpumask(const char *_a); 142147708Sjkoshy 143147708Sjkoshy#endif /* _PMCSTAT_H_ */ 144