1*2d9fd380Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2*2d9fd380Sjfb8856606  * Copyright(c) 2010-2014 Intel Corporation
3*2d9fd380Sjfb8856606  */
4*2d9fd380Sjfb8856606 
5*2d9fd380Sjfb8856606 #ifndef _RTE_DEBUG_H_
6*2d9fd380Sjfb8856606 #define _RTE_DEBUG_H_
7*2d9fd380Sjfb8856606 
8*2d9fd380Sjfb8856606 /**
9*2d9fd380Sjfb8856606  * @file
10*2d9fd380Sjfb8856606  *
11*2d9fd380Sjfb8856606  * Debug Functions in RTE
12*2d9fd380Sjfb8856606  *
13*2d9fd380Sjfb8856606  * This file defines a generic API for debug operations. Part of
14*2d9fd380Sjfb8856606  * the implementation is architecture-specific.
15*2d9fd380Sjfb8856606  */
16*2d9fd380Sjfb8856606 
17*2d9fd380Sjfb8856606 #include "rte_log.h"
18*2d9fd380Sjfb8856606 #include "rte_branch_prediction.h"
19*2d9fd380Sjfb8856606 
20*2d9fd380Sjfb8856606 #ifdef __cplusplus
21*2d9fd380Sjfb8856606 extern "C" {
22*2d9fd380Sjfb8856606 #endif
23*2d9fd380Sjfb8856606 
24*2d9fd380Sjfb8856606 /**
25*2d9fd380Sjfb8856606  * Dump the stack of the calling core to the console.
26*2d9fd380Sjfb8856606  */
27*2d9fd380Sjfb8856606 void rte_dump_stack(void);
28*2d9fd380Sjfb8856606 
29*2d9fd380Sjfb8856606 /**
30*2d9fd380Sjfb8856606  * Provide notification of a critical non-recoverable error and terminate
31*2d9fd380Sjfb8856606  * execution abnormally.
32*2d9fd380Sjfb8856606  *
33*2d9fd380Sjfb8856606  * Display the format string and its expanded arguments (printf-like).
34*2d9fd380Sjfb8856606  *
35*2d9fd380Sjfb8856606  * In a linux environment, this function dumps the stack and calls
36*2d9fd380Sjfb8856606  * abort() resulting in a core dump if enabled.
37*2d9fd380Sjfb8856606  *
38*2d9fd380Sjfb8856606  * The function never returns.
39*2d9fd380Sjfb8856606  *
40*2d9fd380Sjfb8856606  * @param ...
41*2d9fd380Sjfb8856606  *   The format string, followed by the variable list of arguments.
42*2d9fd380Sjfb8856606  */
43*2d9fd380Sjfb8856606 #define rte_panic(...) rte_panic_(__func__, __VA_ARGS__, "dummy")
44*2d9fd380Sjfb8856606 #define rte_panic_(func, format, ...) __rte_panic(func, format "%.0s", __VA_ARGS__)
45*2d9fd380Sjfb8856606 
46*2d9fd380Sjfb8856606 #ifdef RTE_ENABLE_ASSERT
47*2d9fd380Sjfb8856606 #define RTE_ASSERT(exp)	RTE_VERIFY(exp)
48*2d9fd380Sjfb8856606 #else
49*2d9fd380Sjfb8856606 #define RTE_ASSERT(exp) do {} while (0)
50*2d9fd380Sjfb8856606 #endif
51*2d9fd380Sjfb8856606 #define	RTE_VERIFY(exp)	do {                                                  \
52*2d9fd380Sjfb8856606 	if (unlikely(!(exp)))                                                           \
53*2d9fd380Sjfb8856606 		rte_panic("line %d\tassert \"%s\" failed\n", __LINE__, #exp); \
54*2d9fd380Sjfb8856606 } while (0)
55*2d9fd380Sjfb8856606 
56*2d9fd380Sjfb8856606 /*
57*2d9fd380Sjfb8856606  * Provide notification of a critical non-recoverable error and stop.
58*2d9fd380Sjfb8856606  *
59*2d9fd380Sjfb8856606  * This function should not be called directly. Refer to rte_panic() macro
60*2d9fd380Sjfb8856606  * documentation.
61*2d9fd380Sjfb8856606  */
62*2d9fd380Sjfb8856606 void __rte_panic(const char *funcname , const char *format, ...)
63*2d9fd380Sjfb8856606 #ifdef __GNUC__
64*2d9fd380Sjfb8856606 #if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2))
65*2d9fd380Sjfb8856606 	__rte_cold
66*2d9fd380Sjfb8856606 #endif
67*2d9fd380Sjfb8856606 #endif
68*2d9fd380Sjfb8856606 	__rte_noreturn
69*2d9fd380Sjfb8856606 	__rte_format_printf(2, 3);
70*2d9fd380Sjfb8856606 
71*2d9fd380Sjfb8856606 #ifdef __cplusplus
72*2d9fd380Sjfb8856606 }
73*2d9fd380Sjfb8856606 #endif
74*2d9fd380Sjfb8856606 
75*2d9fd380Sjfb8856606 #endif /* _RTE_DEBUG_H_ */
76