comDebug.h
1 /* Copyright (c) 1997,2011,2014 Apple Inc. 2 * 3 * comDebug.h 4 */ 5 6 #ifndef _COM_DEBUG_H_ 7 #define _COM_DEBUG_H_ 8 9 #ifdef __cplusplus 10 extern "C" { 11 #endif 12 13 /* 14 * enable general debugging printfs and error checking. 15 */ 16 #define COM_DEBUG 0 17 #if COM_DEBUG 18 #include <stdio.h> 19 20 #define ddprintf(x) printf x 21 #else 22 #define ddprintf(x) 23 #endif 24 25 /* 26 * block parsing debug 27 */ 28 #define COM_SCAN_DEBUG 0 29 #if COM_SCAN_DEBUG 30 #define scprintf(x) printf x 31 #else 32 #define scprintf(x) 33 #endif 34 35 /* 36 * 2nd-level comcrypt debug 37 */ 38 #define LEVEL2_DEBUG 0 39 #if LEVEL2_DEBUG 40 #include <stdio.h> 41 42 #define l2printf(x) printf x 43 #else 44 #define l2printf(x) 45 #endif 46 47 /* 48 * lookahead queue debug 49 */ 50 #define COM_LA_DEBUG 0 51 #define COM_LA_PRINTF 0 52 #if COM_LA_PRINTF 53 #define laprintf(x) printf x 54 #else 55 #define laprintf(x) 56 #endif 57 58 /* 59 * Statistics measurements. This is a private API. 60 */ 61 #if COM_DEBUG 62 #define COM_STATS 0 63 #else 64 #define COM_STATS 0 65 #endif 66 67 #if COM_STATS 68 69 /* 70 * Info obtained via a call to getComStats() 71 */ 72 typedef struct { 73 unsigned level1blocks; 74 unsigned plaintextBytes; 75 unsigned ciphertextBytes; 76 unsigned oneByteFrags; // 1st level only 77 unsigned twoByteFrags; // ditto 78 unsigned level2oneByteFrags; // second level only 79 unsigned level2twoByteFrags; // ditto 80 unsigned level2byteCode; // bytes, pre-encrypted 81 unsigned level2cipherText; // bytes, post-encrypt 82 unsigned level2blocks; // 2nd-level blocks 83 unsigned level2jmatch; // total jmatch (at first level) of 84 // 2nd level blocks 85 } comStats; 86 87 extern comStats _comStats; 88 #define incrComStat(stat, num) _comStats.stat += num; 89 90 #define incr1byteFrags(recursLevel) { \ 91 if(recursLevel == 1) { \ 92 incrComStat(level2oneByteFrags, 1); \ 93 } \ 94 else { \ 95 incrComStat(oneByteFrags, 1); \ 96 } \ 97 } 98 #define incr2byteFrags(recursLevel) { \ 99 if(recursLevel == 1) { \ 100 incrComStat(level2twoByteFrags, 1); \ 101 } \ 102 else { \ 103 incrComStat(twoByteFrags, 1); \ 104 } \ 105 } 106 107 extern void resetComStats(); 108 extern void getComStats(comStats *stats); 109 110 #else 111 #define incrComStat(stat, num) 112 #define incr1byteFrags(recursLevel) 113 #define incr2byteFrags(recursLevel) 114 #endif 115 116 /* 117 * Profiling measurement. A private API when enabled. 118 */ 119 #if COM_DEBUG 120 #define COM_PROFILE 0 121 #else 122 #define COM_PROFILE 0 123 #endif 124 125 #if COM_PROFILE 126 127 #include <kern/time_stamp.h> 128 129 /* 130 * Global profiling enable. It turns out the the cost of doing the 131 * kern_timestamp() call twice per codeword is way more expensive 132 * than the actual comcryption code. Setting this variable to zero 133 * avoids the cost of all the timestamps for reference without 134 * rebuilding. Also, the cmcPerWordOhead calibrates the actual 135 * cost of the two kern_timestamp() calls per word. 136 */ 137 extern unsigned comProfEnable; 138 139 /* 140 * Profiling accumulators. 141 */ 142 typedef unsigned comprof_t; 143 144 extern comprof_t cmcTotal; 145 extern comprof_t cmcQueSearch; 146 extern comprof_t cmcQueMatchMove; 147 extern comprof_t cmcQueMissMove; 148 extern comprof_t cmcPerWordOhead; 149 extern comprof_t cmcLevel2; 150 151 152 /* 153 * Place one of these in the local variable declaration list of each routine 154 * which will do profiling. 155 */ 156 #define COMPROF_LOCALS \ 157 struct tsval _profStartTime; \ 158 struct tsval _profEndTime; 159 160 /* 161 * Start the clock. 162 */ 163 #define COMPROF_START \ 164 if(comProfEnable) { \ 165 kern_timestamp(&_profStartTime); \ 166 } 167 168 /* 169 * Stop the clock and gather elapsed time to specified accumulator. 170 */ 171 #define COMPROF_END(accum) \ 172 if(comProfEnable) { \ 173 kern_timestamp(&_profEndTime); \ 174 accum += (_profEndTime.low_val - _profStartTime.low_val); \ 175 } 176 177 178 #else 179 180 #define COMPROF_LOCALS 181 #define COMPROF_START 182 #define COMPROF_END(accum) 183 184 #endif /* COM_PROFILE */ 185 186 /* 187 * Get/set parameter API, private, for debug only. 188 */ 189 #if COM_DEBUG 190 #define COM_PARAM_ENABLE 1 191 #else 192 #define COM_PARAM_ENABLE 0 193 #endif /*COM_DEBUG*/ 194 195 #if COM_PARAM_ENABLE 196 197 extern unsigned getF1(comcryptObj cobj); 198 extern void setF1(comcryptObj cobj, unsigned f1); 199 extern unsigned getF2(comcryptObj cobj); 200 extern void setF2(comcryptObj cobj, unsigned f2); 201 extern unsigned getJmatchThresh(comcryptObj cobj); 202 extern void setJmatchThresh(comcryptObj cobj, unsigned jmatchThresh); 203 extern unsigned getMinByteCode(comcryptObj cobj); 204 extern void setMinByteCode(comcryptObj cobj, unsigned minByteCode); 205 206 #endif /*COM_PARAM_ENABLE*/ 207 208 #ifdef __cplusplus 209 } 210 #endif 211 212 #endif /*_COM_DEBUG_H_*/