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