X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/36401178fd6817c043cc00b0c00c7f723e58efae..d9a64523371fa019c4575bb400cbbc3a50ac9903:/bsd/sys/fasttrap_impl.h diff --git a/bsd/sys/fasttrap_impl.h b/bsd/sys/fasttrap_impl.h index 0570f0c5e..863e6037e 100644 --- a/bsd/sys/fasttrap_impl.h +++ b/bsd/sys/fasttrap_impl.h @@ -20,7 +20,7 @@ */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -28,7 +28,7 @@ #define _FASTTRAP_IMPL_H /* - * #pragma ident "@(#)fasttrap_impl.h 1.12 06/06/12 SMI" + * #pragma ident "@(#)fasttrap_impl.h 1.14 08/04/09 SMI" */ #include @@ -38,7 +38,8 @@ #include #include -#define proc_t struct proc +/* Solaris proc_t is the struct. Darwin's proc_t is a pointer to it. */ +#define proc_t struct proc /* Steer clear of the Darwin typedef for proc_t */ #ifdef __cplusplus extern "C" { @@ -52,7 +53,9 @@ extern "C" { * providers. Those providers are each represented by a fasttrap_provider_t. * All providers for a given process have a pointer to a shared * fasttrap_proc_t. The fasttrap_proc_t has two states: active or defunct. - * It becomes defunct when the process performs an exit or an exec. + * When the count of active providers goes to zero it becomes defunct; a + * provider drops its active count when it is removed individually or as part + * of a mass removal when a process exits or performs an exec. * * Each probe is represented by a fasttrap_probe_t which has a pointer to * its associated provider as well as a list of fasttrap_id_tp_t structures @@ -61,8 +64,8 @@ extern "C" { * and it contains two lists of fasttrap_id_t structures (to be fired pre- * and post-instruction emulation) that identify the probes attached to the * tracepoint. Tracepoints also have a pointer to the fasttrap_proc_t for the - * process they trace which is used when looking up a tracepoint both at - * probe fire time and when enabling and disabling probes. + * process they trace which is used when looking up a tracepoint both when a + * probe fires and when enabling and disabling probes. * * It's important to note that probes are preallocated with the necessary * number of tracepoints, but that tracepoints can be shared by probes and @@ -79,9 +82,9 @@ extern "C" { typedef struct fasttrap_proc { pid_t ftpc_pid; /* process ID for this proc */ - uint_t ftpc_defunct; /* denotes a lame duck proc */ - uint64_t ftpc_count; /* reference count */ - lck_mtx_t ftpc_mtx; /* proc lock */ + uint64_t ftpc_acount; /* count of active providers */ + uint64_t ftpc_rcount; /* count of extant providers */ + lck_mtx_t ftpc_mtx; /* lock on all but acount */ struct fasttrap_proc *ftpc_next; /* next proc in hash chain */ } fasttrap_proc_t; @@ -94,6 +97,7 @@ typedef struct fasttrap_provider { uint_t ftp_retired; /* mark when retired */ lck_mtx_t ftp_mtx; /* provider lock */ lck_mtx_t ftp_cmtx; /* lock on creating probes */ + uint64_t ftp_pcount; /* probes in provider count */ uint64_t ftp_rcount; /* enabled probes ref count */ uint64_t ftp_ccount; /* consumers creating probes */ uint64_t ftp_mcount; /* meta provider count */ @@ -127,6 +131,7 @@ struct fasttrap_probe { uint8_t *ftp_argmap; /* native to translated args */ uint8_t ftp_nargs; /* translated argument count */ uint8_t ftp_enabled; /* is this probe enabled */ + uint8_t ftp_triggered; char *ftp_xtypes; /* translated types index */ char *ftp_ntypes; /* native types index */ fasttrap_id_tp_t ftp_tps[1]; /* flexible array */ @@ -168,19 +173,14 @@ typedef struct fasttrap_hash { #define fasttrap_fuword32 fuword32 #define fasttrap_suword32 suword32 -#if defined __APPLE__ /* - * xnu runs in 32 bit mode even when supporting 64 bit processes. We need - * to make size explicit. + * APPLE NOTE: xnu supports both 32bit and 64bit user processes. + * We need to make size explicit. */ #define fasttrap_fuword64 fuword64 #define fasttrap_suword64 suword64 #define fasttrap_fuword64_noerr fuword64_noerr #define fasttrap_fuword32_noerr fuword32_noerr -#else -#define fasttrap_fulword fulword -#define fasttrap_sulword sulword -#endif extern void fasttrap_sigtrap(proc_t *, uthread_t, user_addr_t); @@ -190,6 +190,8 @@ extern fasttrap_hash_t fasttrap_tpoints; #define FASTTRAP_TPOINTS_INDEX(pid, pc) \ (((pc) / sizeof (fasttrap_instr_t) + (pid)) & fasttrap_tpoints.fth_mask) +extern void fasttrap_tracepoint_retire(proc_t *p, fasttrap_tracepoint_t *tp); + /* * Must be implemented by fasttrap_isa.c */ @@ -198,12 +200,12 @@ extern int fasttrap_tracepoint_init(proc_t *, fasttrap_tracepoint_t *, extern int fasttrap_tracepoint_install(proc_t *, fasttrap_tracepoint_t *); extern int fasttrap_tracepoint_remove(proc_t *, fasttrap_tracepoint_t *); -#if defined (__ppc__) || defined (__ppc64__) -extern int fasttrap_pid_probe(ppc_saved_state_t *regs); -extern int fasttrap_return_probe(ppc_saved_state_t* regs); -#elif defined (__i386__) || defined(__x86_64__) +#if defined(__x86_64__) extern int fasttrap_pid_probe(x86_saved_state_t *regs); extern int fasttrap_return_probe(x86_saved_state_t* regs); +#elif defined(__arm__) || defined(__arm64__) +extern int fasttrap_pid_probe(arm_saved_state_t *rp); +extern int fasttrap_return_probe(arm_saved_state_t *regs); #else #error architecture not supported #endif @@ -211,6 +213,7 @@ extern int fasttrap_return_probe(x86_saved_state_t* regs); extern uint64_t fasttrap_pid_getarg(void *, dtrace_id_t, void *, int, int); extern uint64_t fasttrap_usdt_getarg(void *, dtrace_id_t, void *, int, int); + #ifdef __cplusplus } #endif