1*44aaaed1SSimon Glass /* 2*44aaaed1SSimon Glass * Logging support 3*44aaaed1SSimon Glass * 4*44aaaed1SSimon Glass * Copyright (c) 2017 Google, Inc 5*44aaaed1SSimon Glass * Written by Simon Glass <sjg@chromium.org> 6*44aaaed1SSimon Glass * 7*44aaaed1SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 8*44aaaed1SSimon Glass */ 9*44aaaed1SSimon Glass 10*44aaaed1SSimon Glass #ifndef __LOG_H 11*44aaaed1SSimon Glass #define __LOG_H 12*44aaaed1SSimon Glass 13*44aaaed1SSimon Glass #ifdef DEBUG 14*44aaaed1SSimon Glass #define _DEBUG 1 15*44aaaed1SSimon Glass #else 16*44aaaed1SSimon Glass #define _DEBUG 0 17*44aaaed1SSimon Glass #endif 18*44aaaed1SSimon Glass 19*44aaaed1SSimon Glass #ifdef CONFIG_SPL_BUILD 20*44aaaed1SSimon Glass #define _SPL_BUILD 1 21*44aaaed1SSimon Glass #else 22*44aaaed1SSimon Glass #define _SPL_BUILD 0 23*44aaaed1SSimon Glass #endif 24*44aaaed1SSimon Glass 25*44aaaed1SSimon Glass /* 26*44aaaed1SSimon Glass * Output a debug text when condition "cond" is met. The "cond" should be 27*44aaaed1SSimon Glass * computed by a preprocessor in the best case, allowing for the best 28*44aaaed1SSimon Glass * optimization. 29*44aaaed1SSimon Glass */ 30*44aaaed1SSimon Glass #define debug_cond(cond, fmt, args...) \ 31*44aaaed1SSimon Glass do { \ 32*44aaaed1SSimon Glass if (cond) \ 33*44aaaed1SSimon Glass printf(pr_fmt(fmt), ##args); \ 34*44aaaed1SSimon Glass } while (0) 35*44aaaed1SSimon Glass 36*44aaaed1SSimon Glass /* Show a message if DEBUG is defined in a file */ 37*44aaaed1SSimon Glass #define debug(fmt, args...) \ 38*44aaaed1SSimon Glass debug_cond(_DEBUG, fmt, ##args) 39*44aaaed1SSimon Glass 40*44aaaed1SSimon Glass /* Show a message if not in SPL */ 41*44aaaed1SSimon Glass #define warn_non_spl(fmt, args...) \ 42*44aaaed1SSimon Glass debug_cond(!_SPL_BUILD, fmt, ##args) 43*44aaaed1SSimon Glass 44*44aaaed1SSimon Glass /* 45*44aaaed1SSimon Glass * An assertion is run-time check done in debug mode only. If DEBUG is not 46*44aaaed1SSimon Glass * defined then it is skipped. If DEBUG is defined and the assertion fails, 47*44aaaed1SSimon Glass * then it calls panic*( which may or may not reset/halt U-Boot (see 48*44aaaed1SSimon Glass * CONFIG_PANIC_HANG), It is hoped that all failing assertions are found 49*44aaaed1SSimon Glass * before release, and after release it is hoped that they don't matter. But 50*44aaaed1SSimon Glass * in any case these failing assertions cannot be fixed with a reset (which 51*44aaaed1SSimon Glass * may just do the same assertion again). 52*44aaaed1SSimon Glass */ 53*44aaaed1SSimon Glass void __assert_fail(const char *assertion, const char *file, unsigned int line, 54*44aaaed1SSimon Glass const char *function); 55*44aaaed1SSimon Glass #define assert(x) \ 56*44aaaed1SSimon Glass ({ if (!(x) && _DEBUG) \ 57*44aaaed1SSimon Glass __assert_fail(#x, __FILE__, __LINE__, __func__); }) 58*44aaaed1SSimon Glass 59*44aaaed1SSimon Glass #endif 60