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