mirror of
https://github.com/torvalds/linux.git
synced 2024-12-15 07:33:56 +00:00
31550a16a5
There are many places in the kernel where the drivers print small buffers as a hex string. This patch adds a support of the variable width buffer to print it as a hex string with a delimiter. The idea came from Pavel Roskin here: http://www.digipedia.pl/usenet/thread/18835/17449/ Sample output of pr_info("buf[%d:%d] %*phC\n", from, len, len, &buf[from]); could be look like this: [ 0.726130] buf[51:8] e8:16:b6:ef:e3:74:45:6e [ 0.750736] buf[59:15] 31:81:b8:3f:35:49:06:ae:df:32:06:05:4a:af:55 [ 0.757602] buf[17:5] ac:16:d5:2c:ef Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Cc: Joe Perches <joe@perches.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
166 lines
5.4 KiB
Plaintext
166 lines
5.4 KiB
Plaintext
If variable is of Type, use printk format specifier:
|
|
---------------------------------------------------------
|
|
int %d or %x
|
|
unsigned int %u or %x
|
|
long %ld or %lx
|
|
unsigned long %lu or %lx
|
|
long long %lld or %llx
|
|
unsigned long long %llu or %llx
|
|
size_t %zu or %zx
|
|
ssize_t %zd or %zx
|
|
|
|
Raw pointer value SHOULD be printed with %p. The kernel supports
|
|
the following extended format specifiers for pointer types:
|
|
|
|
Symbols/Function Pointers:
|
|
|
|
%pF versatile_init+0x0/0x110
|
|
%pf versatile_init
|
|
%pS versatile_init+0x0/0x110
|
|
%ps versatile_init
|
|
%pB prev_fn_of_versatile_init+0x88/0x88
|
|
|
|
For printing symbols and function pointers. The 'S' and 's' specifiers
|
|
result in the symbol name with ('S') or without ('s') offsets. Where
|
|
this is used on a kernel without KALLSYMS - the symbol address is
|
|
printed instead.
|
|
|
|
The 'B' specifier results in the symbol name with offsets and should be
|
|
used when printing stack backtraces. The specifier takes into
|
|
consideration the effect of compiler optimisations which may occur
|
|
when tail-call's are used and marked with the noreturn GCC attribute.
|
|
|
|
On ia64, ppc64 and parisc64 architectures function pointers are
|
|
actually function descriptors which must first be resolved. The 'F' and
|
|
'f' specifiers perform this resolution and then provide the same
|
|
functionality as the 'S' and 's' specifiers.
|
|
|
|
Kernel Pointers:
|
|
|
|
%pK 0x01234567 or 0x0123456789abcdef
|
|
|
|
For printing kernel pointers which should be hidden from unprivileged
|
|
users. The behaviour of %pK depends on the kptr_restrict sysctl - see
|
|
Documentation/sysctl/kernel.txt for more details.
|
|
|
|
Struct Resources:
|
|
|
|
%pr [mem 0x60000000-0x6fffffff flags 0x2200] or
|
|
[mem 0x0000000060000000-0x000000006fffffff flags 0x2200]
|
|
%pR [mem 0x60000000-0x6fffffff pref] or
|
|
[mem 0x0000000060000000-0x000000006fffffff pref]
|
|
|
|
For printing struct resources. The 'R' and 'r' specifiers result in a
|
|
printed resource with ('R') or without ('r') a decoded flags member.
|
|
|
|
Raw buffer as a hex string:
|
|
%*ph 00 01 02 ... 3f
|
|
%*phC 00:01:02: ... :3f
|
|
%*phD 00-01-02- ... -3f
|
|
%*phN 000102 ... 3f
|
|
|
|
For printing a small buffers (up to 64 bytes long) as a hex string with
|
|
certain separator. For the larger buffers consider to use
|
|
print_hex_dump().
|
|
|
|
MAC/FDDI addresses:
|
|
|
|
%pM 00:01:02:03:04:05
|
|
%pMR 05:04:03:02:01:00
|
|
%pMF 00-01-02-03-04-05
|
|
%pm 000102030405
|
|
|
|
For printing 6-byte MAC/FDDI addresses in hex notation. The 'M' and 'm'
|
|
specifiers result in a printed address with ('M') or without ('m') byte
|
|
separators. The default byte separator is the colon (':').
|
|
|
|
Where FDDI addresses are concerned the 'F' specifier can be used after
|
|
the 'M' specifier to use dash ('-') separators instead of the default
|
|
separator.
|
|
|
|
For Bluetooth addresses the 'R' specifier shall be used after the 'M'
|
|
specifier to use reversed byte order suitable for visual interpretation
|
|
of Bluetooth addresses which are in the little endian order.
|
|
|
|
IPv4 addresses:
|
|
|
|
%pI4 1.2.3.4
|
|
%pi4 001.002.003.004
|
|
%p[Ii][hnbl]
|
|
|
|
For printing IPv4 dot-separated decimal addresses. The 'I4' and 'i4'
|
|
specifiers result in a printed address with ('i4') or without ('I4')
|
|
leading zeros.
|
|
|
|
The additional 'h', 'n', 'b', and 'l' specifiers are used to specify
|
|
host, network, big or little endian order addresses respectively. Where
|
|
no specifier is provided the default network/big endian order is used.
|
|
|
|
IPv6 addresses:
|
|
|
|
%pI6 0001:0002:0003:0004:0005:0006:0007:0008
|
|
%pi6 00010002000300040005000600070008
|
|
%pI6c 1:2:3:4:5:6:7:8
|
|
|
|
For printing IPv6 network-order 16-bit hex addresses. The 'I6' and 'i6'
|
|
specifiers result in a printed address with ('I6') or without ('i6')
|
|
colon-separators. Leading zeros are always used.
|
|
|
|
The additional 'c' specifier can be used with the 'I' specifier to
|
|
print a compressed IPv6 address as described by
|
|
http://tools.ietf.org/html/rfc5952
|
|
|
|
UUID/GUID addresses:
|
|
|
|
%pUb 00010203-0405-0607-0809-0a0b0c0d0e0f
|
|
%pUB 00010203-0405-0607-0809-0A0B0C0D0E0F
|
|
%pUl 03020100-0504-0706-0809-0a0b0c0e0e0f
|
|
%pUL 03020100-0504-0706-0809-0A0B0C0E0E0F
|
|
|
|
For printing 16-byte UUID/GUIDs addresses. The additional 'l', 'L',
|
|
'b' and 'B' specifiers are used to specify a little endian order in
|
|
lower ('l') or upper case ('L') hex characters - and big endian order
|
|
in lower ('b') or upper case ('B') hex characters.
|
|
|
|
Where no additional specifiers are used the default little endian
|
|
order with lower case hex characters will be printed.
|
|
|
|
struct va_format:
|
|
|
|
%pV
|
|
|
|
For printing struct va_format structures. These contain a format string
|
|
and va_list as follows:
|
|
|
|
struct va_format {
|
|
const char *fmt;
|
|
va_list *va;
|
|
};
|
|
|
|
Do not use this feature without some mechanism to verify the
|
|
correctness of the format string and va_list arguments.
|
|
|
|
u64 SHOULD be printed with %llu/%llx, (unsigned long long):
|
|
|
|
printk("%llu", (unsigned long long)u64_var);
|
|
|
|
s64 SHOULD be printed with %lld/%llx, (long long):
|
|
|
|
printk("%lld", (long long)s64_var);
|
|
|
|
If <type> is dependent on a config option for its size (e.g., sector_t,
|
|
blkcnt_t, phys_addr_t, resource_size_t) or is architecture-dependent
|
|
for its size (e.g., tcflag_t), use a format specifier of its largest
|
|
possible type and explicitly cast to it. Example:
|
|
|
|
printk("test: sector number/total blocks: %llu/%llu\n",
|
|
(unsigned long long)sector, (unsigned long long)blockcount);
|
|
|
|
Reminder: sizeof() result is of type size_t.
|
|
|
|
Thank you for your cooperation and attention.
|
|
|
|
|
|
By Randy Dunlap <rdunlap@xenotime.net> and
|
|
Andrew Murray <amurray@mpc-data.co.uk>
|