xref: /xnu-11215/bsd/sys/sdt_impl.h (revision 5c2921b0)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef _SDT_IMPL_H
28 #define _SDT_IMPL_H
29 
30 #ifdef  __cplusplus
31 extern "C" {
32 #endif
33 
34 extern const char *sdt_prefix;
35 
36 typedef struct sdt_probedesc {
37 	char                    *sdpd_name;     /* name of this probe */
38 	int                     sdpd_namelen;
39 	char                    *sdpd_func;     /* APPLE NOTE: function name */
40 	const char              *sdpd_prov;     /* APPLE NOTE: provider name */
41 	unsigned long           sdpd_offset;    /* offset of call in text */
42 	struct sdt_probedesc    *sdpd_next;     /* next static probe */
43 } sdt_probedesc_t;
44 
45 #ifdef  __cplusplus
46 }
47 #endif
48 
49 #ifdef  __cplusplus
50 extern "C" {
51 #endif
52 
53 #include <sys/dtrace.h>
54 
55 struct module {
56 	int sdt_nprobes;
57 	sdt_probedesc_t *sdt_probes;
58 };
59 
60 extern int sdt_invop(uintptr_t, uintptr_t *, uintptr_t);
61 extern uint64_t sdt_getarg(void *, dtrace_id_t, void *, int, int);
62 
63 void sdt_provide_module(void *, struct modctl *);
64 void sdt_early_init(void);
65 void sdt_load_machsect(struct modctl *ctl);
66 void sdt_init(void);
67 
68 extern int          sdt_probetab_size;
69 extern int          sdt_probetab_mask;
70 #define SDT_ADDR2NDX(addr)  ((((uintptr_t)(addr)) >> 4) & sdt_probetab_mask)
71 
72 
73 #if defined(__x86_64__)
74 typedef uint8_t sdt_instr_t;
75 #elif defined(__arm64__)
76 typedef uint32_t sdt_instr_t;
77 #else
78 #error Unknown implementation
79 #endif
80 
81 typedef struct sdt_provider {
82 	const char                      *sdtp_name;     /* name of provider */
83 	const char                      *sdtp_prefix;   /* prefix for probe names */
84 	dtrace_pattr_t          *sdtp_attr;     /* stability attributes */
85 	dtrace_provider_id_t    sdtp_id;        /* provider ID */
86 } sdt_provider_t;
87 
88 extern sdt_provider_t sdt_providers[];          /* array of providers */
89 
90 typedef struct sdt_probe {
91 	sdt_provider_t  *sdp_provider;          /* provider */
92 	char            *sdp_name;              /* name of probe */
93 	int             sdp_namelen;            /* length of allocated name */
94 	dtrace_id_t     sdp_id;                 /* probe ID */
95 	struct modctl   *sdp_ctl;               /* modctl for module */
96 	int             sdp_loadcnt;            /* load count for module */
97 	int             sdp_primary;            /* non-zero if primary mod */
98 	sdt_instr_t     *sdp_patchpoint;        /* patch point */
99 	sdt_instr_t     sdp_patchval;           /* instruction to patch */
100 	sdt_instr_t     sdp_savedval;           /* saved instruction value */
101 	struct sdt_probe *sdp_next;             /* next probe */
102 	struct sdt_probe *sdp_hashnext;         /* next on hash */
103 } sdt_probe_t;
104 
105 typedef struct sdt_argdesc {
106 	const char *sda_provider;               /* provider for arg */
107 	const char *sda_name;                   /* name of probe */
108 	const int sda_ndx;                      /* argument index */
109 	const int sda_mapping;                  /* mapping of argument */
110 	const char *sda_native;                 /* native type of argument */
111 	const char *sda_xlate;                  /* translated type of arg */
112 } sdt_argdesc_t;
113 
114 extern void sdt_getargdesc(void *, dtrace_id_t, void *, dtrace_argdesc_t *);
115 
116 #ifdef  __cplusplus
117 }
118 #endif
119 
120 #endif  /* _SDT_IMPL_H */
121