148 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2014, STMicroelectronics International N.V.
 | |
|  * All rights reserved.
 | |
|  *
 | |
|  * Redistribution and use in source and binary forms, with or without
 | |
|  * modification, are permitted provided that the following conditions are met:
 | |
|  *
 | |
|  * 1. Redistributions of source code must retain the above copyright notice,
 | |
|  * this list of conditions and the following disclaimer.
 | |
|  *
 | |
|  * 2. Redistributions in binary form must reproduce the above copyright notice,
 | |
|  * this list of conditions and the following disclaimer in the documentation
 | |
|  * and/or other materials provided with the distribution.
 | |
|  *
 | |
|  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | |
|  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | |
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | |
|  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 | |
|  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | |
|  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | |
|  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | |
|  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | |
|  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | |
|  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | |
|  * POSSIBILITY OF SUCH DAMAGE.
 | |
|  */
 | |
| #ifndef TEEC_TRACE_H
 | |
| #define TEEC_TRACE_H
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| #include <string.h>
 | |
| #include <stdio.h>
 | |
| #include <stdint.h>
 | |
| 
 | |
| #ifndef BINARY_PREFIX
 | |
| #error "BINARY_PREFIX not defined"
 | |
| #endif
 | |
| 
 | |
| /*
 | |
|  * Trace levels.
 | |
|  *
 | |
|  * ERROR is used when some kind of error has happened, this is most likely the
 | |
|  * print you will use most of the time when you report some kind of error.
 | |
|  *
 | |
|  * INFO is used when you want to print some 'normal' text to the user.
 | |
|  * This is the default level.
 | |
|  *
 | |
|  * DEBUG is used to print extra information to enter deeply in the module.
 | |
|  *
 | |
|  * FLOW is used to print the execution flox, typically the in/out of functions.
 | |
|  *
 | |
|  * */
 | |
| 
 | |
| #define TRACE_ERROR  1
 | |
| #define TRACE_INFO   2
 | |
| #define TRACE_DEBUG  3
 | |
| #define TRACE_FLOW   4
 | |
| 
 | |
| #if defined(DEBUGLEVEL_0) && !defined(DEBUGLEVEL)
 | |
| #define DEBUGLEVEL TRACE_ERROR
 | |
| #endif
 | |
| 
 | |
| #if defined(DEBUGLEVEL_1) && !defined(DEBUGLEVEL)
 | |
| #define DEBUGLEVEL TRACE_ERROR
 | |
| #endif
 | |
| 
 | |
| #if defined(DEBUGLEVEL_2) && !defined(DEBUGLEVEL)
 | |
| #define DEBUGLEVEL TRACE_INFO
 | |
| #endif
 | |
| 
 | |
| #if defined(DEBUGLEVEL_3) && !defined(DEBUGLEVEL)
 | |
| #define DEBUGLEVEL TRACE_DEBUG
 | |
| #endif
 | |
| 
 | |
| #if defined(DEBUGLEVEL_4) && !defined(DEBUGLEVEL)
 | |
| #define DEBUGLEVEL TRACE_FLOW
 | |
| #endif
 | |
| 
 | |
| #ifndef DEBUGLEVEL
 | |
| /* Default debug level. */
 | |
| #define DEBUGLEVEL TRACE_INFO
 | |
| #endif
 | |
| 
 | |
| /*
 | |
|  * This define make sure that parameters are checked in the same manner as it
 | |
|  * is done in the normal printf function.
 | |
|  */
 | |
| #define __PRINTFLIKE(__fmt, __varargs) __attribute__\
 | |
| 	((__format__(__printf__, __fmt, __varargs)))
 | |
| 
 | |
| void _dprintf(const char *function, int line, int level, const char *prefix,
 | |
| 	      const char *fmt, ...) __PRINTFLIKE(5, 6);
 | |
| 
 | |
| #define dprintf(level, x...) do { \
 | |
| 		if ((level) <= DEBUGLEVEL) { \
 | |
| 			_dprintf(__func__, __LINE__, level, \
 | |
| 				 BINARY_PREFIX, x); \
 | |
| 		} \
 | |
| 	} while (0)
 | |
| 
 | |
| #define EMSG(fmt, ...)   dprintf(TRACE_ERROR, fmt "\n", ##__VA_ARGS__)
 | |
| #define IMSG(fmt, ...)   dprintf(TRACE_INFO, fmt "\n", ##__VA_ARGS__)
 | |
| #define DMSG(fmt, ...)   dprintf(TRACE_DEBUG, fmt "\n", ##__VA_ARGS__)
 | |
| #define FMSG(fmt, ...)   dprintf(TRACE_FLOW, fmt "\n", ##__VA_ARGS__)
 | |
| 
 | |
| #define INMSG(fmt, ...)  FMSG("> " fmt, ##__VA_ARGS__)
 | |
| #define OUTMSG(fmt, ...) FMSG("< " fmt, ##__VA_ARGS__)
 | |
| #define OUTRMSG(r)                              \
 | |
| 	do {                                            \
 | |
| 		if (r)                                      \
 | |
| 			EMSG("Function returns with [%d]", r);  \
 | |
| 		OUTMSG("r=[%d]", r);                        \
 | |
| 		return r;                                   \
 | |
| 	} while (0)
 | |
| 
 | |
| #define dprintf_raw(level, x...) do { \
 | |
| 		if ((level) <= DEBUGLEVEL) \
 | |
| 			_dprintf(0, 0, (level), BINARY_PREFIX, x); \
 | |
| 	} while (0)
 | |
| 
 | |
| #define EMSG_RAW(fmt, ...)   dprintf_raw(TRACE_ERROR, fmt, ##__VA_ARGS__)
 | |
| #define IMSG_RAW(fmt, ...)   dprintf_raw(TRACE_INFO, fmt, ##__VA_ARGS__)
 | |
| #define DMSG_RAW(fmt, ...)   dprintf_raw(TRACE_DEBUG, fmt, ##__VA_ARGS__)
 | |
| #define FMSG_RAW(fmt, ...)   dprintf_raw(TRACE_FLOW, fmt, ##__VA_ARGS__)
 | |
| 
 | |
| /*
 | |
|  * This function will hex and ascii dump a buffer.
 | |
|  *
 | |
|  * Note that this function will only print if debug flag
 | |
|  * DEBUGLEVEL is INFO or FLOOD.
 | |
|  *
 | |
|  * @param bname     Information string describing the buffer.
 | |
|  * @param buffer    Pointer to the buffer.
 | |
|  * @param blen      Length of the buffer.
 | |
|  *
 | |
|  * @return void
 | |
|  */
 | |
| void dump_buffer(const char *bname, const uint8_t *buffer, size_t blen);
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif
 | 
