1 /* 2 * Copyright 2018 The Hafnium Authors. 3 * 4 * Use of this source code is governed by a BSD-style 5 * license that can be found in the LICENSE file or at 6 * https://opensource.org/licenses/BSD-3-Clause. 7 */ 8 9 #pragma once 10 11 #include <stdarg.h> 12 #include <stddef.h> 13 14 #include "hf/ffa.h" 15 16 #define DLOG_BUFFER_SIZE 8192 17 18 enum log_level { 19 LOG_LEVEL_NONE = 0, 20 LOG_LEVEL_ERROR = 1, 21 LOG_LEVEL_NOTICE = 2, 22 LOG_LEVEL_WARNING = 3, 23 LOG_LEVEL_INFO = 4, 24 LOG_LEVEL_VERBOSE = 5, 25 }; 26 27 extern size_t dlog_buffer_offset; 28 extern char dlog_buffer[]; 29 30 void dlog_enable_lock(void); 31 __attribute__((format(printf, 1, 2))) size_t dlog(const char *fmt, ...); 32 size_t vdlog(const char *fmt, va_list args); 33 34 /* 35 * The do { ... } while (0) syntax is used to ensure that callers of 36 * these macros follow them with a semicolon. 37 * 38 * Run-time conditionals are preferred over preprocessor conditionals to ensure 39 * that the code is type-checked and linted unconditionally, even if it will not 40 * be executed at run-time. Logging statements that are disabled at 41 * compile-time are unreachable code and will be eliminated by compiler 42 * optimizations. 43 */ 44 #define dlog_error(...) \ 45 do { \ 46 if (LOG_LEVEL >= LOG_LEVEL_ERROR) { \ 47 dlog("ERROR: " __VA_ARGS__); \ 48 } \ 49 } while (0) 50 51 #define dlog_notice(...) \ 52 do { \ 53 if (LOG_LEVEL >= LOG_LEVEL_NOTICE) { \ 54 dlog("NOTICE: " __VA_ARGS__); \ 55 } \ 56 } while (0) 57 58 #define dlog_warning(...) \ 59 do { \ 60 if (LOG_LEVEL >= LOG_LEVEL_WARNING) { \ 61 dlog("WARNING: " __VA_ARGS__); \ 62 } \ 63 } while (0) 64 65 #define dlog_info(...) \ 66 do { \ 67 if (LOG_LEVEL >= LOG_LEVEL_WARNING) { \ 68 dlog("INFO: " __VA_ARGS__); \ 69 } \ 70 } while (0) 71 72 #define dlog_verbose(...) \ 73 do { \ 74 if (LOG_LEVEL >= LOG_LEVEL_VERBOSE) { \ 75 dlog("VERBOSE: " __VA_ARGS__); \ 76 } \ 77 } while (0) 78