122 lines
3.5 KiB
C
122 lines
3.5 KiB
C
/*
|
|
* Copyright (C) 2007-2008 Apple Inc. All rights reserved.
|
|
* Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
|
|
*
|
|
* This document is the property of Apple Inc.
|
|
* It is considered confidential and proprietary.
|
|
*
|
|
* This document may not be reproduced or transmitted in any form,
|
|
* in whole or in part, without the express written permission of
|
|
* Apple Inc.
|
|
*/
|
|
#ifndef __DEBUG_H
|
|
#define __DEBUG_H
|
|
|
|
#include <compiler.h>
|
|
#include <stdio.h>
|
|
#include <sys.h>
|
|
|
|
#ifndef DEBUG_UART_ENABLE_DEFAULT
|
|
# define DEBUG_UART_ENABLE_DEFAULT 0
|
|
#endif
|
|
|
|
#define DEBUG_SILENT 0
|
|
#define DEBUG_RELEASE 5
|
|
#define DEBUG_CRITICAL 10
|
|
#define DEBUG_INFO 20
|
|
#define DEBUG_SPEW 30
|
|
#define DEBUG_NEVER 40
|
|
|
|
#ifndef DEBUG_LEVEL
|
|
# if DEBUG_BUILD
|
|
# define DEBUG_LEVEL DEBUG_INFO
|
|
# else
|
|
# define DEBUG_LEVEL DEBUG_CRITICAL
|
|
# endif
|
|
#endif
|
|
|
|
#ifndef OBFUSCATED_LOGGING
|
|
# if RELEASE_BUILD
|
|
# define OBFUSCATED_LOGGING 1
|
|
# else
|
|
# define OBFUSCATED_LOGGING 0
|
|
# endif
|
|
#endif
|
|
|
|
#define dprintf(level, x...) \
|
|
do { \
|
|
if ((level) <= DEBUG_LEVEL) { \
|
|
if (OBFUSCATED_LOGGING && (level) > DEBUG_RELEASE) { printf("%llx:%d\n", DEBUG_FILE_HASH, __LINE__); } \
|
|
else { printf(x); } \
|
|
} \
|
|
} while(0)
|
|
#define dhexdump(level, ptr, len) \
|
|
do { \
|
|
if ((level) <= DEBUG_LEVEL) { \
|
|
if (OBFUSCATED_LOGGING && (level) > DEBUG_RELEASE) { printf("%llx:%d\n", DEBUG_FILE_HASH, __LINE__); } \
|
|
else { hexdump(ptr, len); } \
|
|
} \
|
|
} while(0)
|
|
|
|
#define __ASSERT(_x, _str) \
|
|
do { \
|
|
if (unlikely(!(_x))) { \
|
|
panic("ASSERT FAILED at (%s:%d)\n", __FILE__, __LINE__);\
|
|
} \
|
|
} while(0)
|
|
|
|
#if DEBUG_BUILD || ENABLE_RELEASE_ASSERTS || defined(__clang_analyzer__)
|
|
/* for debug builds, turn all the asserts */
|
|
# define RELEASE_ASSERT(_x) __ASSERT(_x, #_x)
|
|
# define ASSERT(_x) __ASSERT(_x, #_x)
|
|
#else
|
|
/* for release, development builds */
|
|
# define RELEASE_ASSERT(_x) __ASSERT(_x, #_x)
|
|
# define ASSERT(_x) do {if (_x) {}} while(0)
|
|
#endif
|
|
|
|
#define static_assert(assertion, error) _Static_assert(assertion, error)
|
|
|
|
#if WITH_SIMULATION_TRACE
|
|
/*
|
|
* To enable postmortem analysis of non-debug code being run in simulation, we allow a platform to
|
|
* define two locations to which we will write trace data; one for location, one for parameters.
|
|
* This also permits watchpoint debugging using a hardware debugger.
|
|
*
|
|
* In both cases, the write to the IP trace register stores the address of the current function.
|
|
* Following this are either one or two writes to the parameter trace register; the first gives the
|
|
* source file line containing the trace statement, the second (if present) the parameter.
|
|
*/
|
|
#if !defined(SIMULATION_TRACE_IP_REGISTER) || !defined(SIMULATION_TRACE_PARAMETER_REGISTER)
|
|
# error Must define SIMULATION_TRACE_IP_REGISTER and SIMULATION_TRACE_PARAMETER_REGISTER if WITH_SIMULATION_TRACE is defined
|
|
#endif
|
|
|
|
/*
|
|
* Trace our passing a location.
|
|
*/
|
|
#define SIMULATION_TRACE() \
|
|
do { \
|
|
*(uint32_t *)SIMULATION_TRACE_IP_REGISTER = (uint32_t)__func__; \
|
|
*(uint32_t *)SIMULATION_TRACE_PARAMETER_REGISTER = (uint32_t)__LINE__; \
|
|
} while (0)
|
|
|
|
/*
|
|
* Trace a location and a parameter at that location.
|
|
*/
|
|
#define SIMULATION_TRACE_VALUE(_x) \
|
|
do { \
|
|
SIMULATION_TRACE(); \
|
|
*(uint32_t *)SIMULATION_TRACE_PARAMETER_REGISTER = (uint32_t)(_x); \
|
|
} while (0)
|
|
|
|
#define SIMULATION_TRACE_VALUE2(_x,_y) \
|
|
do { \
|
|
SIMULATION_TRACE(); \
|
|
*(uint32_t *)SIMULATION_TRACE_PARAMETER_REGISTER = (uint32_t)(_x); \
|
|
*(uint32_t *)SIMULATION_TRACE_PARAMETER_REGISTER = (uint32_t)(_y); \
|
|
} while (0)
|
|
|
|
#endif /* WITH_SIMULATION_TRACE */
|
|
|
|
#endif /* __DEBUG_H */
|