/ OSX / libsecurity_comcryption / lib / comDebug.h
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_*/