4  * The contents of this file are subject to the terms of the 
   5  * Common Development and Distribution License (the "License"). 
   6  * You may not use this file except in compliance with the License. 
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 
   9  * or http://www.opensolaris.org/os/licensing. 
  10  * See the License for the specific language governing permissions 
  11  * and limitations under the License. 
  13  * When distributing Covered Code, include this CDDL HEADER in each 
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 
  15  * If applicable, add the following below this CDDL HEADER, with the 
  16  * fields enclosed by brackets "[]" replaced with your own identifying 
  17  * information: Portions Copyright [yyyy] [name of copyright owner] 
  23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved. 
  24  * Use is subject to license terms. 
  27 #ifndef _FASTTRAP_IMPL_H 
  28 #define _FASTTRAP_IMPL_H 
  31  * #pragma ident        "@(#)fasttrap_impl.h    1.14    08/04/09 SMI" 
  34 #include <sys/types.h> 
  35 #include <sys/dtrace.h> 
  38 #include <sys/fasttrap.h> 
  39 #include <sys/fasttrap_isa.h> 
  41 /* Solaris proc_t is the struct. Darwin's proc_t is a pointer to it. */ 
  42 #define proc_t struct proc /* Steer clear of the Darwin typedef for proc_t */ 
  49  * Fasttrap Providers, Probes and Tracepoints 
  51  * Each Solaris process can have multiple providers -- the pid provider as 
  52  * well as any number of user-level statically defined tracing (USDT) 
  53  * providers. Those providers are each represented by a fasttrap_provider_t. 
  54  * All providers for a given process have a pointer to a shared 
  55  * fasttrap_proc_t. The fasttrap_proc_t has two states: active or defunct. 
  56  * When the count of active providers goes to zero it becomes defunct; a 
  57  * provider drops its active count when it is removed individually or as part 
  58  * of a mass removal when a process exits or performs an exec. 
  60  * Each probe is represented by a fasttrap_probe_t which has a pointer to 
  61  * its associated provider as well as a list of fasttrap_id_tp_t structures 
  62  * which are tuples combining a fasttrap_id_t and a fasttrap_tracepoint_t. 
  63  * A fasttrap_tracepoint_t represents the actual point of instrumentation 
  64  * and it contains two lists of fasttrap_id_t structures (to be fired pre- 
  65  * and post-instruction emulation) that identify the probes attached to the 
  66  * tracepoint. Tracepoints also have a pointer to the fasttrap_proc_t for the 
  67  * process they trace which is used when looking up a tracepoint both when a 
  68  * probe fires and when enabling and disabling probes. 
  70  * It's important to note that probes are preallocated with the necessary 
  71  * number of tracepoints, but that tracepoints can be shared by probes and 
  72  * swapped between probes. If a probe's preallocated tracepoint is enabled 
  73  * (and, therefore, the associated probe is enabled), and that probe is 
  74  * then disabled, ownership of that tracepoint may be exchanged for an 
  75  * unused tracepoint belonging to another probe that was attached to the 
  80  * APPLE NOTE: All kmutex_t's have been converted to lck_mtx_t 
  83 typedef struct fasttrap_proc 
{ 
  84         pid_t ftpc_pid
;                         /* process ID for this proc */ 
  85         uint64_t ftpc_acount
;                   /* count of active providers */ 
  86         uint64_t ftpc_rcount
;                   /* count of extant providers */ 
  87         lck_mtx_t ftpc_mtx
;                     /* lock on all but acount */ 
  88         struct fasttrap_proc 
*ftpc_next
;        /* next proc in hash chain */ 
  91 typedef struct fasttrap_provider 
{ 
  92         pid_t ftp_pid
;                          /* process ID for this prov */ 
  93         fasttrap_provider_type_t ftp_provider_type
;     /* type of this provider (usdt, pid, objc, oneshot) */ 
  94         char ftp_name
[DTRACE_PROVNAMELEN
];      /* prov name (w/o the pid) */ 
  95         dtrace_provider_id_t ftp_provid
;        /* DTrace provider handle */ 
  96         uint_t ftp_marked
;                      /* mark for possible removal */ 
  97         uint_t ftp_retired
;                     /* mark when retired */ 
  98         lck_mtx_t ftp_mtx
;                      /* provider lock */ 
  99         lck_mtx_t ftp_cmtx
;                     /* lock on creating probes */ 
 100         uint64_t ftp_rcount
;                    /* enabled probes ref count */ 
 101         uint64_t ftp_ccount
;                    /* consumers creating probes */ 
 102         uint64_t ftp_mcount
;                    /* meta provider count */ 
 103         fasttrap_proc_t 
*ftp_proc
;              /* shared proc for all provs */ 
 104         struct fasttrap_provider 
*ftp_next
;     /* next prov in hash chain */ 
 105 } fasttrap_provider_t
; 
 107 typedef struct fasttrap_id fasttrap_id_t
; 
 108 typedef struct fasttrap_probe fasttrap_probe_t
; 
 109 typedef struct fasttrap_tracepoint fasttrap_tracepoint_t
; 
 112         fasttrap_probe_t 
*fti_probe
;            /* referrring probe */ 
 113         fasttrap_id_t 
*fti_next
;                /* enabled probe list on tp */ 
 114         fasttrap_probe_type_t fti_ptype
;        /* probe type */ 
 117 typedef struct fasttrap_id_tp 
{ 
 118         fasttrap_id_t fit_id
; 
 119         fasttrap_tracepoint_t 
*fit_tp
; 
 122 struct fasttrap_probe 
{ 
 123         dtrace_id_t ftp_id
;                     /* DTrace probe identifier */ 
 124         pid_t ftp_pid
;                          /* pid for this probe */ 
 125         fasttrap_provider_t 
*ftp_prov
;          /* this probe's provider */ 
 126         user_addr_t ftp_faddr
;                  /* associated function's addr */ 
 127         size_t ftp_fsize
;                       /* associated function's size */ 
 128         uint64_t ftp_gen
;                       /* modification generation */ 
 129         uint64_t ftp_ntps
;                      /* number of tracepoints */ 
 130         uint8_t *ftp_argmap
;                    /* native to translated args */ 
 131         uint8_t ftp_nargs
;                      /* translated argument count */ 
 132         uint8_t ftp_enabled
;                    /* is this probe enabled */ 
 133         char *ftp_xtypes
;                       /* translated types index */ 
 134         char *ftp_ntypes
;                       /* native types index */ 
 135         fasttrap_id_tp_t ftp_tps
[1];            /* flexible array */ 
 138 #define FASTTRAP_ID_INDEX(id)   \ 
 139 ((fasttrap_id_tp_t *)(((char *)(id) - offsetof(fasttrap_id_tp_t, fit_id))) - \ 
 140 &(id)->fti_probe->ftp_tps[0]) 
 142 struct fasttrap_tracepoint 
{ 
 143         fasttrap_proc_t 
*ftt_proc
;              /* associated process struct */ 
 144         user_addr_t ftt_pc
;                     /* address of tracepoint */ 
 145         pid_t ftt_pid
;                          /* pid of tracepoint */ 
 146         fasttrap_machtp_t ftt_mtp
;              /* ISA-specific portion */ 
 147         fasttrap_id_t 
*ftt_ids
;                 /* NULL-terminated list */ 
 148         fasttrap_id_t 
*ftt_retids
;              /* NULL-terminated list */ 
 149         fasttrap_tracepoint_t 
*ftt_next
;        /* link in global hash */ 
 152 typedef struct fasttrap_bucket 
{ 
 153         lck_mtx_t ftb_mtx
;                      /* bucket lock */ 
 154         void *ftb_data
;                         /* data payload */ 
 156         uint8_t ftb_pad
[64 - sizeof (lck_mtx_t
) - sizeof (void *)]; 
 159 typedef struct fasttrap_hash 
{ 
 160         ulong_t fth_nent
;                       /* power-of-2 num. of entries */ 
 161         ulong_t fth_mask
;                       /* fth_nent - 1 */ 
 162         fasttrap_bucket_t 
*fth_table
;           /* array of buckets */ 
 166  * If at some future point these assembly functions become observable by 
 167  * DTrace, then these defines should become separate functions so that the 
 168  * fasttrap provider doesn't trigger probes during internal operations. 
 170 #define fasttrap_copyout        copyout 
 171 #define fasttrap_fuword32       fuword32 
 172 #define fasttrap_suword32       suword32 
 174 #if defined __APPLE__ 
 176  * xnu runs in 32 bit mode even when supporting 64 bit processes. We need 
 177  * to make size explicit. 
 179 #define fasttrap_fuword64       fuword64 
 180 #define fasttrap_suword64       suword64 
 181 #define fasttrap_fuword64_noerr fuword64_noerr 
 182 #define fasttrap_fuword32_noerr fuword32_noerr 
 184 #define fasttrap_fulword        fulword 
 185 #define fasttrap_sulword        sulword 
 188 extern void fasttrap_sigtrap(proc_t 
*, uthread_t
, user_addr_t
); 
 190 extern dtrace_id_t              fasttrap_probe_id
; 
 191 extern fasttrap_hash_t          fasttrap_tpoints
; 
 193 #define FASTTRAP_TPOINTS_INDEX(pid, pc) \ 
 194         (((pc) / sizeof (fasttrap_instr_t) + (pid)) & fasttrap_tpoints.fth_mask) 
 197  * Must be implemented by fasttrap_isa.c 
 199 extern int fasttrap_tracepoint_init(proc_t 
*, fasttrap_tracepoint_t 
*, 
 200     user_addr_t
, fasttrap_probe_type_t
); 
 201 extern int fasttrap_tracepoint_install(proc_t 
*, fasttrap_tracepoint_t 
*); 
 202 extern int fasttrap_tracepoint_remove(proc_t 
*, fasttrap_tracepoint_t 
*); 
 204 #if defined (__ppc__) || defined (__ppc64__) 
 205 extern int fasttrap_pid_probe(ppc_saved_state_t 
*regs
); 
 206 extern int fasttrap_return_probe(ppc_saved_state_t
* regs
); 
 207 #elif defined (__i386__) || defined(__x86_64__) 
 208 extern int fasttrap_pid_probe(x86_saved_state_t 
*regs
); 
 209 extern int fasttrap_return_probe(x86_saved_state_t
* regs
); 
 211 #error architecture not supported 
 214 extern uint64_t fasttrap_pid_getarg(void *, dtrace_id_t
, void *, int, int); 
 215 extern uint64_t fasttrap_usdt_getarg(void *, dtrace_id_t
, void *, int, int); 
 223 #endif  /* _FASTTRAP_IMPL_H */