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