]>
Commit | Line | Data |
---|---|---|
1d0f30a8 SG |
1 | Logging in U-Boot |
2 | ================= | |
3 | ||
4 | Introduction | |
5 | ------------ | |
6 | ||
7 | U-Boot's internal operation involves many different steps and actions. From | |
8 | setting up the board to displaying a start-up screen to loading an Operating | |
9 | System, there are many component parts each with many actions. | |
10 | ||
11 | Most of the time this internal detail is not useful. Displaying it on the | |
12 | console would delay booting (U-Boot's primary purpose) and confuse users. | |
13 | ||
14 | But for digging into what is happening in a particular area, or for debugging | |
15 | a problem it is often useful to see what U-Boot is doing in more detail than | |
16 | is visible from the basic console output. | |
17 | ||
18 | U-Boot's logging feature aims to satisfy this goal for both users and | |
19 | developers. | |
20 | ||
21 | ||
22 | Logging levels | |
23 | -------------- | |
24 | ||
25 | There are a number logging levels available, in increasing order of verbosity: | |
26 | ||
27 | LOGL_EMERG - Printed before U-Boot halts | |
28 | LOGL_ALERT - Indicates action must be taken immediate or U-Boot will crash | |
29 | LOGL_CRIT - Indicates a critical error that will cause boot failure | |
30 | LOGL_ERR - Indicates an error that may cause boot failure | |
31 | LOGL_WARNING - Warning about an unexpected condition | |
32 | LOGL_NOTE - Important information about progress | |
33 | LOGL_INFO - Information about normal boot progress | |
34 | LOGL_DEBUG - Debug information (useful for debugging a driver or subsystem) | |
35 | LOGL_DEBUG_CONTENT - Debug message showing full message content | |
36 | LOGL_DEBUG_IO - Debug message showing hardware I/O access | |
37 | ||
38 | ||
39 | Logging category | |
40 | ---------------- | |
41 | ||
42 | Logging can come from a wide variety of places within U-Boot. Each log message | |
43 | has a category which is intended to allow messages to be filtered according to | |
44 | their source. | |
45 | ||
46 | The following main categories are defined: | |
47 | ||
48 | LOGC_NONE - Unknown category (e.g. a debug() statement) | |
49 | UCLASS_... - Related to a particular uclass (e.g. UCLASS_USB) | |
50 | LOGC_ARCH - Related to architecture-specific code | |
51 | LOGC_BOARD - Related to board-specific code | |
52 | LOGC_CORE - Related to core driver-model support | |
53 | LOGC_DT - Related to device tree control | |
1973b381 | 54 | LOGC_EFI - Related to EFI implementation |
1d0f30a8 SG |
55 | |
56 | ||
57 | Enabling logging | |
58 | ---------------- | |
59 | ||
60 | The following options are used to enable logging at compile time: | |
61 | ||
62 | CONFIG_LOG - Enables the logging system | |
63 | CONFIG_MAX_LOG_LEVEL - Max log level to build (anything higher is compiled | |
64 | out) | |
65 | CONFIG_LOG_CONSOLE - Enable writing log records to the console | |
66 | ||
67 | If CONFIG_LOG is not set, then no logging will be available. | |
68 | ||
69 | The above have SPL versions also, e.g. CONFIG_SPL_MAX_LOG_LEVEL. | |
70 | ||
71 | ||
f9811e85 SG |
72 | Temporary logging within a single file |
73 | -------------------------------------- | |
74 | ||
75 | Sometimes it is useful to turn on logging just in one file. You can use this: | |
76 | ||
77 | #define LOG_DEBUG | |
78 | ||
79 | to enable building in of all logging statements in a single file. Put it at | |
80 | the top of the file, before any #includes. | |
81 | ||
82 | To actually get U-Boot to output this you need to also set the default logging | |
83 | level - e.g. set CONFIG_LOG_DEFAULT_LEVEL to 7 (LOGL_DEBUG) or more. Otherwise | |
84 | debug output is suppressed and will not be generated. | |
85 | ||
86 | ||
8dee7b96 SG |
87 | Convenience functions |
88 | --------------------- | |
89 | ||
90 | A number of convenience functions are available to shorten the code needed | |
91 | for logging: | |
92 | ||
93 | log_err(_fmt...) | |
94 | log_warning(_fmt...) | |
95 | log_notice(_fmt...) | |
96 | log_info(_fmt...) | |
97 | log_debug(_fmt...) | |
98 | log_content(_fmt...) | |
99 | log_io(_fmt...) | |
100 | ||
101 | With these the log level is implicit in the name. The category is set by | |
102 | LOG_CATEGORY, which you can only define once per file, above all #includes: | |
103 | ||
104 | #define LOG_CATEGORY LOGC_ALLOC | |
105 | ||
106 | or | |
107 | ||
108 | #define LOG_CATEGORY UCLASS_SPI | |
109 | ||
110 | Remember that all uclasses IDs are log categories too. | |
111 | ||
112 | ||
8cb7c042 SG |
113 | Log commands |
114 | ------------ | |
115 | ||
116 | The 'log' command provides access to several features: | |
117 | ||
118 | level - access the default log level | |
119 | format - access the console log format | |
120 | rec - output a log record | |
121 | test - run tests | |
122 | ||
123 | Type 'help log' for details. | |
124 | ||
125 | ||
1d0f30a8 SG |
126 | Using DEBUG |
127 | ----------- | |
128 | ||
129 | U-Boot has traditionally used a #define called DEBUG to enable debugging on a | |
130 | file-by-file basis. The debug() macro compiles to a printf() statement if | |
131 | DEBUG is enabled, and an empty statement if not. | |
132 | ||
133 | With logging enabled, debug() statements are interpreted as logging output | |
134 | with a level of LOGL_DEBUG and a category of LOGC_NONE. | |
135 | ||
136 | The logging facilities are intended to replace DEBUG, but if DEBUG is defined | |
137 | at the top of a file, then it takes precedence. This means that debug() | |
138 | statements will result in output to the console and this output will not be | |
139 | logged. | |
140 | ||
141 | ||
142 | Logging destinations | |
143 | -------------------- | |
144 | ||
145 | If logging information goes nowhere then it serves no purpose. U-Boot provides | |
146 | several possible determinations for logging information, all of which can be | |
147 | enabled or disabled independently: | |
148 | ||
149 | console - goes to stdout | |
befadde0 | 150 | syslog - broadcast RFC 3164 messages to syslog servers on UDP port 514 |
1d0f30a8 | 151 | |
befadde0 HS |
152 | The syslog driver sends the value of environmental variable 'log_hostname' as |
153 | HOSTNAME if available. | |
1d0f30a8 | 154 | |
8cb7c042 SG |
155 | Log format |
156 | ---------- | |
157 | ||
158 | You can control the log format using the 'log format' command. The basic | |
159 | format is: | |
160 | ||
161 | LEVEL.category,file.c:123-func() message | |
162 | ||
163 | In the above, file.c:123 is the filename where the log record was generated and | |
164 | func() is the function name. By default ('log format default') only the | |
165 | function name and message are displayed on the console. You can control which | |
166 | fields are present, but not the field order. | |
167 | ||
168 | ||
1d0f30a8 SG |
169 | Filters |
170 | ------- | |
171 | ||
172 | Filters are attached to log drivers to control what those drivers emit. Only | |
173 | records that pass through the filter make it to the driver. | |
174 | ||
175 | Filters can be based on several criteria: | |
176 | ||
177 | - maximum log level | |
178 | - in a set of categories | |
179 | - in a set of files | |
180 | ||
181 | If no filters are attached to a driver then a default filter is used, which | |
182 | limits output to records with a level less than CONFIG_LOG_MAX_LEVEL. | |
183 | ||
184 | ||
185 | Logging statements | |
186 | ------------------ | |
187 | ||
188 | The main logging function is: | |
189 | ||
190 | log(category, level, format_string, ...) | |
191 | ||
192 | Also debug() and error() will generate log records - these use LOG_CATEGORY | |
193 | as the category, so you should #define this right at the top of the source | |
194 | file to ensure the category is correct. | |
195 | ||
3707c6ee SG |
196 | You can also define CONFIG_LOG_ERROR_RETURN to enable the log_ret() macro. This |
197 | can be used whenever your function returns an error value: | |
198 | ||
199 | return log_ret(uclass_first_device(UCLASS_MMC, &dev)); | |
200 | ||
201 | This will write a log record when an error code is detected (a value < 0). This | |
202 | can make it easier to trace errors that are generated deep in the call stack. | |
203 | ||
1d0f30a8 SG |
204 | |
205 | Code size | |
206 | --------- | |
207 | ||
208 | Code size impact depends largely on what is enabled. The following numbers are | |
b71ac160 SG |
209 | generated by 'buildman -S' for snow, which is a Thumb-2 board (all units in |
210 | bytes): | |
1d0f30a8 SG |
211 | |
212 | This series: adds bss +20.0 data +4.0 rodata +4.0 text +44.0 | |
213 | CONFIG_LOG: bss -52.0 data +92.0 rodata -635.0 text +1048.0 | |
214 | CONFIG_LOG_MAX_LEVEL=7: bss +188.0 data +4.0 rodata +49183.0 text +98124.0 | |
215 | ||
216 | The last option turns every debug() statement into a logging call, which | |
217 | bloats the code hugely. The advantage is that it is then possible to enable | |
218 | all logging within U-Boot. | |
219 | ||
220 | ||
221 | To Do | |
222 | ----- | |
223 | ||
224 | There are lots of useful additions that could be made. None of the below is | |
225 | implemented! If you do one, please add a test in test/py/tests/test_log.py | |
226 | ||
227 | Convenience functions to support setting the category: | |
228 | ||
229 | log_arch(level, format_string, ...) - category LOGC_ARCH | |
230 | log_board(level, format_string, ...) - category LOGC_BOARD | |
231 | log_core(level, format_string, ...) - category LOGC_CORE | |
232 | log_dt(level, format_string, ...) - category LOGC_DT | |
233 | ||
1d0f30a8 SG |
234 | More logging destinations: |
235 | ||
236 | device - goes to a device (e.g. serial) | |
237 | buffer - recorded in a memory buffer | |
238 | ||
239 | Convert debug() statements in the code to log() statements | |
240 | ||
241 | Support making printf() emit log statements a L_INFO level | |
242 | ||
243 | Convert error() statements in the code to log() statements | |
244 | ||
245 | Figure out what to do with BUG(), BUG_ON() and warn_non_spl() | |
246 | ||
247 | Figure out what to do with assert() | |
248 | ||
249 | Add a way to browse log records | |
250 | ||
251 | Add a way to record log records for browsing using an external tool | |
252 | ||
253 | Add commands to add and remove filters | |
254 | ||
255 | Add commands to add and remove log devices | |
256 | ||
257 | Allow sharing of printf format strings in log records to reduce storage size | |
258 | for large numbers of log records | |
259 | ||
260 | Add a command-line option to sandbox to set the default logging level | |
261 | ||
262 | Convert core driver model code to use logging | |
263 | ||
264 | Convert uclasses to use logging with the correct category | |
265 | ||
266 | Consider making log() calls emit an automatic newline, perhaps with a logn() | |
267 | function to avoid that | |
268 | ||
269 | Passing log records through to linux (e.g. via device tree /chosen) | |
270 | ||
271 | Provide a command to access the number of log records generated, and the | |
272 | number dropped due to them being generated before the log system was ready. | |
273 | ||
274 | Add a printf() format string pragma so that log statements are checked properly | |
275 | ||
276 | Enhance the log console driver to show level / category / file / line | |
277 | information | |
278 | ||
279 | Add a command to add new log records and delete existing records. | |
280 | ||
281 | Provide additional log() functions - e.g. logc() to specify the category | |
282 | ||
283 | -- | |
284 | Simon Glass <[email protected]> | |
285 | 15-Sep-17 |