]>
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 | ||
8cb7c042 SG |
72 | Log commands |
73 | ------------ | |
74 | ||
75 | The 'log' command provides access to several features: | |
76 | ||
77 | level - access the default log level | |
78 | format - access the console log format | |
79 | rec - output a log record | |
80 | test - run tests | |
81 | ||
82 | Type 'help log' for details. | |
83 | ||
84 | ||
1d0f30a8 SG |
85 | Using DEBUG |
86 | ----------- | |
87 | ||
88 | U-Boot has traditionally used a #define called DEBUG to enable debugging on a | |
89 | file-by-file basis. The debug() macro compiles to a printf() statement if | |
90 | DEBUG is enabled, and an empty statement if not. | |
91 | ||
92 | With logging enabled, debug() statements are interpreted as logging output | |
93 | with a level of LOGL_DEBUG and a category of LOGC_NONE. | |
94 | ||
95 | The logging facilities are intended to replace DEBUG, but if DEBUG is defined | |
96 | at the top of a file, then it takes precedence. This means that debug() | |
97 | statements will result in output to the console and this output will not be | |
98 | logged. | |
99 | ||
100 | ||
101 | Logging destinations | |
102 | -------------------- | |
103 | ||
104 | If logging information goes nowhere then it serves no purpose. U-Boot provides | |
105 | several possible determinations for logging information, all of which can be | |
106 | enabled or disabled independently: | |
107 | ||
108 | console - goes to stdout | |
109 | ||
110 | ||
8cb7c042 SG |
111 | Log format |
112 | ---------- | |
113 | ||
114 | You can control the log format using the 'log format' command. The basic | |
115 | format is: | |
116 | ||
117 | LEVEL.category,file.c:123-func() message | |
118 | ||
119 | In the above, file.c:123 is the filename where the log record was generated and | |
120 | func() is the function name. By default ('log format default') only the | |
121 | function name and message are displayed on the console. You can control which | |
122 | fields are present, but not the field order. | |
123 | ||
124 | ||
1d0f30a8 SG |
125 | Filters |
126 | ------- | |
127 | ||
128 | Filters are attached to log drivers to control what those drivers emit. Only | |
129 | records that pass through the filter make it to the driver. | |
130 | ||
131 | Filters can be based on several criteria: | |
132 | ||
133 | - maximum log level | |
134 | - in a set of categories | |
135 | - in a set of files | |
136 | ||
137 | If no filters are attached to a driver then a default filter is used, which | |
138 | limits output to records with a level less than CONFIG_LOG_MAX_LEVEL. | |
139 | ||
140 | ||
141 | Logging statements | |
142 | ------------------ | |
143 | ||
144 | The main logging function is: | |
145 | ||
146 | log(category, level, format_string, ...) | |
147 | ||
148 | Also debug() and error() will generate log records - these use LOG_CATEGORY | |
149 | as the category, so you should #define this right at the top of the source | |
150 | file to ensure the category is correct. | |
151 | ||
3707c6ee SG |
152 | You can also define CONFIG_LOG_ERROR_RETURN to enable the log_ret() macro. This |
153 | can be used whenever your function returns an error value: | |
154 | ||
155 | return log_ret(uclass_first_device(UCLASS_MMC, &dev)); | |
156 | ||
157 | This will write a log record when an error code is detected (a value < 0). This | |
158 | can make it easier to trace errors that are generated deep in the call stack. | |
159 | ||
1d0f30a8 SG |
160 | |
161 | Code size | |
162 | --------- | |
163 | ||
164 | Code size impact depends largely on what is enabled. The following numbers are | |
b71ac160 SG |
165 | generated by 'buildman -S' for snow, which is a Thumb-2 board (all units in |
166 | bytes): | |
1d0f30a8 SG |
167 | |
168 | This series: adds bss +20.0 data +4.0 rodata +4.0 text +44.0 | |
169 | CONFIG_LOG: bss -52.0 data +92.0 rodata -635.0 text +1048.0 | |
170 | CONFIG_LOG_MAX_LEVEL=7: bss +188.0 data +4.0 rodata +49183.0 text +98124.0 | |
171 | ||
172 | The last option turns every debug() statement into a logging call, which | |
173 | bloats the code hugely. The advantage is that it is then possible to enable | |
174 | all logging within U-Boot. | |
175 | ||
176 | ||
177 | To Do | |
178 | ----- | |
179 | ||
180 | There are lots of useful additions that could be made. None of the below is | |
181 | implemented! If you do one, please add a test in test/py/tests/test_log.py | |
182 | ||
183 | Convenience functions to support setting the category: | |
184 | ||
185 | log_arch(level, format_string, ...) - category LOGC_ARCH | |
186 | log_board(level, format_string, ...) - category LOGC_BOARD | |
187 | log_core(level, format_string, ...) - category LOGC_CORE | |
188 | log_dt(level, format_string, ...) - category LOGC_DT | |
189 | ||
190 | Convenience functions to support a category defined for a single file, for | |
191 | example: | |
192 | ||
193 | #define LOG_CATEGORY UCLASS_USB | |
194 | ||
195 | all of these can use LOG_CATEGORY as the category, and a log level | |
196 | corresponding to the function name: | |
197 | ||
198 | logc(level, format_string, ...) | |
199 | ||
200 | More logging destinations: | |
201 | ||
202 | device - goes to a device (e.g. serial) | |
203 | buffer - recorded in a memory buffer | |
204 | ||
205 | Convert debug() statements in the code to log() statements | |
206 | ||
207 | Support making printf() emit log statements a L_INFO level | |
208 | ||
209 | Convert error() statements in the code to log() statements | |
210 | ||
211 | Figure out what to do with BUG(), BUG_ON() and warn_non_spl() | |
212 | ||
213 | Figure out what to do with assert() | |
214 | ||
215 | Add a way to browse log records | |
216 | ||
217 | Add a way to record log records for browsing using an external tool | |
218 | ||
219 | Add commands to add and remove filters | |
220 | ||
221 | Add commands to add and remove log devices | |
222 | ||
223 | Allow sharing of printf format strings in log records to reduce storage size | |
224 | for large numbers of log records | |
225 | ||
226 | Add a command-line option to sandbox to set the default logging level | |
227 | ||
228 | Convert core driver model code to use logging | |
229 | ||
230 | Convert uclasses to use logging with the correct category | |
231 | ||
232 | Consider making log() calls emit an automatic newline, perhaps with a logn() | |
233 | function to avoid that | |
234 | ||
235 | Passing log records through to linux (e.g. via device tree /chosen) | |
236 | ||
237 | Provide a command to access the number of log records generated, and the | |
238 | number dropped due to them being generated before the log system was ready. | |
239 | ||
240 | Add a printf() format string pragma so that log statements are checked properly | |
241 | ||
242 | Enhance the log console driver to show level / category / file / line | |
243 | information | |
244 | ||
245 | Add a command to add new log records and delete existing records. | |
246 | ||
247 | Provide additional log() functions - e.g. logc() to specify the category | |
248 | ||
249 | -- | |
250 | Simon Glass <[email protected]> | |
251 | 15-Sep-17 |