1 /*- 2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3 * 4 * Copyright (c) 2005-2007 Joseph Koshy 5 * Copyright (c) 2007 The FreeBSD Foundation 6 * All rights reserved. 7 * 8 * Portions of this software were developed by A. Joseph Koshy under 9 * sponsorship from the FreeBSD Foundation and Google, Inc. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 * 32 * $FreeBSD$ 33 */ 34 35 #ifndef _PMCLOG_H_ 36 #define _PMCLOG_H_ 37 38 #include <sys/cdefs.h> 39 #include <sys/pmclog.h> 40 41 enum pmclog_state { 42 PMCLOG_OK, 43 PMCLOG_EOF, 44 PMCLOG_REQUIRE_DATA, 45 PMCLOG_ERROR 46 }; 47 48 struct pmclog_ev_callchain { 49 uint32_t pl_pid; 50 uint32_t pl_tid; 51 uint32_t pl_pmcid; 52 uint32_t pl_cpuflags; 53 uint32_t pl_cpuflags2; 54 uint32_t pl_npc; 55 uintfptr_t pl_pc[PMC_CALLCHAIN_DEPTH_MAX]; 56 }; 57 58 struct pmclog_ev_dropnotify { 59 }; 60 61 struct pmclog_ev_closelog { 62 }; 63 64 struct pmclog_ev_initialize { 65 uint32_t pl_version; 66 uint32_t pl_arch; 67 }; 68 69 struct pmclog_ev_map_in { 70 pid_t pl_pid; 71 uintfptr_t pl_start; 72 char pl_pathname[PATH_MAX]; 73 }; 74 75 struct pmclog_ev_map_out { 76 pid_t pl_pid; 77 uintfptr_t pl_start; 78 uintfptr_t pl_end; 79 }; 80 81 struct pmclog_ev_pcsample { 82 uintfptr_t pl_pc; 83 pid_t pl_pid; 84 pid_t pl_tid; 85 pmc_id_t pl_pmcid; 86 uint32_t pl_flags; 87 uint32_t pl_usermode; 88 }; 89 90 struct pmclog_ev_pmcallocate { 91 uint32_t pl_event; 92 const char * pl_evname; 93 uint32_t pl_flags; 94 pmc_id_t pl_pmcid; 95 }; 96 97 struct pmclog_ev_pmcallocatedyn { 98 uint32_t pl_event; 99 char pl_evname[PMC_NAME_MAX]; 100 uint32_t pl_flags; 101 pmc_id_t pl_pmcid; 102 }; 103 104 struct pmclog_ev_pmcattach { 105 pmc_id_t pl_pmcid; 106 pid_t pl_pid; 107 char pl_pathname[PATH_MAX]; 108 }; 109 110 struct pmclog_ev_pmcdetach { 111 pmc_id_t pl_pmcid; 112 pid_t pl_pid; 113 }; 114 115 struct pmclog_ev_proccsw { 116 pid_t pl_pid; 117 pid_t pl_tid; 118 pmc_id_t pl_pmcid; 119 pmc_value_t pl_value; 120 }; 121 122 struct pmclog_ev_procexec { 123 pid_t pl_pid; 124 pmc_id_t pl_pmcid; 125 uintfptr_t pl_entryaddr; 126 char pl_pathname[PATH_MAX]; 127 }; 128 129 struct pmclog_ev_procexit { 130 uint32_t pl_pid; 131 pmc_id_t pl_pmcid; 132 pmc_value_t pl_value; 133 }; 134 135 struct pmclog_ev_procfork { 136 pid_t pl_oldpid; 137 pid_t pl_newpid; 138 }; 139 140 struct pmclog_ev_sysexit { 141 pid_t pl_pid; 142 }; 143 144 struct pmclog_ev_userdata { 145 uint32_t pl_userdata; 146 }; 147 148 struct pmclog_ev { 149 enum pmclog_state pl_state; /* state after 'get_event()' */ 150 off_t pl_offset; /* byte offset in stream */ 151 size_t pl_count; /* count of records so far */ 152 struct timespec pl_ts; /* log entry timestamp */ 153 enum pmclog_type pl_type; /* type of log entry */ 154 union { /* log entry data */ 155 struct pmclog_ev_callchain pl_cc; 156 struct pmclog_ev_closelog pl_cl; 157 struct pmclog_ev_dropnotify pl_dn; 158 struct pmclog_ev_initialize pl_i; 159 struct pmclog_ev_map_in pl_mi; 160 struct pmclog_ev_map_out pl_mo; 161 struct pmclog_ev_pmcallocate pl_a; 162 struct pmclog_ev_pmcallocatedyn pl_ad; 163 struct pmclog_ev_pmcattach pl_t; 164 struct pmclog_ev_pmcdetach pl_d; 165 struct pmclog_ev_proccsw pl_c; 166 struct pmclog_ev_procexec pl_x; 167 struct pmclog_ev_procexit pl_e; 168 struct pmclog_ev_procfork pl_f; 169 struct pmclog_ev_sysexit pl_se; 170 struct pmclog_ev_userdata pl_u; 171 } pl_u; 172 }; 173 174 #define PMCLOG_FD_NONE (-1) 175 176 __BEGIN_DECLS 177 void *pmclog_open(int _fd); 178 int pmclog_feed(void *_cookie, char *_data, int _len); 179 int pmclog_read(void *_cookie, struct pmclog_ev *_ev); 180 void pmclog_close(void *_cookie); 181 __END_DECLS 182 183 #endif 184 185