162306a36Sopenharmony_ci=========================================
262306a36Sopenharmony_ciHow to get printk format specifiers right
362306a36Sopenharmony_ci=========================================
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci.. _printk-specifiers:
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci:Author: Randy Dunlap <rdunlap@infradead.org>
862306a36Sopenharmony_ci:Author: Andrew Murray <amurray@mpc-data.co.uk>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ciInteger types
1262306a36Sopenharmony_ci=============
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci::
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci	If variable is of Type,		use printk format specifier:
1762306a36Sopenharmony_ci	------------------------------------------------------------
1862306a36Sopenharmony_ci		signed char		%d or %hhx
1962306a36Sopenharmony_ci		unsigned char		%u or %x
2062306a36Sopenharmony_ci		char			%u or %x
2162306a36Sopenharmony_ci		short int		%d or %hx
2262306a36Sopenharmony_ci		unsigned short int	%u or %x
2362306a36Sopenharmony_ci		int			%d or %x
2462306a36Sopenharmony_ci		unsigned int		%u or %x
2562306a36Sopenharmony_ci		long			%ld or %lx
2662306a36Sopenharmony_ci		unsigned long		%lu or %lx
2762306a36Sopenharmony_ci		long long		%lld or %llx
2862306a36Sopenharmony_ci		unsigned long long	%llu or %llx
2962306a36Sopenharmony_ci		size_t			%zu or %zx
3062306a36Sopenharmony_ci		ssize_t			%zd or %zx
3162306a36Sopenharmony_ci		s8			%d or %hhx
3262306a36Sopenharmony_ci		u8			%u or %x
3362306a36Sopenharmony_ci		s16			%d or %hx
3462306a36Sopenharmony_ci		u16			%u or %x
3562306a36Sopenharmony_ci		s32			%d or %x
3662306a36Sopenharmony_ci		u32			%u or %x
3762306a36Sopenharmony_ci		s64			%lld or %llx
3862306a36Sopenharmony_ci		u64			%llu or %llx
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ciIf <type> is architecture-dependent for its size (e.g., cycles_t, tcflag_t) or
4262306a36Sopenharmony_ciis dependent on a config option for its size (e.g., blk_status_t), use a format
4362306a36Sopenharmony_cispecifier of its largest possible type and explicitly cast to it.
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ciExample::
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	printk("test: latency: %llu cycles\n", (unsigned long long)time);
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ciReminder: sizeof() returns type size_t.
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ciThe kernel's printf does not support %n. Floating point formats (%e, %f,
5262306a36Sopenharmony_ci%g, %a) are also not recognized, for obvious reasons. Use of any
5362306a36Sopenharmony_ciunsupported specifier or length qualifier results in a WARN and early
5462306a36Sopenharmony_cireturn from vsnprintf().
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ciPointer types
5762306a36Sopenharmony_ci=============
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ciA raw pointer value may be printed with %p which will hash the address
6062306a36Sopenharmony_cibefore printing. The kernel also supports extended specifiers for printing
6162306a36Sopenharmony_cipointers of different types.
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ciSome of the extended specifiers print the data on the given address instead
6462306a36Sopenharmony_ciof printing the address itself. In this case, the following error messages
6562306a36Sopenharmony_cimight be printed instead of the unreachable information::
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci	(null)	 data on plain NULL address
6862306a36Sopenharmony_ci	(efault) data on invalid address
6962306a36Sopenharmony_ci	(einval) invalid data on a valid address
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ciPlain Pointers
7262306a36Sopenharmony_ci--------------
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci::
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci	%p	abcdef12 or 00000000abcdef12
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ciPointers printed without a specifier extension (i.e unadorned %p) are
7962306a36Sopenharmony_cihashed to prevent leaking information about the kernel memory layout. This
8062306a36Sopenharmony_cihas the added benefit of providing a unique identifier. On 64-bit machines
8162306a36Sopenharmony_cithe first 32 bits are zeroed. The kernel will print ``(ptrval)`` until it
8262306a36Sopenharmony_cigathers enough entropy.
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ciWhen possible, use specialised modifiers such as %pS or %pB (described below)
8562306a36Sopenharmony_cito avoid the need of providing an unhashed address that has to be interpreted
8662306a36Sopenharmony_cipost-hoc. If not possible, and the aim of printing the address is to provide
8762306a36Sopenharmony_cimore information for debugging, use %p and boot the kernel with the
8862306a36Sopenharmony_ci``no_hash_pointers`` parameter during debugging, which will print all %p
8962306a36Sopenharmony_ciaddresses unmodified. If you *really* always want the unmodified address, see
9062306a36Sopenharmony_ci%px below.
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ciIf (and only if) you are printing addresses as a content of a virtual file in
9362306a36Sopenharmony_cie.g. procfs or sysfs (using e.g. seq_printf(), not printk()) read by a
9462306a36Sopenharmony_ciuserspace process, use the %pK modifier described below instead of %p or %px.
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ciError Pointers
9762306a36Sopenharmony_ci--------------
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci::
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci	%pe	-ENOSPC
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ciFor printing error pointers (i.e. a pointer for which IS_ERR() is true)
10462306a36Sopenharmony_cias a symbolic error name. Error values for which no symbolic name is
10562306a36Sopenharmony_ciknown are printed in decimal, while a non-ERR_PTR passed as the
10662306a36Sopenharmony_ciargument to %pe gets treated as ordinary %p.
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ciSymbols/Function Pointers
10962306a36Sopenharmony_ci-------------------------
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci::
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci	%pS	versatile_init+0x0/0x110
11462306a36Sopenharmony_ci	%ps	versatile_init
11562306a36Sopenharmony_ci	%pSR	versatile_init+0x9/0x110
11662306a36Sopenharmony_ci		(with __builtin_extract_return_addr() translation)
11762306a36Sopenharmony_ci	%pB	prev_fn_of_versatile_init+0x88/0x88
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ciThe ``S`` and ``s`` specifiers are used for printing a pointer in symbolic
12162306a36Sopenharmony_ciformat. They result in the symbol name with (S) or without (s)
12262306a36Sopenharmony_cioffsets. If KALLSYMS are disabled then the symbol address is printed instead.
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ciThe ``B`` specifier results in the symbol name with offsets and should be
12562306a36Sopenharmony_ciused when printing stack backtraces. The specifier takes into
12662306a36Sopenharmony_ciconsideration the effect of compiler optimisations which may occur
12762306a36Sopenharmony_ciwhen tail-calls are used and marked with the noreturn GCC attribute.
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ciIf the pointer is within a module, the module name and optionally build ID is
13062306a36Sopenharmony_ciprinted after the symbol name with an extra ``b`` appended to the end of the
13162306a36Sopenharmony_cispecifier.
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci::
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci	%pS	versatile_init+0x0/0x110 [module_name]
13662306a36Sopenharmony_ci	%pSb	versatile_init+0x0/0x110 [module_name ed5019fdf5e53be37cb1ba7899292d7e143b259e]
13762306a36Sopenharmony_ci	%pSRb	versatile_init+0x9/0x110 [module_name ed5019fdf5e53be37cb1ba7899292d7e143b259e]
13862306a36Sopenharmony_ci		(with __builtin_extract_return_addr() translation)
13962306a36Sopenharmony_ci	%pBb	prev_fn_of_versatile_init+0x88/0x88 [module_name ed5019fdf5e53be37cb1ba7899292d7e143b259e]
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ciProbed Pointers from BPF / tracing
14262306a36Sopenharmony_ci----------------------------------
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci::
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci	%pks	kernel string
14762306a36Sopenharmony_ci	%pus	user string
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ciThe ``k`` and ``u`` specifiers are used for printing prior probed memory from
15062306a36Sopenharmony_cieither kernel memory (k) or user memory (u). The subsequent ``s`` specifier
15162306a36Sopenharmony_ciresults in printing a string. For direct use in regular vsnprintf() the (k)
15262306a36Sopenharmony_ciand (u) annotation is ignored, however, when used out of BPF's bpf_trace_printk(),
15362306a36Sopenharmony_cifor example, it reads the memory it is pointing to without faulting.
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ciKernel Pointers
15662306a36Sopenharmony_ci---------------
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci::
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci	%pK	01234567 or 0123456789abcdef
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ciFor printing kernel pointers which should be hidden from unprivileged
16362306a36Sopenharmony_ciusers. The behaviour of %pK depends on the kptr_restrict sysctl - see
16462306a36Sopenharmony_ciDocumentation/admin-guide/sysctl/kernel.rst for more details.
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ciThis modifier is *only* intended when producing content of a file read by
16762306a36Sopenharmony_ciuserspace from e.g. procfs or sysfs, not for dmesg. Please refer to the
16862306a36Sopenharmony_cisection about %p above for discussion about how to manage hashing pointers
16962306a36Sopenharmony_ciin printk().
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ciUnmodified Addresses
17262306a36Sopenharmony_ci--------------------
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_ci::
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ci	%px	01234567 or 0123456789abcdef
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ciFor printing pointers when you *really* want to print the address. Please
17962306a36Sopenharmony_ciconsider whether or not you are leaking sensitive information about the
18062306a36Sopenharmony_cikernel memory layout before printing pointers with %px. %px is functionally
18162306a36Sopenharmony_ciequivalent to %lx (or %lu). %px is preferred because it is more uniquely
18262306a36Sopenharmony_cigrep'able. If in the future we need to modify the way the kernel handles
18362306a36Sopenharmony_ciprinting pointers we will be better equipped to find the call sites.
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ciBefore using %px, consider if using %p is sufficient together with enabling the
18662306a36Sopenharmony_ci``no_hash_pointers`` kernel parameter during debugging sessions (see the %p
18762306a36Sopenharmony_cidescription above). One valid scenario for %px might be printing information
18862306a36Sopenharmony_ciimmediately before a panic, which prevents any sensitive information to be
18962306a36Sopenharmony_ciexploited anyway, and with %px there would be no need to reproduce the panic
19062306a36Sopenharmony_ciwith no_hash_pointers.
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_ciPointer Differences
19362306a36Sopenharmony_ci-------------------
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci::
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci	%td	2560
19862306a36Sopenharmony_ci	%tx	a00
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ciFor printing the pointer differences, use the %t modifier for ptrdiff_t.
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ciExample::
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci	printk("test: difference between pointers: %td\n", ptr2 - ptr1);
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ciStruct Resources
20762306a36Sopenharmony_ci----------------
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ci::
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci	%pr	[mem 0x60000000-0x6fffffff flags 0x2200] or
21262306a36Sopenharmony_ci		[mem 0x0000000060000000-0x000000006fffffff flags 0x2200]
21362306a36Sopenharmony_ci	%pR	[mem 0x60000000-0x6fffffff pref] or
21462306a36Sopenharmony_ci		[mem 0x0000000060000000-0x000000006fffffff pref]
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ciFor printing struct resources. The ``R`` and ``r`` specifiers result in a
21762306a36Sopenharmony_ciprinted resource with (R) or without (r) a decoded flags member.
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_ciPassed by reference.
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ciPhysical address types phys_addr_t
22262306a36Sopenharmony_ci----------------------------------
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_ci::
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_ci	%pa[p]	0x01234567 or 0x0123456789abcdef
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_ciFor printing a phys_addr_t type (and its derivatives, such as
22962306a36Sopenharmony_ciresource_size_t) which can vary based on build options, regardless of the
23062306a36Sopenharmony_ciwidth of the CPU data path.
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_ciPassed by reference.
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_ciDMA address types dma_addr_t
23562306a36Sopenharmony_ci----------------------------
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci::
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_ci	%pad	0x01234567 or 0x0123456789abcdef
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_ciFor printing a dma_addr_t type which can vary based on build options,
24262306a36Sopenharmony_ciregardless of the width of the CPU data path.
24362306a36Sopenharmony_ci
24462306a36Sopenharmony_ciPassed by reference.
24562306a36Sopenharmony_ci
24662306a36Sopenharmony_ciRaw buffer as an escaped string
24762306a36Sopenharmony_ci-------------------------------
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_ci::
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_ci	%*pE[achnops]
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_ciFor printing raw buffer as an escaped string. For the following buffer::
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_ci		1b 62 20 5c 43 07 22 90 0d 5d
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_ciA few examples show how the conversion would be done (excluding surrounding
25862306a36Sopenharmony_ciquotes)::
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_ci		%*pE		"\eb \C\a"\220\r]"
26162306a36Sopenharmony_ci		%*pEhp		"\x1bb \C\x07"\x90\x0d]"
26262306a36Sopenharmony_ci		%*pEa		"\e\142\040\\\103\a\042\220\r\135"
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ciThe conversion rules are applied according to an optional combination
26562306a36Sopenharmony_ciof flags (see :c:func:`string_escape_mem` kernel documentation for the
26662306a36Sopenharmony_cidetails):
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci	- a - ESCAPE_ANY
26962306a36Sopenharmony_ci	- c - ESCAPE_SPECIAL
27062306a36Sopenharmony_ci	- h - ESCAPE_HEX
27162306a36Sopenharmony_ci	- n - ESCAPE_NULL
27262306a36Sopenharmony_ci	- o - ESCAPE_OCTAL
27362306a36Sopenharmony_ci	- p - ESCAPE_NP
27462306a36Sopenharmony_ci	- s - ESCAPE_SPACE
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_ciBy default ESCAPE_ANY_NP is used.
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_ciESCAPE_ANY_NP is the sane choice for many cases, in particularly for
27962306a36Sopenharmony_ciprinting SSIDs.
28062306a36Sopenharmony_ci
28162306a36Sopenharmony_ciIf field width is omitted then 1 byte only will be escaped.
28262306a36Sopenharmony_ci
28362306a36Sopenharmony_ciRaw buffer as a hex string
28462306a36Sopenharmony_ci--------------------------
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ci::
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci	%*ph	00 01 02  ...  3f
28962306a36Sopenharmony_ci	%*phC	00:01:02: ... :3f
29062306a36Sopenharmony_ci	%*phD	00-01-02- ... -3f
29162306a36Sopenharmony_ci	%*phN	000102 ... 3f
29262306a36Sopenharmony_ci
29362306a36Sopenharmony_ciFor printing small buffers (up to 64 bytes long) as a hex string with a
29462306a36Sopenharmony_cicertain separator. For larger buffers consider using
29562306a36Sopenharmony_ci:c:func:`print_hex_dump`.
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_ciMAC/FDDI addresses
29862306a36Sopenharmony_ci------------------
29962306a36Sopenharmony_ci
30062306a36Sopenharmony_ci::
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci	%pM	00:01:02:03:04:05
30362306a36Sopenharmony_ci	%pMR	05:04:03:02:01:00
30462306a36Sopenharmony_ci	%pMF	00-01-02-03-04-05
30562306a36Sopenharmony_ci	%pm	000102030405
30662306a36Sopenharmony_ci	%pmR	050403020100
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_ciFor printing 6-byte MAC/FDDI addresses in hex notation. The ``M`` and ``m``
30962306a36Sopenharmony_cispecifiers result in a printed address with (M) or without (m) byte
31062306a36Sopenharmony_ciseparators. The default byte separator is the colon (:).
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_ciWhere FDDI addresses are concerned the ``F`` specifier can be used after
31362306a36Sopenharmony_cithe ``M`` specifier to use dash (-) separators instead of the default
31462306a36Sopenharmony_ciseparator.
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_ciFor Bluetooth addresses the ``R`` specifier shall be used after the ``M``
31762306a36Sopenharmony_cispecifier to use reversed byte order suitable for visual interpretation
31862306a36Sopenharmony_ciof Bluetooth addresses which are in the little endian order.
31962306a36Sopenharmony_ci
32062306a36Sopenharmony_ciPassed by reference.
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_ciIPv4 addresses
32362306a36Sopenharmony_ci--------------
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_ci::
32662306a36Sopenharmony_ci
32762306a36Sopenharmony_ci	%pI4	1.2.3.4
32862306a36Sopenharmony_ci	%pi4	001.002.003.004
32962306a36Sopenharmony_ci	%p[Ii]4[hnbl]
33062306a36Sopenharmony_ci
33162306a36Sopenharmony_ciFor printing IPv4 dot-separated decimal addresses. The ``I4`` and ``i4``
33262306a36Sopenharmony_cispecifiers result in a printed address with (i4) or without (I4) leading
33362306a36Sopenharmony_cizeros.
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ciThe additional ``h``, ``n``, ``b``, and ``l`` specifiers are used to specify
33662306a36Sopenharmony_cihost, network, big or little endian order addresses respectively. Where
33762306a36Sopenharmony_cino specifier is provided the default network/big endian order is used.
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ciPassed by reference.
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ciIPv6 addresses
34262306a36Sopenharmony_ci--------------
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_ci::
34562306a36Sopenharmony_ci
34662306a36Sopenharmony_ci	%pI6	0001:0002:0003:0004:0005:0006:0007:0008
34762306a36Sopenharmony_ci	%pi6	00010002000300040005000600070008
34862306a36Sopenharmony_ci	%pI6c	1:2:3:4:5:6:7:8
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_ciFor printing IPv6 network-order 16-bit hex addresses. The ``I6`` and ``i6``
35162306a36Sopenharmony_cispecifiers result in a printed address with (I6) or without (i6)
35262306a36Sopenharmony_cicolon-separators. Leading zeros are always used.
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_ciThe additional ``c`` specifier can be used with the ``I`` specifier to
35562306a36Sopenharmony_ciprint a compressed IPv6 address as described by
35662306a36Sopenharmony_cihttps://tools.ietf.org/html/rfc5952
35762306a36Sopenharmony_ci
35862306a36Sopenharmony_ciPassed by reference.
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_ciIPv4/IPv6 addresses (generic, with port, flowinfo, scope)
36162306a36Sopenharmony_ci---------------------------------------------------------
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_ci::
36462306a36Sopenharmony_ci
36562306a36Sopenharmony_ci	%pIS	1.2.3.4		or 0001:0002:0003:0004:0005:0006:0007:0008
36662306a36Sopenharmony_ci	%piS	001.002.003.004	or 00010002000300040005000600070008
36762306a36Sopenharmony_ci	%pISc	1.2.3.4		or 1:2:3:4:5:6:7:8
36862306a36Sopenharmony_ci	%pISpc	1.2.3.4:12345	or [1:2:3:4:5:6:7:8]:12345
36962306a36Sopenharmony_ci	%p[Ii]S[pfschnbl]
37062306a36Sopenharmony_ci
37162306a36Sopenharmony_ciFor printing an IP address without the need to distinguish whether it's of
37262306a36Sopenharmony_citype AF_INET or AF_INET6. A pointer to a valid struct sockaddr,
37362306a36Sopenharmony_cispecified through ``IS`` or ``iS``, can be passed to this format specifier.
37462306a36Sopenharmony_ci
37562306a36Sopenharmony_ciThe additional ``p``, ``f``, and ``s`` specifiers are used to specify port
37662306a36Sopenharmony_ci(IPv4, IPv6), flowinfo (IPv6) and scope (IPv6). Ports have a ``:`` prefix,
37762306a36Sopenharmony_ciflowinfo a ``/`` and scope a ``%``, each followed by the actual value.
37862306a36Sopenharmony_ci
37962306a36Sopenharmony_ciIn case of an IPv6 address the compressed IPv6 address as described by
38062306a36Sopenharmony_cihttps://tools.ietf.org/html/rfc5952 is being used if the additional
38162306a36Sopenharmony_cispecifier ``c`` is given. The IPv6 address is surrounded by ``[``, ``]`` in
38262306a36Sopenharmony_cicase of additional specifiers ``p``, ``f`` or ``s`` as suggested by
38362306a36Sopenharmony_cihttps://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-07
38462306a36Sopenharmony_ci
38562306a36Sopenharmony_ciIn case of IPv4 addresses, the additional ``h``, ``n``, ``b``, and ``l``
38662306a36Sopenharmony_cispecifiers can be used as well and are ignored in case of an IPv6
38762306a36Sopenharmony_ciaddress.
38862306a36Sopenharmony_ci
38962306a36Sopenharmony_ciPassed by reference.
39062306a36Sopenharmony_ci
39162306a36Sopenharmony_ciFurther examples::
39262306a36Sopenharmony_ci
39362306a36Sopenharmony_ci	%pISfc		1.2.3.4		or [1:2:3:4:5:6:7:8]/123456789
39462306a36Sopenharmony_ci	%pISsc		1.2.3.4		or [1:2:3:4:5:6:7:8]%1234567890
39562306a36Sopenharmony_ci	%pISpfc		1.2.3.4:12345	or [1:2:3:4:5:6:7:8]:12345/123456789
39662306a36Sopenharmony_ci
39762306a36Sopenharmony_ciUUID/GUID addresses
39862306a36Sopenharmony_ci-------------------
39962306a36Sopenharmony_ci
40062306a36Sopenharmony_ci::
40162306a36Sopenharmony_ci
40262306a36Sopenharmony_ci	%pUb	00010203-0405-0607-0809-0a0b0c0d0e0f
40362306a36Sopenharmony_ci	%pUB	00010203-0405-0607-0809-0A0B0C0D0E0F
40462306a36Sopenharmony_ci	%pUl	03020100-0504-0706-0809-0a0b0c0e0e0f
40562306a36Sopenharmony_ci	%pUL	03020100-0504-0706-0809-0A0B0C0E0E0F
40662306a36Sopenharmony_ci
40762306a36Sopenharmony_ciFor printing 16-byte UUID/GUIDs addresses. The additional ``l``, ``L``,
40862306a36Sopenharmony_ci``b`` and ``B`` specifiers are used to specify a little endian order in
40962306a36Sopenharmony_cilower (l) or upper case (L) hex notation - and big endian order in lower (b)
41062306a36Sopenharmony_cior upper case (B) hex notation.
41162306a36Sopenharmony_ci
41262306a36Sopenharmony_ciWhere no additional specifiers are used the default big endian
41362306a36Sopenharmony_ciorder with lower case hex notation will be printed.
41462306a36Sopenharmony_ci
41562306a36Sopenharmony_ciPassed by reference.
41662306a36Sopenharmony_ci
41762306a36Sopenharmony_cidentry names
41862306a36Sopenharmony_ci------------
41962306a36Sopenharmony_ci
42062306a36Sopenharmony_ci::
42162306a36Sopenharmony_ci
42262306a36Sopenharmony_ci	%pd{,2,3,4}
42362306a36Sopenharmony_ci	%pD{,2,3,4}
42462306a36Sopenharmony_ci
42562306a36Sopenharmony_ciFor printing dentry name; if we race with :c:func:`d_move`, the name might
42662306a36Sopenharmony_cibe a mix of old and new ones, but it won't oops.  %pd dentry is a safer
42762306a36Sopenharmony_ciequivalent of %s dentry->d_name.name we used to use, %pd<n> prints ``n``
42862306a36Sopenharmony_cilast components.  %pD does the same thing for struct file.
42962306a36Sopenharmony_ci
43062306a36Sopenharmony_ciPassed by reference.
43162306a36Sopenharmony_ci
43262306a36Sopenharmony_ciblock_device names
43362306a36Sopenharmony_ci------------------
43462306a36Sopenharmony_ci
43562306a36Sopenharmony_ci::
43662306a36Sopenharmony_ci
43762306a36Sopenharmony_ci	%pg	sda, sda1 or loop0p1
43862306a36Sopenharmony_ci
43962306a36Sopenharmony_ciFor printing name of block_device pointers.
44062306a36Sopenharmony_ci
44162306a36Sopenharmony_cistruct va_format
44262306a36Sopenharmony_ci----------------
44362306a36Sopenharmony_ci
44462306a36Sopenharmony_ci::
44562306a36Sopenharmony_ci
44662306a36Sopenharmony_ci	%pV
44762306a36Sopenharmony_ci
44862306a36Sopenharmony_ciFor printing struct va_format structures. These contain a format string
44962306a36Sopenharmony_ciand va_list as follows::
45062306a36Sopenharmony_ci
45162306a36Sopenharmony_ci	struct va_format {
45262306a36Sopenharmony_ci		const char *fmt;
45362306a36Sopenharmony_ci		va_list *va;
45462306a36Sopenharmony_ci	};
45562306a36Sopenharmony_ci
45662306a36Sopenharmony_ciImplements a "recursive vsnprintf".
45762306a36Sopenharmony_ci
45862306a36Sopenharmony_ciDo not use this feature without some mechanism to verify the
45962306a36Sopenharmony_cicorrectness of the format string and va_list arguments.
46062306a36Sopenharmony_ci
46162306a36Sopenharmony_ciPassed by reference.
46262306a36Sopenharmony_ci
46362306a36Sopenharmony_ciDevice tree nodes
46462306a36Sopenharmony_ci-----------------
46562306a36Sopenharmony_ci
46662306a36Sopenharmony_ci::
46762306a36Sopenharmony_ci
46862306a36Sopenharmony_ci	%pOF[fnpPcCF]
46962306a36Sopenharmony_ci
47062306a36Sopenharmony_ci
47162306a36Sopenharmony_ciFor printing device tree node structures. Default behaviour is
47262306a36Sopenharmony_ciequivalent to %pOFf.
47362306a36Sopenharmony_ci
47462306a36Sopenharmony_ci	- f - device node full_name
47562306a36Sopenharmony_ci	- n - device node name
47662306a36Sopenharmony_ci	- p - device node phandle
47762306a36Sopenharmony_ci	- P - device node path spec (name + @unit)
47862306a36Sopenharmony_ci	- F - device node flags
47962306a36Sopenharmony_ci	- c - major compatible string
48062306a36Sopenharmony_ci	- C - full compatible string
48162306a36Sopenharmony_ci
48262306a36Sopenharmony_ciThe separator when using multiple arguments is ':'
48362306a36Sopenharmony_ci
48462306a36Sopenharmony_ciExamples::
48562306a36Sopenharmony_ci
48662306a36Sopenharmony_ci	%pOF	/foo/bar@0			- Node full name
48762306a36Sopenharmony_ci	%pOFf	/foo/bar@0			- Same as above
48862306a36Sopenharmony_ci	%pOFfp	/foo/bar@0:10			- Node full name + phandle
48962306a36Sopenharmony_ci	%pOFfcF	/foo/bar@0:foo,device:--P-	- Node full name +
49062306a36Sopenharmony_ci	                                          major compatible string +
49162306a36Sopenharmony_ci						  node flags
49262306a36Sopenharmony_ci							D - dynamic
49362306a36Sopenharmony_ci							d - detached
49462306a36Sopenharmony_ci							P - Populated
49562306a36Sopenharmony_ci							B - Populated bus
49662306a36Sopenharmony_ci
49762306a36Sopenharmony_ciPassed by reference.
49862306a36Sopenharmony_ci
49962306a36Sopenharmony_ciFwnode handles
50062306a36Sopenharmony_ci--------------
50162306a36Sopenharmony_ci
50262306a36Sopenharmony_ci::
50362306a36Sopenharmony_ci
50462306a36Sopenharmony_ci	%pfw[fP]
50562306a36Sopenharmony_ci
50662306a36Sopenharmony_ciFor printing information on fwnode handles. The default is to print the full
50762306a36Sopenharmony_cinode name, including the path. The modifiers are functionally equivalent to
50862306a36Sopenharmony_ci%pOF above.
50962306a36Sopenharmony_ci
51062306a36Sopenharmony_ci	- f - full name of the node, including the path
51162306a36Sopenharmony_ci	- P - the name of the node including an address (if there is one)
51262306a36Sopenharmony_ci
51362306a36Sopenharmony_ciExamples (ACPI)::
51462306a36Sopenharmony_ci
51562306a36Sopenharmony_ci	%pfwf	\_SB.PCI0.CIO2.port@1.endpoint@0	- Full node name
51662306a36Sopenharmony_ci	%pfwP	endpoint@0				- Node name
51762306a36Sopenharmony_ci
51862306a36Sopenharmony_ciExamples (OF)::
51962306a36Sopenharmony_ci
52062306a36Sopenharmony_ci	%pfwf	/ocp@68000000/i2c@48072000/camera@10/port/endpoint - Full name
52162306a36Sopenharmony_ci	%pfwP	endpoint				- Node name
52262306a36Sopenharmony_ci
52362306a36Sopenharmony_ciTime and date
52462306a36Sopenharmony_ci-------------
52562306a36Sopenharmony_ci
52662306a36Sopenharmony_ci::
52762306a36Sopenharmony_ci
52862306a36Sopenharmony_ci	%pt[RT]			YYYY-mm-ddTHH:MM:SS
52962306a36Sopenharmony_ci	%pt[RT]s		YYYY-mm-dd HH:MM:SS
53062306a36Sopenharmony_ci	%pt[RT]d		YYYY-mm-dd
53162306a36Sopenharmony_ci	%pt[RT]t		HH:MM:SS
53262306a36Sopenharmony_ci	%pt[RT][dt][r][s]
53362306a36Sopenharmony_ci
53462306a36Sopenharmony_ciFor printing date and time as represented by::
53562306a36Sopenharmony_ci
53662306a36Sopenharmony_ci	R  struct rtc_time structure
53762306a36Sopenharmony_ci	T  time64_t type
53862306a36Sopenharmony_ci
53962306a36Sopenharmony_ciin human readable format.
54062306a36Sopenharmony_ci
54162306a36Sopenharmony_ciBy default year will be incremented by 1900 and month by 1.
54262306a36Sopenharmony_ciUse %pt[RT]r (raw) to suppress this behaviour.
54362306a36Sopenharmony_ci
54462306a36Sopenharmony_ciThe %pt[RT]s (space) will override ISO 8601 separator by using ' ' (space)
54562306a36Sopenharmony_ciinstead of 'T' (Capital T) between date and time. It won't have any effect
54662306a36Sopenharmony_ciwhen date or time is omitted.
54762306a36Sopenharmony_ci
54862306a36Sopenharmony_ciPassed by reference.
54962306a36Sopenharmony_ci
55062306a36Sopenharmony_cistruct clk
55162306a36Sopenharmony_ci----------
55262306a36Sopenharmony_ci
55362306a36Sopenharmony_ci::
55462306a36Sopenharmony_ci
55562306a36Sopenharmony_ci	%pC	pll1
55662306a36Sopenharmony_ci	%pCn	pll1
55762306a36Sopenharmony_ci
55862306a36Sopenharmony_ciFor printing struct clk structures. %pC and %pCn print the name of the clock
55962306a36Sopenharmony_ci(Common Clock Framework) or a unique 32-bit ID (legacy clock framework).
56062306a36Sopenharmony_ci
56162306a36Sopenharmony_ciPassed by reference.
56262306a36Sopenharmony_ci
56362306a36Sopenharmony_cibitmap and its derivatives such as cpumask and nodemask
56462306a36Sopenharmony_ci-------------------------------------------------------
56562306a36Sopenharmony_ci
56662306a36Sopenharmony_ci::
56762306a36Sopenharmony_ci
56862306a36Sopenharmony_ci	%*pb	0779
56962306a36Sopenharmony_ci	%*pbl	0,3-6,8-10
57062306a36Sopenharmony_ci
57162306a36Sopenharmony_ciFor printing bitmap and its derivatives such as cpumask and nodemask,
57262306a36Sopenharmony_ci%*pb outputs the bitmap with field width as the number of bits and %*pbl
57362306a36Sopenharmony_cioutput the bitmap as range list with field width as the number of bits.
57462306a36Sopenharmony_ci
57562306a36Sopenharmony_ciThe field width is passed by value, the bitmap is passed by reference.
57662306a36Sopenharmony_ciHelper macros cpumask_pr_args() and nodemask_pr_args() are available to ease
57762306a36Sopenharmony_ciprinting cpumask and nodemask.
57862306a36Sopenharmony_ci
57962306a36Sopenharmony_ciFlags bitfields such as page flags, page_type, gfp_flags
58062306a36Sopenharmony_ci--------------------------------------------------------
58162306a36Sopenharmony_ci
58262306a36Sopenharmony_ci::
58362306a36Sopenharmony_ci
58462306a36Sopenharmony_ci	%pGp	0x17ffffc0002036(referenced|uptodate|lru|active|private|node=0|zone=2|lastcpupid=0x1fffff)
58562306a36Sopenharmony_ci	%pGt	0xffffff7f(buddy)
58662306a36Sopenharmony_ci	%pGg	GFP_USER|GFP_DMA32|GFP_NOWARN
58762306a36Sopenharmony_ci	%pGv	read|exec|mayread|maywrite|mayexec|denywrite
58862306a36Sopenharmony_ci
58962306a36Sopenharmony_ciFor printing flags bitfields as a collection of symbolic constants that
59062306a36Sopenharmony_ciwould construct the value. The type of flags is given by the third
59162306a36Sopenharmony_cicharacter. Currently supported are:
59262306a36Sopenharmony_ci
59362306a36Sopenharmony_ci        - p - [p]age flags, expects value of type (``unsigned long *``)
59462306a36Sopenharmony_ci        - t - page [t]ype, expects value of type (``unsigned int *``)
59562306a36Sopenharmony_ci        - v - [v]ma_flags, expects value of type (``unsigned long *``)
59662306a36Sopenharmony_ci        - g - [g]fp_flags, expects value of type (``gfp_t *``)
59762306a36Sopenharmony_ci
59862306a36Sopenharmony_ciThe flag names and print order depends on the particular type.
59962306a36Sopenharmony_ci
60062306a36Sopenharmony_ciNote that this format should not be used directly in the
60162306a36Sopenharmony_ci:c:func:`TP_printk()` part of a tracepoint. Instead, use the show_*_flags()
60262306a36Sopenharmony_cifunctions from <trace/events/mmflags.h>.
60362306a36Sopenharmony_ci
60462306a36Sopenharmony_ciPassed by reference.
60562306a36Sopenharmony_ci
60662306a36Sopenharmony_ciNetwork device features
60762306a36Sopenharmony_ci-----------------------
60862306a36Sopenharmony_ci
60962306a36Sopenharmony_ci::
61062306a36Sopenharmony_ci
61162306a36Sopenharmony_ci	%pNF	0x000000000000c000
61262306a36Sopenharmony_ci
61362306a36Sopenharmony_ciFor printing netdev_features_t.
61462306a36Sopenharmony_ci
61562306a36Sopenharmony_ciPassed by reference.
61662306a36Sopenharmony_ci
61762306a36Sopenharmony_ciV4L2 and DRM FourCC code (pixel format)
61862306a36Sopenharmony_ci---------------------------------------
61962306a36Sopenharmony_ci
62062306a36Sopenharmony_ci::
62162306a36Sopenharmony_ci
62262306a36Sopenharmony_ci	%p4cc
62362306a36Sopenharmony_ci
62462306a36Sopenharmony_ciPrint a FourCC code used by V4L2 or DRM, including format endianness and
62562306a36Sopenharmony_ciits numerical value as hexadecimal.
62662306a36Sopenharmony_ci
62762306a36Sopenharmony_ciPassed by reference.
62862306a36Sopenharmony_ci
62962306a36Sopenharmony_ciExamples::
63062306a36Sopenharmony_ci
63162306a36Sopenharmony_ci	%p4cc	BG12 little-endian (0x32314742)
63262306a36Sopenharmony_ci	%p4cc	Y10  little-endian (0x20303159)
63362306a36Sopenharmony_ci	%p4cc	NV12 big-endian (0xb231564e)
63462306a36Sopenharmony_ci
63562306a36Sopenharmony_ciRust
63662306a36Sopenharmony_ci----
63762306a36Sopenharmony_ci
63862306a36Sopenharmony_ci::
63962306a36Sopenharmony_ci
64062306a36Sopenharmony_ci	%pA
64162306a36Sopenharmony_ci
64262306a36Sopenharmony_ciOnly intended to be used from Rust code to format ``core::fmt::Arguments``.
64362306a36Sopenharmony_ciDo *not* use it from C.
64462306a36Sopenharmony_ci
64562306a36Sopenharmony_ciThanks
64662306a36Sopenharmony_ci======
64762306a36Sopenharmony_ci
64862306a36Sopenharmony_ciIf you add other %p extensions, please extend <lib/test_printf.c> with
64962306a36Sopenharmony_cione or more test cases, if at all feasible.
65062306a36Sopenharmony_ci
65162306a36Sopenharmony_ciThank you for your cooperation and attention.
652