You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
195 lines
7.6 KiB
195 lines
7.6 KiB
/*******************************************************************************
|
|
* Copyright (C) 2018 Cadence Design Systems, Inc.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining
|
|
* a copy of this software and associated documentation files (the
|
|
* "Software"), to use this Software with Cadence processor cores only and
|
|
* not with any other processors and platforms, subject to
|
|
* the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included
|
|
* in all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
******************************************************************************/
|
|
|
|
#ifndef __XF_H
|
|
#error "xf-debug.h mustn't be included directly"
|
|
#endif
|
|
|
|
/*******************************************************************************
|
|
* Auxiliary macros (put into "xf-types.h"?)
|
|
******************************************************************************/
|
|
|
|
#ifndef offset_of
|
|
#define offset_of(type, member) \
|
|
((int)(intptr_t)&(((const type *)(0))->member))
|
|
#endif
|
|
|
|
#ifndef container_of
|
|
#define container_of(ptr, type, member) \
|
|
((type *)((void *)(ptr) - offset_of(type, member)))
|
|
#endif
|
|
|
|
/*******************************************************************************
|
|
* Bug check for constant conditions (file scope)
|
|
******************************************************************************/
|
|
|
|
#define __C_BUG(n) __C_BUG2(n)
|
|
#define __C_BUG2(n) __c_bug_##n
|
|
#define C_BUG(expr) typedef char __C_BUG(__LINE__)[(expr) ? -1 : 1]
|
|
|
|
/*******************************************************************************
|
|
* Compilation-time types control
|
|
******************************************************************************/
|
|
|
|
#if XF_DEBUG
|
|
#define __C_TYPE_CONTROL(d, type) ((void) ((d) != (type*) 0))
|
|
#else
|
|
#define __C_TYPE_CONTROL(d, type) ((void) 0)
|
|
#endif
|
|
|
|
/*******************************************************************************
|
|
* Unused variable
|
|
******************************************************************************/
|
|
|
|
#define C_UNUSED(v) (void)(0 ? (v) = (v), 1 : 0)
|
|
|
|
/*******************************************************************************
|
|
* Auxiliary macros
|
|
******************************************************************************/
|
|
|
|
/* ...define a stub for unused declarator */
|
|
#define __xf_stub(tag, line) __xf_stub2(tag, line)
|
|
#define __xf_stub2(tag, line) typedef int __xf_##tag##_##line
|
|
|
|
/* ...convert anything into string */
|
|
#define __xf_string(x) __xf_string2(x)
|
|
#define __xf_string2(x) #x
|
|
|
|
/*******************************************************************************
|
|
* Tracing facility
|
|
******************************************************************************/
|
|
|
|
#if XF_TRACE
|
|
|
|
/* ...tracing to communication processor */
|
|
extern int xf_trace(const char *format, ...);
|
|
|
|
/* ...tracing facility initialization */
|
|
extern void xf_trace_init(const char *banner);
|
|
|
|
/* ...initialize tracing facility */
|
|
#define TRACE_INIT(banner) (xf_trace_init(banner))
|
|
|
|
/* ...trace tag definition */
|
|
#define TRACE_TAG(tag, on) enum { __xf_trace_##tag = on }
|
|
|
|
/* ...check if the trace tag is enabled */
|
|
#define TRACE_CFG(tag) (__xf_trace_##tag)
|
|
|
|
/* ...tagged tracing primitive */
|
|
#define TRACE(tag, fmt, ...) (void)(__xf_trace_##tag ? __xf_trace(tag, __xf_format##fmt, ## __VA_ARGS__), 1 : 0)
|
|
|
|
/*******************************************************************************
|
|
* Tagged tracing formats
|
|
******************************************************************************/
|
|
|
|
/* ...tracing primitive */
|
|
#define __xf_trace(tag, fmt, ...) \
|
|
({ __attribute__((unused)) const char *__xf_tag = #tag; xf_trace(fmt, ## __VA_ARGS__); })
|
|
|
|
/* ...just a format string */
|
|
#define __xf_format_n(fmt) fmt
|
|
|
|
/* ...module tag and trace tag shown */
|
|
#define __xf_format_b(fmt) "[%s.%s] " fmt, __xf_string(MODULE_TAG), __xf_tag
|
|
|
|
/* ...module tag, trace tag, file name and line shown */
|
|
#define __xf_format_x(fmt) "[%s.%s] - %s@%d - " fmt, __xf_string(MODULE_TAG), __xf_tag, __FILE__, __LINE__
|
|
|
|
/*******************************************************************************
|
|
* Globally defined tags
|
|
******************************************************************************/
|
|
|
|
/* ...unconditionally OFF */
|
|
TRACE_TAG(0, 0);
|
|
|
|
/* ...unconditionally ON */
|
|
TRACE_TAG(1, 1);
|
|
|
|
/* ...error output - on by default */
|
|
TRACE_TAG(ERROR, 1);
|
|
|
|
#else
|
|
|
|
#define TRACE_INIT(banner) (void)0
|
|
#define TRACE_TAG(tag, on) __xf_stub(trace_##tag, __LINE__)
|
|
#define TRACE(tag, fmt, ...) (void)0
|
|
#define __xf_trace(tag, fmt, ...) (void)0
|
|
|
|
#endif /* XF_TRACE */
|
|
|
|
/*******************************************************************************
|
|
* Bugchecks
|
|
******************************************************************************/
|
|
|
|
#if XF_DEBUG
|
|
|
|
/* ...run-time bugcheck */
|
|
#define BUG(cond, fmt, ...) \
|
|
do \
|
|
{ \
|
|
if (cond) \
|
|
{ \
|
|
/* ...output message */ \
|
|
__xf_trace(BUG, __xf_format##fmt, ## __VA_ARGS__); \
|
|
\
|
|
/* ...and die */ \
|
|
abort(); \
|
|
} \
|
|
} \
|
|
while (0)
|
|
|
|
#else
|
|
#define BUG(cond, fmt, ...) (void)0
|
|
#endif /* XF_DEBUG */
|
|
|
|
/*******************************************************************************
|
|
* Run-time error processing
|
|
******************************************************************************/
|
|
|
|
/* ...check the API call succeeds */
|
|
#define XF_CHK_API(cond) \
|
|
({ \
|
|
int __ret; \
|
|
\
|
|
if ((__ret = (int)(cond)) < 0) \
|
|
{ \
|
|
TRACE(ERROR, _x("API error: %d"), __ret); \
|
|
return __ret; \
|
|
} \
|
|
__ret; \
|
|
})
|
|
|
|
/* ...check the condition is true */
|
|
#define XF_CHK_ERR(cond, error) \
|
|
({ \
|
|
intptr_t __ret; \
|
|
\
|
|
if (!(__ret = (intptr_t)(cond))) \
|
|
{ \
|
|
TRACE(ERROR, _x("check failed")); \
|
|
return (error); \
|
|
} \
|
|
(int)__ret; \
|
|
})
|
|
|