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