2  * Copyright (c) 2000-2003 Apple Computer, Inc. All rights reserved. 
   4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 
   6  * This file contains Original Code and/or Modifications of Original Code 
   7  * as defined in and that are subject to the Apple Public Source License 
   8  * Version 2.0 (the 'License'). You may not use this file except in 
   9  * compliance with the License. The rights granted to you under the License 
  10  * may not be used to create, or enable the creation or redistribution of, 
  11  * unlawful or unlicensed copies of an Apple operating system, or to 
  12  * circumvent, violate, or enable the circumvention or violation of, any 
  13  * terms of an Apple operating system software license agreement. 
  15  * Please obtain a copy of the License at 
  16  * http://www.opensource.apple.com/apsl/ and read it before using this file. 
  18  * The Original Code and all software distributed under the License are 
  19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 
  22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  23  * Please see the License for the specific language governing rights and 
  24  * limitations under the License. 
  26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 
  29 #ifndef _KERN_TRACE_H_ 
  30 #define _KERN_TRACE_H_ 
  32 /* pthread kext, or userspace, kdebug trace points. Defined here and output to 
  33  * /usr/share/misc/pthread.codes during build. 
  36 // userspace trace points force slow-paths, so must be compiled in 
  37 #define ENABLE_USERSPACE_TRACE 0 
  39 // pthread tracing subclasses 
  40 # define _TRACE_SUB_DEFAULT 0 
  41 # define _TRACE_SUB_WORKQUEUE 1 
  42 // WQ_TRACE_REQUESTS_SUBCLASS is 2, in xnu 
  43 # define _TRACE_SUB_MUTEX 3 
  44 # define _TRACE_SUB_CONDVAR 4 
  46 #ifndef _PTHREAD_BUILDING_CODES_ 
  48 #include <sys/kdebug.h> 
  51 #define DBG_PTHREAD DBG_WORKQUEUE 
  55 #include <vm/vm_kern.h> 
  57 extern uint32_t pthread_debug_tracing
; 
  62     vm_offset_t unslid_ptr
; 
  63     vm_kernel_unslide_or_perm_external(ptr
, &unslid_ptr
); 
  64     return (void*)unslid_ptr
; 
  67 # define PTHREAD_TRACE(x,a,b,c,d) \ 
  68         { if (pthread_debug_tracing) { KERNEL_DEBUG_CONSTANT(TRACE_##x, a, b, c, d, 0); } } 
  70 # define PTHREAD_TRACE_WQ(x,a,b,c,d) \ 
  71         { if (pthread_debug_tracing) { KERNEL_DEBUG_CONSTANT(TRACE_##x, VM_UNSLIDE(a), b, c, d, 0); } } 
  73 # define PTHREAD_TRACE_WQ_REQ(x,a,b,c,d,e) \ 
  74         { if (pthread_debug_tracing) { KERNEL_DEBUG_CONSTANT(TRACE_##x, VM_UNSLIDE(a), VM_UNSLIDE(b), c, d, e); } } 
  78 #if ENABLE_USERSPACE_TRACE 
  79 # include <sys/kdebug.h> 
  80 # define PTHREAD_TRACE(x, a, b, c, d) kdebug_trace(TRACE_##x, a, b, c, d) 
  81 #else // ENABLE_USERSPACE_TRACE 
  82 # define PTHREAD_TRACE(x, a, b, c, d) do { } while(0) 
  83 #endif // ENABLE_USERSPACE_TRACE 
  87 # define TRACE_CODE(name, subclass, code) \ 
  88         static const int TRACE_##name = KDBG_CODE(DBG_PTHREAD, subclass, code) 
  90 #else // _PTHREAD_BUILDING_CODES_ 
  91 /* When not included as a header, this file is pre-processed into perl source to generate 
  92  * the pthread.codes file during build. 
  94 # define DBG_PTHREAD 9 
  97 # define TRACE_CODE(name, subclass, code) \ 
  98         printf("0x%x\t%s\n", ((DBG_PTHREAD << 24) | ((subclass & 0xff) << 16) | ((code & 0x3fff) << 2)), STR(name)) 
  99 #endif // _PTHREAD_BUILDING_CODES_ 
 101 /* These defines translate into TRACE_<name> when used in source code, and are 
 102  * pre-processed out to a codes file by the build system. 
 105 // "default" trace points 
 106 TRACE_CODE(pthread_thread_create
, _TRACE_SUB_DEFAULT
, 0x10); 
 107 TRACE_CODE(pthread_thread_terminate
, _TRACE_SUB_DEFAULT
, 0x20); 
 108 TRACE_CODE(pthread_set_qos_self
, _TRACE_SUB_DEFAULT
, 0x30); 
 110 // workqueue trace points 
 111 TRACE_CODE(wq_pthread_exit
, _TRACE_SUB_WORKQUEUE
, 0x01); 
 112 TRACE_CODE(wq_workqueue_exit
, _TRACE_SUB_WORKQUEUE
, 0x02); 
 113 TRACE_CODE(wq_runthread
, _TRACE_SUB_WORKQUEUE
, 0x03); 
 114 TRACE_CODE(wq_runitem
, _TRACE_SUB_WORKQUEUE
, 0x04); 
 115 TRACE_CODE(wq_thread_block
, _TRACE_SUB_WORKQUEUE
, 0x9); 
 116 TRACE_CODE(wq_thactive_update
, _TRACE_SUB_WORKQUEUE
, 0xa); 
 117 TRACE_CODE(wq_add_timer
, _TRACE_SUB_WORKQUEUE
, 0xb); 
 118 TRACE_CODE(wq_start_add_timer
, _TRACE_SUB_WORKQUEUE
, 0x0c); 
 119 TRACE_CODE(wq_override_start
, _TRACE_SUB_WORKQUEUE
, 0x12); 
 120 TRACE_CODE(wq_override_end
, _TRACE_SUB_WORKQUEUE
, 0x13); 
 121 TRACE_CODE(wq_override_dispatch
, _TRACE_SUB_WORKQUEUE
, 0x14); 
 122 TRACE_CODE(wq_override_reset
, _TRACE_SUB_WORKQUEUE
, 0x15); 
 123 TRACE_CODE(wq_thread_create_failed
, _TRACE_SUB_WORKQUEUE
, 0x1d); 
 124 TRACE_CODE(wq_thread_create
, _TRACE_SUB_WORKQUEUE
, 0x1f); 
 125 TRACE_CODE(wq_run_threadreq
, _TRACE_SUB_WORKQUEUE
, 0x20); 
 126 TRACE_CODE(wq_run_threadreq_mgr_merge
, _TRACE_SUB_WORKQUEUE
, 0x21); 
 127 TRACE_CODE(wq_run_threadreq_req_select
, _TRACE_SUB_WORKQUEUE
, 0x22); 
 128 TRACE_CODE(wq_run_threadreq_thread_select
, _TRACE_SUB_WORKQUEUE
, 0x23); 
 129 TRACE_CODE(wq_thread_reset_priority
, _TRACE_SUB_WORKQUEUE
, 0x24); 
 130 TRACE_CODE(wq_constrained_admission
, _TRACE_SUB_WORKQUEUE
, 0x25); 
 131 TRACE_CODE(wq_wqops_reqthreads
, _TRACE_SUB_WORKQUEUE
, 0x26); 
 132 TRACE_CODE(wq_kevent_reqthreads
, _TRACE_SUB_WORKQUEUE
, 0x27); 
 133 TRACE_CODE(wq_thread_park
, _TRACE_SUB_WORKQUEUE
, 0x28); 
 134 TRACE_CODE(wq_thread_squash
, _TRACE_SUB_WORKQUEUE
, 0x29); 
 136 // synch trace points 
 137 TRACE_CODE(psynch_mutex_ulock
, _TRACE_SUB_MUTEX
, 0x0); 
 138 TRACE_CODE(psynch_mutex_utrylock_failed
, _TRACE_SUB_MUTEX
, 0x1); 
 139 TRACE_CODE(psynch_mutex_uunlock
, _TRACE_SUB_MUTEX
, 0x2); 
 140 TRACE_CODE(psynch_ksyn_incorrect_owner
, _TRACE_SUB_MUTEX
, 0x3); 
 141 TRACE_CODE(psynch_mutex_lock_updatebits
, _TRACE_SUB_MUTEX
, 0x4); 
 142 TRACE_CODE(psynch_mutex_unlock_updatebits
, _TRACE_SUB_MUTEX
, 0x5); 
 143 TRACE_CODE(psynch_mutex_clearprepost
, _TRACE_SUB_MUTEX
, 0x6); 
 144 TRACE_CODE(psynch_mutex_kwqallocate
, _TRACE_SUB_MUTEX
, 0x7); 
 145 TRACE_CODE(psynch_mutex_kwqdeallocate
, _TRACE_SUB_MUTEX
, 0x8); 
 146 TRACE_CODE(psynch_mutex_kwqprepost
, _TRACE_SUB_MUTEX
, 0x9); 
 147 TRACE_CODE(psynch_mutex_markprepost
, _TRACE_SUB_MUTEX
, 0x10); 
 148 TRACE_CODE(psynch_mutex_kwqcollision
, _TRACE_SUB_MUTEX
, 0x11); 
 149 TRACE_CODE(psynch_ffmutex_lock_updatebits
, _TRACE_SUB_MUTEX
, 0x12); 
 150 TRACE_CODE(psynch_ffmutex_unlock_updatebits
, _TRACE_SUB_MUTEX
, 0x13); 
 151 TRACE_CODE(psynch_ffmutex_wake
, _TRACE_SUB_MUTEX
, 0x14); 
 152 TRACE_CODE(psynch_mutex_kwqsignal
, _TRACE_SUB_MUTEX
, 0x15); 
 153 TRACE_CODE(psynch_ffmutex_wait
, _TRACE_SUB_MUTEX
, 0x16); 
 154 TRACE_CODE(psynch_mutex_kwqwait
, _TRACE_SUB_MUTEX
, 0x17); 
 156 TRACE_CODE(psynch_cvar_kwait
, _TRACE_SUB_CONDVAR
, 0x0); 
 157 TRACE_CODE(psynch_cvar_clrprepost
, _TRACE_SUB_CONDVAR
, 0x1); 
 158 TRACE_CODE(psynch_cvar_freeitems
, _TRACE_SUB_CONDVAR
, 0x2); 
 159 TRACE_CODE(psynch_cvar_signal
, _TRACE_SUB_CONDVAR
, 0x3); 
 160 TRACE_CODE(psynch_cvar_broadcast
, _TRACE_SUB_CONDVAR
, 0x5); 
 161 TRACE_CODE(psynch_cvar_zeroed
, _TRACE_SUB_CONDVAR
, 0x6); 
 162 TRACE_CODE(psynch_cvar_updateval
, _TRACE_SUB_CONDVAR
, 0x7); 
 164 #endif // _KERN_TRACE_H_