Commit | Line | Data |
---|---|---|
3b033380 MCC |
1 | ========================================= |
2 | How to get printk format specifiers right | |
3 | ========================================= | |
4 | ||
90c165f0 RC |
5 | .. _printk-specifiers: |
6 | ||
3b033380 MCC |
7 | :Author: Randy Dunlap <rdunlap@infradead.org> |
8 | :Author: Andrew Murray <amurray@mpc-data.co.uk> | |
9 | ||
b3ed2321 | 10 | |
3b033380 MCC |
11 | Integer types |
12 | ============= | |
13 | ||
14 | :: | |
15 | ||
16 | If variable is of Type, use printk format specifier: | |
17 | ------------------------------------------------------------ | |
cbacb5ab JP |
18 | char %d or %x |
19 | unsigned char %u or %x | |
20 | short int %d or %x | |
21 | unsigned short int %u or %x | |
b67ad18b RD |
22 | int %d or %x |
23 | unsigned int %u or %x | |
24 | long %ld or %lx | |
25 | unsigned long %lu or %lx | |
26 | long long %lld or %llx | |
27 | unsigned long long %llu or %llx | |
28 | size_t %zu or %zx | |
29 | ssize_t %zd or %zx | |
cbacb5ab JP |
30 | s8 %d or %x |
31 | u8 %u or %x | |
32 | s16 %d or %x | |
33 | u16 %u or %x | |
e8a7ba5f GU |
34 | s32 %d or %x |
35 | u32 %u or %x | |
36 | s64 %lld or %llx | |
37 | u64 %llu or %llx | |
38 | ||
b3ed2321 | 39 | |
d7c176e9 CL |
40 | If <type> is architecture-dependent for its size (e.g., cycles_t, tcflag_t) or |
41 | is dependent on a config option for its size (e.g., blk_status_t), use a format | |
42 | specifier of its largest possible type and explicitly cast to it. | |
3b033380 MCC |
43 | |
44 | Example:: | |
e8a7ba5f | 45 | |
d7c176e9 | 46 | printk("test: latency: %llu cycles\n", (unsigned long long)time); |
e8a7ba5f | 47 | |
b3ed2321 | 48 | Reminder: sizeof() returns type size_t. |
e8a7ba5f | 49 | |
b3ed2321 TH |
50 | The kernel's printf does not support %n. Floating point formats (%e, %f, |
51 | %g, %a) are also not recognized, for obvious reasons. Use of any | |
d7ec9a05 | 52 | unsupported specifier or length qualifier results in a WARN and early |
b3ed2321 | 53 | return from vsnprintf(). |
04c55715 | 54 | |
b3ed2321 | 55 | Pointer types |
ad67b74d TH |
56 | ============= |
57 | ||
b3ed2321 TH |
58 | A raw pointer value may be printed with %p which will hash the address |
59 | before printing. The kernel also supports extended specifiers for printing | |
60 | pointers of different types. | |
61 | ||
3e5903eb PM |
62 | Some of the extended specifiers print the data on the given address instead |
63 | of printing the address itself. In this case, the following error messages | |
64 | might be printed instead of the unreachable information:: | |
65 | ||
66 | (null) data on plain NULL address | |
67 | (efault) data on invalid address | |
635720ac | 68 | (einval) invalid data on a valid address |
3e5903eb | 69 | |
b3ed2321 TH |
70 | Plain Pointers |
71 | -------------- | |
ad67b74d TH |
72 | |
73 | :: | |
74 | ||
75 | %p abcdef12 or 00000000abcdef12 | |
76 | ||
b3ed2321 TH |
77 | Pointers printed without a specifier extension (i.e unadorned %p) are |
78 | hashed to prevent leaking information about the kernel memory layout. This | |
79 | has the added benefit of providing a unique identifier. On 64-bit machines | |
156383b1 | 80 | the first 32 bits are zeroed. The kernel will print ``(ptrval)`` until it |
a48849e2 VB |
81 | gathers enough entropy. |
82 | ||
83 | When possible, use specialised modifiers such as %pS or %pB (described below) | |
84 | to avoid the need of providing an unhashed address that has to be interpreted | |
85 | post-hoc. If not possible, and the aim of printing the address is to provide | |
86 | more information for debugging, use %p and boot the kernel with the | |
87 | ``no_hash_pointers`` parameter during debugging, which will print all %p | |
88 | addresses unmodified. If you *really* always want the unmodified address, see | |
89 | %px below. | |
90 | ||
91 | If (and only if) you are printing addresses as a content of a virtual file in | |
92 | e.g. procfs or sysfs (using e.g. seq_printf(), not printk()) read by a | |
93 | userspace process, use the %pK modifier described below instead of %p or %px. | |
b3ed2321 | 94 | |
57f5677e RV |
95 | Error Pointers |
96 | -------------- | |
97 | ||
98 | :: | |
99 | ||
100 | %pe -ENOSPC | |
101 | ||
102 | For printing error pointers (i.e. a pointer for which IS_ERR() is true) | |
103 | as a symbolic error name. Error values for which no symbolic name is | |
104 | known are printed in decimal, while a non-ERR_PTR passed as the | |
105 | argument to %pe gets treated as ordinary %p. | |
106 | ||
3b033380 | 107 | Symbols/Function Pointers |
b3ed2321 | 108 | ------------------------- |
3b033380 MCC |
109 | |
110 | :: | |
04c55715 | 111 | |
04b8eb7a SS |
112 | %pS versatile_init+0x0/0x110 |
113 | %ps versatile_init | |
b0d33c2b JP |
114 | %pSR versatile_init+0x9/0x110 |
115 | (with __builtin_extract_return_addr() translation) | |
04c55715 AM |
116 | %pB prev_fn_of_versatile_init+0x88/0x88 |
117 | ||
b3ed2321 | 118 | |
04b8eb7a | 119 | The ``S`` and ``s`` specifiers are used for printing a pointer in symbolic |
ab486bc9 | 120 | format. They result in the symbol name with (S) or without (s) |
04b8eb7a | 121 | offsets. If KALLSYMS are disabled then the symbol address is printed instead. |
d6957f33 | 122 | |
3b033380 MCC |
123 | The ``B`` specifier results in the symbol name with offsets and should be |
124 | used when printing stack backtraces. The specifier takes into | |
125 | consideration the effect of compiler optimisations which may occur | |
b3ed2321 | 126 | when tail-calls are used and marked with the noreturn GCC attribute. |
04c55715 | 127 | |
9294523e SB |
128 | If the pointer is within a module, the module name and optionally build ID is |
129 | printed after the symbol name with an extra ``b`` appended to the end of the | |
130 | specifier. | |
131 | ||
132 | :: | |
5b42d0bf | 133 | |
9294523e SB |
134 | %pS versatile_init+0x0/0x110 [module_name] |
135 | %pSb versatile_init+0x0/0x110 [module_name ed5019fdf5e53be37cb1ba7899292d7e143b259e] | |
136 | %pSRb versatile_init+0x9/0x110 [module_name ed5019fdf5e53be37cb1ba7899292d7e143b259e] | |
137 | (with __builtin_extract_return_addr() translation) | |
138 | %pBb prev_fn_of_versatile_init+0x88/0x88 [module_name ed5019fdf5e53be37cb1ba7899292d7e143b259e] | |
139 | ||
b2a5212f DB |
140 | Probed Pointers from BPF / tracing |
141 | ---------------------------------- | |
142 | ||
143 | :: | |
144 | ||
145 | %pks kernel string | |
146 | %pus user string | |
147 | ||
148 | The ``k`` and ``u`` specifiers are used for printing prior probed memory from | |
149 | either kernel memory (k) or user memory (u). The subsequent ``s`` specifier | |
150 | results in printing a string. For direct use in regular vsnprintf() the (k) | |
151 | and (u) annotation is ignored, however, when used out of BPF's bpf_trace_printk(), | |
152 | for example, it reads the memory it is pointing to without faulting. | |
153 | ||
3b033380 | 154 | Kernel Pointers |
b3ed2321 | 155 | --------------- |
04c55715 | 156 | |
3b033380 | 157 | :: |
04c55715 | 158 | |
553d8e8b | 159 | %pK 01234567 or 0123456789abcdef |
04c55715 | 160 | |
3b033380 | 161 | For printing kernel pointers which should be hidden from unprivileged |
b3ed2321 | 162 | users. The behaviour of %pK depends on the kptr_restrict sysctl - see |
57043247 | 163 | Documentation/admin-guide/sysctl/kernel.rst for more details. |
3b033380 | 164 | |
a48849e2 VB |
165 | This modifier is *only* intended when producing content of a file read by |
166 | userspace from e.g. procfs or sysfs, not for dmesg. Please refer to the | |
167 | section about %p above for discussion about how to manage hashing pointers | |
168 | in printk(). | |
169 | ||
7b1924a1 | 170 | Unmodified Addresses |
b3ed2321 | 171 | -------------------- |
7b1924a1 TH |
172 | |
173 | :: | |
174 | ||
175 | %px 01234567 or 0123456789abcdef | |
176 | ||
b3ed2321 | 177 | For printing pointers when you *really* want to print the address. Please |
7b1924a1 | 178 | consider whether or not you are leaking sensitive information about the |
b3ed2321 TH |
179 | kernel memory layout before printing pointers with %px. %px is functionally |
180 | equivalent to %lx (or %lu). %px is preferred because it is more uniquely | |
181 | grep'able. If in the future we need to modify the way the kernel handles | |
182 | printing pointers we will be better equipped to find the call sites. | |
7b1924a1 | 183 | |
a48849e2 VB |
184 | Before using %px, consider if using %p is sufficient together with enabling the |
185 | ``no_hash_pointers`` kernel parameter during debugging sessions (see the %p | |
186 | description above). One valid scenario for %px might be printing information | |
187 | immediately before a panic, which prevents any sensitive information to be | |
188 | exploited anyway, and with %px there would be no need to reproduce the panic | |
189 | with no_hash_pointers. | |
190 | ||
88288ed0 MC |
191 | Pointer Differences |
192 | ------------------- | |
193 | ||
194 | :: | |
195 | ||
196 | %td 2560 | |
197 | %tx a00 | |
198 | ||
199 | For printing the pointer differences, use the %t modifier for ptrdiff_t. | |
200 | ||
201 | Example:: | |
202 | ||
203 | printk("test: difference between pointers: %td\n", ptr2 - ptr1); | |
204 | ||
3b033380 | 205 | Struct Resources |
b3ed2321 | 206 | ---------------- |
04c55715 | 207 | |
3b033380 | 208 | :: |
04c55715 AM |
209 | |
210 | %pr [mem 0x60000000-0x6fffffff flags 0x2200] or | |
211 | [mem 0x0000000060000000-0x000000006fffffff flags 0x2200] | |
212 | %pR [mem 0x60000000-0x6fffffff pref] or | |
213 | [mem 0x0000000060000000-0x000000006fffffff pref] | |
214 | ||
3b033380 | 215 | For printing struct resources. The ``R`` and ``r`` specifiers result in a |
b3ed2321 TH |
216 | printed resource with (R) or without (r) a decoded flags member. |
217 | ||
3b033380 MCC |
218 | Passed by reference. |
219 | ||
b3ed2321 TH |
220 | Physical address types phys_addr_t |
221 | ---------------------------------- | |
04c55715 | 222 | |
3b033380 | 223 | :: |
7d799210 | 224 | |
aaf07621 | 225 | %pa[p] 0x01234567 or 0x0123456789abcdef |
7d799210 | 226 | |
b3ed2321 TH |
227 | For printing a phys_addr_t type (and its derivatives, such as |
228 | resource_size_t) which can vary based on build options, regardless of the | |
229 | width of the CPU data path. | |
230 | ||
231 | Passed by reference. | |
7d799210 | 232 | |
b3ed2321 TH |
233 | DMA address types dma_addr_t |
234 | ---------------------------- | |
3b033380 MCC |
235 | |
236 | :: | |
aaf07621 JP |
237 | |
238 | %pad 0x01234567 or 0x0123456789abcdef | |
239 | ||
b3ed2321 TH |
240 | For printing a dma_addr_t type which can vary based on build options, |
241 | regardless of the width of the CPU data path. | |
242 | ||
243 | Passed by reference. | |
3b033380 MCC |
244 | |
245 | Raw buffer as an escaped string | |
b3ed2321 | 246 | ------------------------------- |
aaf07621 | 247 | |
3b033380 | 248 | :: |
71dca95d AS |
249 | |
250 | %*pE[achnops] | |
251 | ||
3b033380 | 252 | For printing raw buffer as an escaped string. For the following buffer:: |
71dca95d AS |
253 | |
254 | 1b 62 20 5c 43 07 22 90 0d 5d | |
255 | ||
b3ed2321 TH |
256 | A few examples show how the conversion would be done (excluding surrounding |
257 | quotes):: | |
71dca95d AS |
258 | |
259 | %*pE "\eb \C\a"\220\r]" | |
260 | %*pEhp "\x1bb \C\x07"\x90\x0d]" | |
261 | %*pEa "\e\142\040\\\103\a\042\220\r\135" | |
262 | ||
3b033380 MCC |
263 | The conversion rules are applied according to an optional combination |
264 | of flags (see :c:func:`string_escape_mem` kernel documentation for the | |
265 | details): | |
266 | ||
b3ed2321 TH |
267 | - a - ESCAPE_ANY |
268 | - c - ESCAPE_SPECIAL | |
269 | - h - ESCAPE_HEX | |
270 | - n - ESCAPE_NULL | |
271 | - o - ESCAPE_OCTAL | |
272 | - p - ESCAPE_NP | |
273 | - s - ESCAPE_SPACE | |
71dca95d | 274 | |
3b033380 | 275 | By default ESCAPE_ANY_NP is used. |
71dca95d | 276 | |
3b033380 MCC |
277 | ESCAPE_ANY_NP is the sane choice for many cases, in particularly for |
278 | printing SSIDs. | |
71dca95d | 279 | |
b3ed2321 | 280 | If field width is omitted then 1 byte only will be escaped. |
3b033380 MCC |
281 | |
282 | Raw buffer as a hex string | |
b3ed2321 | 283 | -------------------------- |
3b033380 MCC |
284 | |
285 | :: | |
5e4ee7b1 | 286 | |
31550a16 AS |
287 | %*ph 00 01 02 ... 3f |
288 | %*phC 00:01:02: ... :3f | |
289 | %*phD 00-01-02- ... -3f | |
290 | %*phN 000102 ... 3f | |
291 | ||
b3ed2321 TH |
292 | For printing small buffers (up to 64 bytes long) as a hex string with a |
293 | certain separator. For larger buffers consider using | |
3b033380 MCC |
294 | :c:func:`print_hex_dump`. |
295 | ||
296 | MAC/FDDI addresses | |
b3ed2321 | 297 | ------------------ |
31550a16 | 298 | |
3b033380 | 299 | :: |
04c55715 AM |
300 | |
301 | %pM 00:01:02:03:04:05 | |
76597ff9 | 302 | %pMR 05:04:03:02:01:00 |
04c55715 AM |
303 | %pMF 00-01-02-03-04-05 |
304 | %pm 000102030405 | |
7c59154e | 305 | %pmR 050403020100 |
04c55715 | 306 | |
3b033380 | 307 | For printing 6-byte MAC/FDDI addresses in hex notation. The ``M`` and ``m`` |
b3ed2321 TH |
308 | specifiers result in a printed address with (M) or without (m) byte |
309 | separators. The default byte separator is the colon (:). | |
04c55715 | 310 | |
3b033380 | 311 | Where FDDI addresses are concerned the ``F`` specifier can be used after |
b3ed2321 | 312 | the ``M`` specifier to use dash (-) separators instead of the default |
3b033380 | 313 | separator. |
04c55715 | 314 | |
3b033380 MCC |
315 | For Bluetooth addresses the ``R`` specifier shall be used after the ``M`` |
316 | specifier to use reversed byte order suitable for visual interpretation | |
317 | of Bluetooth addresses which are in the little endian order. | |
76597ff9 | 318 | |
3b033380 MCC |
319 | Passed by reference. |
320 | ||
321 | IPv4 addresses | |
b3ed2321 | 322 | -------------- |
7330660e | 323 | |
3b033380 | 324 | :: |
04c55715 AM |
325 | |
326 | %pI4 1.2.3.4 | |
327 | %pi4 001.002.003.004 | |
8ecada16 | 328 | %p[Ii]4[hnbl] |
04c55715 | 329 | |
3b033380 | 330 | For printing IPv4 dot-separated decimal addresses. The ``I4`` and ``i4`` |
b3ed2321 TH |
331 | specifiers result in a printed address with (i4) or without (I4) leading |
332 | zeros. | |
04c55715 | 333 | |
3b033380 MCC |
334 | The additional ``h``, ``n``, ``b``, and ``l`` specifiers are used to specify |
335 | host, network, big or little endian order addresses respectively. Where | |
336 | no specifier is provided the default network/big endian order is used. | |
04c55715 | 337 | |
3b033380 | 338 | Passed by reference. |
7330660e | 339 | |
3b033380 | 340 | IPv6 addresses |
b3ed2321 | 341 | -------------- |
3b033380 MCC |
342 | |
343 | :: | |
04c55715 AM |
344 | |
345 | %pI6 0001:0002:0003:0004:0005:0006:0007:0008 | |
346 | %pi6 00010002000300040005000600070008 | |
347 | %pI6c 1:2:3:4:5:6:7:8 | |
348 | ||
3b033380 | 349 | For printing IPv6 network-order 16-bit hex addresses. The ``I6`` and ``i6`` |
b3ed2321 | 350 | specifiers result in a printed address with (I6) or without (i6) |
3b033380 | 351 | colon-separators. Leading zeros are always used. |
04c55715 | 352 | |
3b033380 MCC |
353 | The additional ``c`` specifier can be used with the ``I`` specifier to |
354 | print a compressed IPv6 address as described by | |
8eda94bd | 355 | https://tools.ietf.org/html/rfc5952 |
04c55715 | 356 | |
3b033380 | 357 | Passed by reference. |
7330660e | 358 | |
3b033380 | 359 | IPv4/IPv6 addresses (generic, with port, flowinfo, scope) |
b3ed2321 | 360 | --------------------------------------------------------- |
3b033380 MCC |
361 | |
362 | :: | |
10679643 DB |
363 | |
364 | %pIS 1.2.3.4 or 0001:0002:0003:0004:0005:0006:0007:0008 | |
365 | %piS 001.002.003.004 or 00010002000300040005000600070008 | |
366 | %pISc 1.2.3.4 or 1:2:3:4:5:6:7:8 | |
367 | %pISpc 1.2.3.4:12345 or [1:2:3:4:5:6:7:8]:12345 | |
368 | %p[Ii]S[pfschnbl] | |
369 | ||
b3ed2321 TH |
370 | For printing an IP address without the need to distinguish whether it's of |
371 | type AF_INET or AF_INET6. A pointer to a valid struct sockaddr, | |
3b033380 | 372 | specified through ``IS`` or ``iS``, can be passed to this format specifier. |
10679643 | 373 | |
3b033380 MCC |
374 | The additional ``p``, ``f``, and ``s`` specifiers are used to specify port |
375 | (IPv4, IPv6), flowinfo (IPv6) and scope (IPv6). Ports have a ``:`` prefix, | |
376 | flowinfo a ``/`` and scope a ``%``, each followed by the actual value. | |
10679643 | 377 | |
3b033380 | 378 | In case of an IPv6 address the compressed IPv6 address as described by |
8eda94bd | 379 | https://tools.ietf.org/html/rfc5952 is being used if the additional |
3b033380 MCC |
380 | specifier ``c`` is given. The IPv6 address is surrounded by ``[``, ``]`` in |
381 | case of additional specifiers ``p``, ``f`` or ``s`` as suggested by | |
382 | https://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-07 | |
10679643 | 383 | |
3b033380 MCC |
384 | In case of IPv4 addresses, the additional ``h``, ``n``, ``b``, and ``l`` |
385 | specifiers can be used as well and are ignored in case of an IPv6 | |
386 | address. | |
10679643 | 387 | |
3b033380 | 388 | Passed by reference. |
7330660e | 389 | |
3b033380 | 390 | Further examples:: |
10679643 DB |
391 | |
392 | %pISfc 1.2.3.4 or [1:2:3:4:5:6:7:8]/123456789 | |
393 | %pISsc 1.2.3.4 or [1:2:3:4:5:6:7:8]%1234567890 | |
394 | %pISpfc 1.2.3.4:12345 or [1:2:3:4:5:6:7:8]:12345/123456789 | |
395 | ||
3b033380 | 396 | UUID/GUID addresses |
b3ed2321 | 397 | ------------------- |
3b033380 MCC |
398 | |
399 | :: | |
04c55715 AM |
400 | |
401 | %pUb 00010203-0405-0607-0809-0a0b0c0d0e0f | |
402 | %pUB 00010203-0405-0607-0809-0A0B0C0D0E0F | |
403 | %pUl 03020100-0504-0706-0809-0a0b0c0e0e0f | |
404 | %pUL 03020100-0504-0706-0809-0A0B0C0E0E0F | |
405 | ||
b3ed2321 TH |
406 | For printing 16-byte UUID/GUIDs addresses. The additional ``l``, ``L``, |
407 | ``b`` and ``B`` specifiers are used to specify a little endian order in | |
408 | lower (l) or upper case (L) hex notation - and big endian order in lower (b) | |
409 | or upper case (B) hex notation. | |
04c55715 | 410 | |
3b033380 | 411 | Where no additional specifiers are used the default big endian |
b3ed2321 | 412 | order with lower case hex notation will be printed. |
04c55715 | 413 | |
3b033380 MCC |
414 | Passed by reference. |
415 | ||
416 | dentry names | |
b3ed2321 | 417 | ------------ |
7330660e | 418 | |
3b033380 | 419 | :: |
5e4ee7b1 | 420 | |
4b6ccca7 AV |
421 | %pd{,2,3,4} |
422 | %pD{,2,3,4} | |
423 | ||
b3ed2321 TH |
424 | For printing dentry name; if we race with :c:func:`d_move`, the name might |
425 | be a mix of old and new ones, but it won't oops. %pd dentry is a safer | |
426 | equivalent of %s dentry->d_name.name we used to use, %pd<n> prints ``n`` | |
427 | last components. %pD does the same thing for struct file. | |
4b6ccca7 | 428 | |
3b033380 | 429 | Passed by reference. |
7330660e | 430 | |
3b033380 | 431 | block_device names |
b3ed2321 | 432 | ------------------ |
3b033380 MCC |
433 | |
434 | :: | |
1031bc58 DM |
435 | |
436 | %pg sda, sda1 or loop0p1 | |
437 | ||
3b033380 MCC |
438 | For printing name of block_device pointers. |
439 | ||
440 | struct va_format | |
b3ed2321 | 441 | ---------------- |
1031bc58 | 442 | |
3b033380 | 443 | :: |
04c55715 AM |
444 | |
445 | %pV | |
446 | ||
3b033380 MCC |
447 | For printing struct va_format structures. These contain a format string |
448 | and va_list as follows:: | |
04c55715 AM |
449 | |
450 | struct va_format { | |
451 | const char *fmt; | |
452 | va_list *va; | |
453 | }; | |
454 | ||
3b033380 | 455 | Implements a "recursive vsnprintf". |
5e4ee7b1 | 456 | |
3b033380 MCC |
457 | Do not use this feature without some mechanism to verify the |
458 | correctness of the format string and va_list arguments. | |
b67ad18b | 459 | |
3b033380 MCC |
460 | Passed by reference. |
461 | ||
94ac8f20 GU |
462 | Device tree nodes |
463 | ----------------- | |
3b033380 MCC |
464 | |
465 | :: | |
7330660e | 466 | |
b3ed2321 | 467 | %pOF[fnpPcCF] |
ce4fecf1 | 468 | |
ce4fecf1 | 469 | |
94ac8f20 | 470 | For printing device tree node structures. Default behaviour is |
b3ed2321 | 471 | equivalent to %pOFf. |
ce4fecf1 | 472 | |
b3ed2321 TH |
473 | - f - device node full_name |
474 | - n - device node name | |
475 | - p - device node phandle | |
476 | - P - device node path spec (name + @unit) | |
477 | - F - device node flags | |
478 | - c - major compatible string | |
479 | - C - full compatible string | |
ce4fecf1 | 480 | |
b3ed2321 | 481 | The separator when using multiple arguments is ':' |
ce4fecf1 | 482 | |
b3ed2321 | 483 | Examples:: |
ce4fecf1 PA |
484 | |
485 | %pOF /foo/bar@0 - Node full name | |
486 | %pOFf /foo/bar@0 - Same as above | |
487 | %pOFfp /foo/bar@0:10 - Node full name + phandle | |
488 | %pOFfcF /foo/bar@0:foo,device:--P- - Node full name + | |
489 | major compatible string + | |
490 | node flags | |
491 | D - dynamic | |
492 | d - detached | |
493 | P - Populated | |
494 | B - Populated bus | |
495 | ||
b3ed2321 | 496 | Passed by reference. |
3b033380 | 497 | |
3bd32d6a SA |
498 | Fwnode handles |
499 | -------------- | |
500 | ||
501 | :: | |
502 | ||
503 | %pfw[fP] | |
504 | ||
505 | For printing information on fwnode handles. The default is to print the full | |
506 | node name, including the path. The modifiers are functionally equivalent to | |
507 | %pOF above. | |
508 | ||
509 | - f - full name of the node, including the path | |
510 | - P - the name of the node including an address (if there is one) | |
511 | ||
512 | Examples (ACPI):: | |
513 | ||
514 | %pfwf \_SB.PCI0.CIO2.port@1.endpoint@0 - Full node name | |
515 | %pfwP endpoint@0 - Node name | |
516 | ||
517 | Examples (OF):: | |
518 | ||
519 | %pfwf /ocp@68000000/i2c@48072000/camera@10/port/endpoint - Full name | |
520 | %pfwP endpoint - Node name | |
521 | ||
7daac5b2 AS |
522 | Time and date |
523 | ------------- | |
4d42c447 AS |
524 | |
525 | :: | |
526 | ||
7daac5b2 | 527 | %pt[RT] YYYY-mm-ddTHH:MM:SS |
20bc8c1e | 528 | %pt[RT]s YYYY-mm-dd HH:MM:SS |
7daac5b2 AS |
529 | %pt[RT]d YYYY-mm-dd |
530 | %pt[RT]t HH:MM:SS | |
20bc8c1e | 531 | %pt[RT][dt][r][s] |
4d42c447 | 532 | |
b7f41995 DA |
533 | For printing date and time as represented by:: |
534 | ||
7daac5b2 AS |
535 | R struct rtc_time structure |
536 | T time64_t type | |
b7f41995 | 537 | |
7daac5b2 | 538 | in human readable format. |
4d42c447 | 539 | |
7daac5b2 AS |
540 | By default year will be incremented by 1900 and month by 1. |
541 | Use %pt[RT]r (raw) to suppress this behaviour. | |
4d42c447 | 542 | |
20bc8c1e AS |
543 | The %pt[RT]s (space) will override ISO 8601 separator by using ' ' (space) |
544 | instead of 'T' (Capital T) between date and time. It won't have any effect | |
545 | when date or time is omitted. | |
546 | ||
4d42c447 AS |
547 | Passed by reference. |
548 | ||
3b033380 | 549 | struct clk |
b3ed2321 | 550 | ---------- |
3b033380 MCC |
551 | |
552 | :: | |
900cca29 GU |
553 | |
554 | %pC pll1 | |
555 | %pCn pll1 | |
900cca29 | 556 | |
ec12bc29 GU |
557 | For printing struct clk structures. %pC and %pCn print the name of the clock |
558 | (Common Clock Framework) or a unique 32-bit ID (legacy clock framework). | |
900cca29 | 559 | |
3b033380 | 560 | Passed by reference. |
900cca29 | 561 | |
3b033380 | 562 | bitmap and its derivatives such as cpumask and nodemask |
b3ed2321 | 563 | ------------------------------------------------------- |
3b033380 MCC |
564 | |
565 | :: | |
d0724961 WL |
566 | |
567 | %*pb 0779 | |
568 | %*pbl 0,3-6,8-10 | |
569 | ||
3b033380 | 570 | For printing bitmap and its derivatives such as cpumask and nodemask, |
b3ed2321 | 571 | %*pb outputs the bitmap with field width as the number of bits and %*pbl |
3b033380 | 572 | output the bitmap as range list with field width as the number of bits. |
d0724961 | 573 | |
04d0608b GU |
574 | The field width is passed by value, the bitmap is passed by reference. |
575 | Helper macros cpumask_pr_args() and nodemask_pr_args() are available to ease | |
576 | printing cpumask and nodemask. | |
3b033380 MCC |
577 | |
578 | Flags bitfields such as page flags, gfp_flags | |
b3ed2321 | 579 | --------------------------------------------- |
b67ad18b | 580 | |
3b033380 | 581 | :: |
edf14cdb | 582 | |
6a7ca80f | 583 | %pGp 0x17ffffc0002036(referenced|uptodate|lru|active|private|node=0|zone=2|lastcpupid=0x1fffff) |
edf14cdb VB |
584 | %pGg GFP_USER|GFP_DMA32|GFP_NOWARN |
585 | %pGv read|exec|mayread|maywrite|mayexec|denywrite | |
586 | ||
3b033380 MCC |
587 | For printing flags bitfields as a collection of symbolic constants that |
588 | would construct the value. The type of flags is given by the third | |
589 | character. Currently supported are [p]age flags, [v]ma_flags (both | |
590 | expect ``unsigned long *``) and [g]fp_flags (expects ``gfp_t *``). The flag | |
591 | names and print order depends on the particular type. | |
edf14cdb | 592 | |
b3ed2321 TH |
593 | Note that this format should not be used directly in the |
594 | :c:func:`TP_printk()` part of a tracepoint. Instead, use the show_*_flags() | |
595 | functions from <trace/events/mmflags.h>. | |
edf14cdb | 596 | |
3b033380 MCC |
597 | Passed by reference. |
598 | ||
599 | Network device features | |
b3ed2321 | 600 | ----------------------- |
edf14cdb | 601 | |
3b033380 | 602 | :: |
5e4ee7b1 MK |
603 | |
604 | %pNF 0x000000000000c000 | |
605 | ||
3b033380 | 606 | For printing netdev_features_t. |
5e4ee7b1 | 607 | |
3b033380 | 608 | Passed by reference. |
5e4ee7b1 | 609 | |
af612e43 SA |
610 | V4L2 and DRM FourCC code (pixel format) |
611 | --------------------------------------- | |
612 | ||
613 | :: | |
614 | ||
615 | %p4cc | |
616 | ||
617 | Print a FourCC code used by V4L2 or DRM, including format endianness and | |
618 | its numerical value as hexadecimal. | |
619 | ||
620 | Passed by reference. | |
621 | ||
622 | Examples:: | |
623 | ||
624 | %p4cc BG12 little-endian (0x32314742) | |
625 | %p4cc Y10 little-endian (0x20303159) | |
626 | %p4cc NV12 big-endian (0xb231564e) | |
627 | ||
787983da GG |
628 | Rust |
629 | ---- | |
630 | ||
631 | :: | |
632 | ||
633 | %pA | |
634 | ||
635 | Only intended to be used from Rust code to format ``core::fmt::Arguments``. | |
636 | Do *not* use it from C. | |
637 | ||
b3ed2321 TH |
638 | Thanks |
639 | ====== | |
5e4ee7b1 | 640 | |
b3ed2321 TH |
641 | If you add other %p extensions, please extend <lib/test_printf.c> with |
642 | one or more test cases, if at all feasible. | |
5e4ee7b1 | 643 | |
b67ad18b | 644 | Thank you for your cooperation and attention. |