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