blob: 83172302281d7467321a588a32ec34430f6f7c15 [file] [log] [blame]
Steve Muckle0a9c0872022-02-16 05:58:07 +00001/*******************************************************************************
2* Copyright (C) 2018 Cadence Design Systems, Inc.
3*
4* Permission is hereby granted, free of charge, to any person obtaining
5* a copy of this software and associated documentation files (the
6* "Software"), to use this Software with Cadence processor cores only and
7* not with any other processors and platforms, subject to
8* the following conditions:
9*
10* The above copyright notice and this permission notice shall be included
11* in all copies or substantial portions of the Software.
12*
13* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
14* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
15* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
16* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
17* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
18* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
19* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20
21******************************************************************************/
22
23#ifndef __XF_H
24#error "xf-debug.h mustn't be included directly"
25#endif
26
27/*******************************************************************************
28 * Auxiliary macros (put into "xf-types.h"?)
29 ******************************************************************************/
30
31#ifndef offset_of
32#define offset_of(type, member) \
33 ((int)(intptr_t)&(((const type *)(0))->member))
34#endif
35
36#ifndef container_of
37#define container_of(ptr, type, member) \
38 ((type *)((void *)(ptr) - offset_of(type, member)))
39#endif
40
41/*******************************************************************************
42 * Bug check for constant conditions (file scope)
43 ******************************************************************************/
44
45#define __C_BUG(n) __C_BUG2(n)
46#define __C_BUG2(n) __c_bug_##n
47#define C_BUG(expr) typedef char __C_BUG(__LINE__)[(expr) ? -1 : 1]
48
49/*******************************************************************************
50 * Compilation-time types control
51 ******************************************************************************/
52
53#if XF_DEBUG
54#define __C_TYPE_CONTROL(d, type) ((void) ((d) != (type*) 0))
55#else
56#define __C_TYPE_CONTROL(d, type) ((void) 0)
57#endif
58
59/*******************************************************************************
60 * Unused variable
61 ******************************************************************************/
62
63#define C_UNUSED(v) (void)(0 ? (v) = (v), 1 : 0)
64
65/*******************************************************************************
66 * Auxiliary macros
67 ******************************************************************************/
68
69/* ...define a stub for unused declarator */
70#define __xf_stub(tag, line) __xf_stub2(tag, line)
71#define __xf_stub2(tag, line) typedef int __xf_##tag##_##line
72
73/* ...convert anything into string */
74#define __xf_string(x) __xf_string2(x)
75#define __xf_string2(x) #x
76
77/*******************************************************************************
78 * Tracing facility
79 ******************************************************************************/
80
81#if XF_TRACE
82
83/* ...tracing to communication processor */
84extern int xf_trace(const char *format, ...);
85
86/* ...tracing facility initialization */
87extern void xf_trace_init(const char *banner);
88
89/* ...initialize tracing facility */
90#define TRACE_INIT(banner) (xf_trace_init(banner))
91
92/* ...trace tag definition */
93#define TRACE_TAG(tag, on) enum { __xf_trace_##tag = on }
94
95/* ...check if the trace tag is enabled */
96#define TRACE_CFG(tag) (__xf_trace_##tag)
97
98/* ...tagged tracing primitive */
99#define TRACE(tag, fmt, ...) (void)(__xf_trace_##tag ? __xf_trace(tag, __xf_format##fmt, ## __VA_ARGS__), 1 : 0)
100
101/*******************************************************************************
102 * Tagged tracing formats
103 ******************************************************************************/
104
105/* ...tracing primitive */
106#define __xf_trace(tag, fmt, ...) \
107 ({ __attribute__((unused)) const char *__xf_tag = #tag; xf_trace(fmt, ## __VA_ARGS__); })
108
109/* ...just a format string */
110#define __xf_format_n(fmt) fmt
111
112/* ...module tag and trace tag shown */
113#define __xf_format_b(fmt) "[%s.%s] " fmt, __xf_string(MODULE_TAG), __xf_tag
114
115/* ...module tag, trace tag, file name and line shown */
116#define __xf_format_x(fmt) "[%s.%s] - %s@%d - " fmt, __xf_string(MODULE_TAG), __xf_tag, __FILE__, __LINE__
117
118/*******************************************************************************
119 * Globally defined tags
120 ******************************************************************************/
121
122/* ...unconditionally OFF */
123TRACE_TAG(0, 0);
124
125/* ...unconditionally ON */
126TRACE_TAG(1, 1);
127
128/* ...error output - on by default */
129TRACE_TAG(ERROR, 1);
130
131#else
132
133#define TRACE_INIT(banner) (void)0
134#define TRACE_TAG(tag, on) __xf_stub(trace_##tag, __LINE__)
135#define TRACE(tag, fmt, ...) (void)0
136#define __xf_trace(tag, fmt, ...) (void)0
137
138#endif /* XF_TRACE */
139
140/*******************************************************************************
141 * Bugchecks
142 ******************************************************************************/
143
144#if XF_DEBUG
145
146/* ...run-time bugcheck */
147#define BUG(cond, fmt, ...) \
148do \
149{ \
150 if (cond) \
151 { \
152 /* ...output message */ \
153 __xf_trace(BUG, __xf_format##fmt, ## __VA_ARGS__); \
154 \
155 /* ...and die */ \
156 abort(); \
157 } \
158} \
159while (0)
160
161#else
162#define BUG(cond, fmt, ...) (void)0
163#endif /* XF_DEBUG */
164
165/*******************************************************************************
166 * Run-time error processing
167 ******************************************************************************/
168
169/* ...check the API call succeeds */
170#define XF_CHK_API(cond) \
171({ \
172 int __ret; \
173 \
174 if ((__ret = (int)(cond)) < 0) \
175 { \
176 TRACE(ERROR, _x("API error: %d"), __ret); \
177 return __ret; \
178 } \
179 __ret; \
180})
181
182/* ...check the condition is true */
183#define XF_CHK_ERR(cond, error) \
184({ \
185 intptr_t __ret; \
186 \
187 if (!(__ret = (intptr_t)(cond))) \
188 { \
189 TRACE(ERROR, _x("check failed")); \
190 return (error); \
191 } \
192 (int)__ret; \
193})
194