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