1#!/usr/bin/sh 2# 3# CDDL HEADER START 4# 5# The contents of this file are subject to the terms of the 6# Common Development and Distribution License, Version 1.0 only 7# (the "License"). You may not use this file except in compliance 8# with the License. 9# 10# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 11# or http://www.opensolaris.org/os/licensing. 12# See the License for the specific language governing permissions 13# and limitations under the License. 14# 15# When distributing Covered Code, include this CDDL HEADER in each 16# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 17# If applicable, add the following below this CDDL HEADER, with the 18# fields enclosed by brackets "[]" replaced with your own identifying 19# information: Portions Copyright [yyyy] [name of copyright owner] 20# 21# CDDL HEADER END 22# 23# 24# Copyright (c) 1994-2000 by Sun Microsystems, Inc. 25# All rights reserved. 26# 27#ident "%Z%%M% %I% %E% SMI" 28 29cat <<ENDSTR 30/* 31 * Copyright (c) 1994, by Sun Microsytems, Inc. 32 */ 33 34#ifndef _SYS_TNF_PROBE_H 35#define _SYS_TNF_PROBE_H 36 37#pragma ident "%Z%tnf_probe.h %I% %E% SMI" 38 39#include <sys/tnf_writer.h> 40 41#ifdef __cplusplus 42extern "C" { 43#endif 44 45/* 46 * These macros are used to convert the __LINE__ directive to a 47 * string in the probe macros below. 48 */ 49 50#define TNF_STRINGIFY(x) #x 51#define TNF_STRINGVALUE(x) TNF_STRINGIFY(x) 52 53/* 54 * Alignment of tnf_ref32_t 55 */ 56 57struct _tnf_ref32_align { 58 char c; 59 tnf_ref32_t t; 60}; 61#define TNF_REF32_ALIGN TNF_OFFSETOF(struct _tnf_ref32_align, t) 62 63/* 64 * Probe versioning 65 */ 66 67struct tnf_probe_version { 68 size_t version_size; /* sizeof(struct tnf_probe_version) */ 69 size_t probe_control_size; /* sizeof(tnf_probe_control_t) */ 70}; 71 72extern struct tnf_probe_version __tnf_probe_version_1; 73#pragma weak __tnf_probe_version_1 74 75/* 76 * Typedefs 77 */ 78 79typedef struct tnf_probe_control tnf_probe_control_t; 80typedef struct tnf_probe_setup tnf_probe_setup_t; 81 82/* returns pointer to buffer */ 83typedef void * (*tnf_probe_test_func_t)(void *, 84 tnf_probe_control_t *, 85 tnf_probe_setup_t *); 86 87/* returns buffer pointer */ 88typedef void * (*tnf_probe_alloc_func_t)(tnf_ops_t *, /* tpd */ 89 tnf_probe_control_t *, 90 tnf_probe_setup_t *); 91 92typedef void (*tnf_probe_func_t)(tnf_probe_setup_t *); 93 94/* 95 * Probe argument block 96 */ 97 98struct tnf_probe_setup { 99 tnf_ops_t *tpd_p; 100 void *buffer_p; 101 tnf_probe_control_t *probe_p; 102}; 103 104/* 105 * Probe control block 106 */ 107 108struct tnf_probe_control { 109 const struct tnf_probe_version *version; 110 tnf_probe_control_t *next; 111 tnf_probe_test_func_t test_func; 112 tnf_probe_alloc_func_t alloc_func; 113 tnf_probe_func_t probe_func; 114 tnf_probe_func_t commit_func; 115 tnf_uint32_t index; 116 const char *attrs; 117 tnf_tag_data_t ***slot_types; 118 unsigned long tnf_event_size; 119}; 120 121#ifdef _KERNEL 122 123#define TNF_NEXT_INIT 0 124 125#else 126 127#define TNF_NEXT_INIT -1 128 129#endif /* _KERNEL */ 130 131/* 132 * TNF Type extension 133 */ 134 135#ifdef NPROBE 136 137#define TNF_DECLARE_RECORD(ctype, record) \\ 138 typedef tnf_reference_t record##_t 139 140#else 141 142#define TNF_DECLARE_RECORD(ctype, record) \\ 143 typedef tnf_reference_t record##_t; \\ 144 extern tnf_tag_data_t *record##_tag_data; \\ 145 extern record##_t record(tnf_ops_t *, ctype *, tnf_reference_t) 146 147#endif /* NPROBE */ 148 149ENDSTR 150 151# 152# The following code generates the five type extension macros 153# 154for i in 1 2 3 4 5; do 155 echo "#ifdef NPROBE\n" 156 echo "/* CSTYLED */" 157 echo "#define TNF_DEFINE_RECORD_$i(ctype, ctype_record\c" 158 j=1; while [ $j -le $i ]; do 159 echo ", t$j, n$j\c" 160 j=`expr $j + 1` 161 done 162 echo ")\n" 163 echo "#else\n" 164 echo "/* CSTYLED */" 165 echo "#define TNF_DEFINE_RECORD_$i(ctype, ctype_record\c" 166 j=1; while [ $j -le $i ]; do 167 echo ", t$j, n$j\c" 168 j=`expr $j + 1` 169 done 170 echo ") \\" 171 echo "typedef struct { \\" 172 echo " tnf_tag_t tag; \\" 173 j=1; while [ $j -le $i ]; do 174 echo " t$j##_t data_$j; \\" 175 j=`expr $j + 1` 176 done 177 echo "} ctype_record##_prototype_t; \\" 178 echo "static tnf_tag_data_t **ctype_record##_type_slots[] = { \\" 179 echo " &tnf_tag_tag_data, \\" 180 j=1; while [ $j -le $i ]; do 181 echo " &t$j##_tag_data, \\" 182 j=`expr $j + 1` 183 done 184 echo " 0 }; \\"; 185 echo "static char *ctype_record##_slot_names[] = { \\"; 186 echo " \"tnf_tag\", \\" 187 j=1; while [ $j -le $i ]; do 188 echo " \"\"#n$j, \\" 189 j=`expr $j + 1` 190 done 191 echo " 0 }; \\" 192 echo "static tnf_tag_data_t ctype_record##_tag_data_rec = { \\" 193 echo " TNF_TAG_VERSION, &tnf_struct_tag_1, \\" 194 echo " 0, #ctype_record, &tnf_user_struct_properties, \\" 195 echo " sizeof (ctype_record##_prototype_t), \\" 196 echo " TNF_REF32_ALIGN, \\" 197 echo " sizeof (ctype_record##_t), TNF_STRUCT, 0, \\" 198 echo " ctype_record##_type_slots, ctype_record##_slot_names \\" 199 echo "}; \\" 200 echo "tnf_tag_data_t *ctype_record##_tag_data = \\" 201 echo " &ctype_record##_tag_data_rec; \\" 202 echo "ctype_record##_t \\" 203 echo "ctype_record(tnf_ops_t *ops, ctype * the_ctype, \\" 204 echo " tnf_reference_t reference) \\" 205 echo "{ \\" 206 echo " tnf_tag_data_t *metatag_data; \\" 207 echo " tnf_record_p metatag_index; \\" 208 echo " ctype_record##_prototype_t *buffer; \\" 209 echo " \\" 210 echo " if (the_ctype == NULL) \\" 211 echo " return (0); \\" 212 echo " buffer = (ctype_record##_prototype_t *) tnf_allocate(ops, \\" 213 echo " sizeof (ctype_record##_prototype_t)); \\" 214 echo " if (buffer == NULL) \\" 215 echo " return (0); \\" 216 echo " \\" 217 echo " metatag_data = ctype_record##_tag_data; \\" 218 echo " metatag_index = metatag_data->tag_index ? \\" 219 echo " metatag_data->tag_index: \\" 220 echo " metatag_data->tag_desc(ops, metatag_data); \\" 221 echo " buffer->tag = tnf_tag(ops, metatag_index, \\" 222 echo " (tnf_reference_t) &buffer->tag); \\" 223 j=1; while [ $j -le $i ]; do 224 echo " buffer->data_$j = t$j(ops, the_ctype->n$j, \\" 225 echo " (tnf_reference_t) &(buffer->data_$j)); \\" 226 j=`expr $j + 1` 227 done 228 echo " return (tnf_ref32(ops, (tnf_record_p) buffer, reference)); \\" 229 echo "}\n" 230 echo "#endif /* NPROBE */" 231 echo "" 232done 233 234echo "/*" 235echo " * Probe Macros" 236echo " */" 237echo "" 238 239# 240# The following code generates the six probe macros ... 241# 242for i in 0 1 2 3 4 5; do 243 echo "#ifdef NPROBE\n" 244 echo "/* CSTYLED */" 245 echo "#define TNF_PROBE_$i(namearg, keysarg, detail\c" 246 j=1; while [ $j -le $i ]; do 247 echo ", type_$j, namearg_$j, valarg_$j\c" 248 j=`expr $j + 1` 249 done 250 echo ") \\" 251 echo "\t\t((void)0)\n" 252 echo "#else\n" 253 echo "/* CSTYLED */" 254 echo "#define TNF_PROBE_$i(namearg, keysarg, detail\c" 255 j=1; while [ $j -le $i ]; do 256 echo ", type_$j, namearg_$j, valarg_$j\c"; 257 j=`expr $j + 1` 258 done 259 echo ") \\" 260 echo "{ \\" 261 echo " struct tnf_v_buf_$i { \\" 262 echo " tnf_probe_event_t probe_event; \\" 263 echo " tnf_time_delta_t time_delta; \\" 264 j=1; while [ $j -le $i ]; do 265 echo " type_$j##_t data_$j; \\" 266 j=`expr $j + 1` 267 done 268 echo " }; \\" 269 echo " static tnf_tag_data_t ** tnf_v_##namearg##_info[] = { \\" 270 echo " &tnf_probe_event_tag_data, \\" 271 echo " &tnf_time_delta_tag_data, \\" 272 j=1; while [ $j -le $i ]; do 273 echo " &type_$j##_tag_data, \\" 274 j=`expr $j + 1` 275 done 276 echo " 0 }; \\" 277 echo " static struct tnf_probe_control tnf_v_##namearg##_probe = { \\" 278 echo " &__tnf_probe_version_1, \\" 279 echo " (tnf_probe_control_t *) TNF_NEXT_INIT, \\" 280 echo " (tnf_probe_test_func_t) 0, \\" 281 echo " (tnf_probe_alloc_func_t) 0, \\" 282 echo " (tnf_probe_func_t) 0, \\" 283 echo " (tnf_probe_func_t) 0, \\" 284 echo " (tnf_uint32_t) 0, \\" 285 echo " /* attribute string */ \\" 286 echo " \"name \" TNF_STRINGVALUE(namearg) \";\" \\" 287# echo " \"slots \"\c" 288# j=1; while [ $j -le $i ]; do 289# echo " #namearg_$j \" \"\c" 290# j=`expr $j + 1` 291 echo " \"slots \" \\" 292 j=1; while [ $j -le $i ]; do 293 echo " \"\"#namearg_$j\" \" \\" 294 j=`expr $j + 1` 295 done 296 echo " \";\" \\" 297 echo " \"keys \" keysarg \";\" \\" 298 echo " \"file \" __FILE__ \";\" \\" 299 echo " \"line \" TNF_STRINGVALUE(__LINE__) \";\" \\" 300 echo " detail, \\" 301 echo " tnf_v_##namearg##_info, \\" 302 echo " sizeof (struct tnf_v_buf_$i) \\" 303 echo " }; \\" 304 echo " tnf_probe_control_t *tnf_v_probe_p = &tnf_v_##namearg##_probe; \\" 305 echo " tnf_probe_test_func_t tnf_v_probe_test = tnf_v_probe_p->test_func; \\" 306 echo " tnf_probe_setup_t tnf_v_set_p; \\" 307 echo " struct tnf_v_buf_$i *tnf_v_probe_buffer; \\" 308 echo " \\" 309 echo " if (tnf_v_probe_test) { \\" 310 echo " tnf_v_probe_buffer = (struct tnf_v_buf_$i *) \\" 311 echo " tnf_v_probe_test(0, tnf_v_probe_p, &tnf_v_set_p); \\" 312 echo " if (tnf_v_probe_buffer) { \\" 313 j=1; while [ $j -le $i ]; do 314 echo " tnf_v_probe_buffer->data_$j = type_$j( \\" 315 echo " tnf_v_set_p.tpd_p, valarg_$j, \\" 316 echo " (tnf_reference_t) &(tnf_v_probe_buffer->data_$j)); \\" 317 j=`expr $j + 1` 318 done 319 echo " (tnf_v_probe_p->probe_func)(&tnf_v_set_p); \\" 320 echo " } \\" 321 echo " } \\" 322 echo "}\n" 323 echo "#endif /* NPROBE */" 324 echo "" 325 done 326 327echo "/*" 328echo " * Debug Probe Macros (contain an additional \"debug\" attribute)" 329echo " */" 330echo "" 331 332# 333# The following code generates the six debug probe macros ... 334# 335for i in 0 1 2 3 4 5; do 336 echo "#if defined(TNF_DEBUG)\n" 337 echo "/* CSTYLED */" 338 echo "#define TNF_PROBE_${i}_DEBUG(namearg, keysarg, detail\c" 339 j=1; while [ $j -le $i ]; do 340 echo ", type_$j, namearg_$j, valarg_$j\c"; 341 j=`expr $j + 1` 342 done 343 echo ")\t\c" 344 echo "TNF_PROBE_$i(namearg, keysarg, \"debug;\" detail\c" 345 j=1; while [ $j -le $i ]; do 346 echo ", type_$j, namearg_$j, valarg_$j\c" 347 j=`expr $j + 1` 348 done 349 echo ")\n" 350 echo "#else\n" 351 echo "/* CSTYLED */" 352 echo "#define TNF_PROBE_${i}_DEBUG(namearg, keysarg, detail\c" 353 j=1; while [ $j -le $i ]; do 354 echo ", type_$j, namearg_$j, valarg_$j\c" 355 j=`expr $j + 1` 356 done 357 echo ") \\" 358 echo "\t\t((void)0)\n" 359 echo "#endif /* defined(TNF_DEBUG) */" 360 echo "" 361 done 362 363 echo "#ifdef __cplusplus" 364 echo "}" 365 echo "#endif" 366 echo "" 367 echo "#endif /* _SYS_TNF_PROBE_H */" 368