20 #include <linux/module.h>
21 #include <linux/types.h>
22 #include <linux/string.h>
23 #include <linux/ctype.h>
24 #include <linux/kernel.h>
31 #include <asm/div64.h>
32 #include <asm/sections.h>
101 static noinline_for_stack
102 int skip_atoi(
const char **
s)
107 i = i*10 + *((*s)++) -
'0';
119 #if BITS_PER_LONG != 32 || BITS_PER_LONG_LONG != 64
121 static noinline_for_stack
122 char *put_dec_full9(
char *
buf,
unsigned q)
145 r = (q * (
uint64_t)0x1999999a) >> 32;
146 *buf++ = (q - 10 *
r) +
'0';
147 q = (r * (
uint64_t)0x1999999a) >> 32;
148 *buf++ = (r - 10 *
q) +
'0';
149 r = (q * (
uint64_t)0x1999999a) >> 32;
150 *buf++ = (q - 10 *
r) +
'0';
151 q = (r * (
uint64_t)0x1999999a) >> 32;
152 *buf++ = (r - 10 *
q) +
'0';
153 r = (q * (
uint64_t)0x1999999a) >> 32;
154 *buf++ = (q - 10 *
r) +
'0';
156 q = (r * 0x199a) >> 16;
157 *buf++ = (r - 10 *
q) +
'0';
158 r = (q * 0xcd) >> 11;
159 *buf++ = (q - 10 *
r) +
'0';
160 q = (r * 0xcd) >> 11;
161 *buf++ = (r - 10 *
q) +
'0';
171 static noinline_for_stack
172 char *put_dec_trunc8(
char *
buf,
unsigned r)
179 r = (r * (
uint64_t)0x1999999a) >> 32;
183 q = (r * 0x199a) >> 16;
184 *buf++ = (r - 10 *
q) +
'0';
187 r = (q * 0xcd) >> 11;
188 *buf++ = (q - 10 *
r) +
'0';
191 q = (r * 0xcd) >> 11;
192 *buf++ = (r - 10 *
q) +
'0';
216 #if BITS_PER_LONG != 32 || BITS_PER_LONG_LONG != 64
221 char *put_dec(
char *buf,
unsigned long long n)
223 if (n >= 100*1000*1000) {
224 while (n >= 1000*1000*1000)
225 buf = put_dec_full9(buf,
do_div(n, 1000*1000*1000));
226 if (n >= 100*1000*1000)
227 return put_dec_full9(buf, n);
229 return put_dec_trunc8(buf, n);
237 static noinline_for_stack
238 void put_dec_full4(
char *buf,
unsigned q)
241 r = (q * 0xccd) >> 15;
242 buf[0] = (q - 10 *
r) +
'0';
243 q = (r * 0xcd) >> 11;
244 buf[1] = (r - 10 *
q) +
'0';
245 r = (q * 0xcd) >> 11;
246 buf[2] = (q - 10 *
r) +
'0';
258 unsigned put_dec_helper4(
char *buf,
unsigned x)
262 put_dec_full4(buf, x - q * 10000);
272 char *put_dec(
char *buf,
unsigned long long n)
276 if (n < 100*1000*1000)
277 return put_dec_trunc8(buf, n);
284 q = 656 * d3 + 7296 * d2 + 5536 * d1 + ((
uint32_t)n & 0xffff);
285 q = put_dec_helper4(buf, q);
287 q += 7671 * d3 + 9496 * d2 + 6 *
d1;
288 q = put_dec_helper4(buf+4, q);
290 q += 4749 * d3 + 42 *
d2;
291 q = put_dec_helper4(buf+8, q);
296 buf = put_dec_trunc8(buf, q);
297 else while (buf[-1] ==
'0')
313 char tmp[
sizeof(num) * 3];
321 len = put_dec(
tmp, num) -
tmp;
326 for (idx = 0; idx < len; ++
idx)
327 buf[idx] =
tmp[len - idx - 1];
371 static noinline_for_stack
372 char *
number(
char *buf,
char *
end,
unsigned long long num,
376 static const char digits[16] =
"0123456789ABCDEF";
383 bool is_zero = num == 0
LL;
392 if ((
signed long long)num < 0) {
394 num = -(
signed long long)num;
414 tmp[i++] = digits[num] | locase;
420 else if (spec.
base != 10) {
427 tmp[i++] = (digits[((
unsigned char)num) &
mask] | locase);
431 i = put_dec(tmp, num) -
tmp;
454 if (spec.
base == 16 || !is_zero) {
459 if (spec.
base == 16) {
461 *buf = (
'X' | locase);
496 static noinline_for_stack
513 for (i = 0; i < len; ++
i) {
527 static noinline_for_stack
528 char *symbol_string(
char *buf,
char *end,
void *
ptr,
531 unsigned long value = (
unsigned long) ptr;
532 #ifdef CONFIG_KALLSYMS
536 else if (ext !=
'f' && ext !=
's')
541 return string(buf, end, sym, spec);
547 return number(buf, end, value, spec);
551 static noinline_for_stack
552 char *resource_string(
char *buf,
char *end,
struct resource *
res,
555 #ifndef IO_RSRC_PRINTK_SIZE
556 #define IO_RSRC_PRINTK_SIZE 6
559 #ifndef MEM_RSRC_PRINTK_SIZE
560 #define MEM_RSRC_PRINTK_SIZE 10
598 #define RSRC_BUF_SIZE ((2 * sizeof(resource_size_t)) + 4)
599 #define FLAG_BUF_SIZE (2 * sizeof(res->flags))
600 #define DECODED_BUF_SIZE sizeof("[mem - 64bit pref window disabled]")
601 #define RAW_BUF_SIZE sizeof("[mem - flags 0x]")
602 char sym[
max(2*RSRC_BUF_SIZE + DECODED_BUF_SIZE,
603 2*RSRC_BUF_SIZE + FLAG_BUF_SIZE + RAW_BUF_SIZE)];
605 char *
p = sym, *
pend = sym +
sizeof(sym);
606 int decode = (fmt[0] ==
'R') ? 1 : 0;
611 p =
string(p, pend,
"io ", str_spec);
614 p =
string(p, pend,
"mem ", str_spec);
617 p =
string(p, pend,
"irq ", str_spec);
620 p =
string(p, pend,
"dma ", str_spec);
623 p =
string(p, pend,
"bus ", str_spec);
626 p =
string(p, pend,
"??? ", str_spec);
637 p =
string(p, pend,
" 64bit", str_spec);
639 p =
string(p, pend,
" pref", str_spec);
641 p =
string(p, pend,
" window", str_spec);
643 p =
string(p, pend,
" disabled", str_spec);
645 p =
string(p, pend,
" flags ", str_spec);
651 return string(buf, end, sym, spec);
654 static noinline_for_stack
688 for (i = 0; i < len && buf < end - 1; i++) {
689 buf = hex_byte_pack(buf, addr[i]);
691 if (buf < end && separator && i != len - 1)
698 static noinline_for_stack
699 char *mac_address_string(
char *buf,
char *end,
u8 *addr,
702 char mac_addr[
sizeof(
"xx:xx:xx:xx:xx:xx")];
706 bool reversed =
false;
722 for (i = 0; i < 6; i++) {
724 p = hex_byte_pack(p, addr[5 - i]);
726 p = hex_byte_pack(p, addr[i]);
728 if (fmt[0] ==
'M' && i != 5)
736 static noinline_for_stack
737 char *ip4_string(
char *p,
const u8 *addr,
const char *fmt)
740 bool leading_zeros = (fmt[0] ==
'i');
765 for (i = 0; i < 4; i++) {
767 int digits = put_dec_trunc8(temp, addr[index]) -
temp;
786 static noinline_for_stack
787 char *ip6_compressed_string(
char *p,
const char *addr)
790 unsigned char zerolength[8];
795 bool needcolon =
false;
801 useIPv4 = ipv6_addr_v4mapped(&in6) || ipv6_addr_is_isatap(&in6);
803 memset(zerolength, 0,
sizeof(zerolength));
811 for (i = 0; i <
range; i++) {
812 for (j = i; j <
range; j++) {
813 if (in6.s6_addr16[j] != 0)
818 for (i = 0; i <
range; i++) {
819 if (zerolength[i] > longest) {
820 longest = zerolength[
i];
828 for (i = 0; i <
range; i++) {
830 if (needcolon || i == 0)
842 word =
ntohs(in6.s6_addr16[i]);
847 p = hex_byte_pack(p, hi);
850 p = hex_byte_pack(p, lo);
853 p = hex_byte_pack(p, lo);
862 p = ip4_string(p, &in6.s6_addr[12],
"I4");
869 static noinline_for_stack
870 char *ip6_string(
char *p,
const char *addr,
const char *fmt)
874 for (i = 0; i < 8; i++) {
875 p = hex_byte_pack(p, *addr++);
876 p = hex_byte_pack(p, *addr++);
877 if (fmt[0] ==
'I' && i != 7)
885 static noinline_for_stack
886 char *ip6_addr_string(
char *buf,
char *end,
const u8 *addr,
889 char ip6_addr[
sizeof(
"xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255")];
891 if (fmt[0] ==
'I' && fmt[2] ==
'c')
892 ip6_compressed_string(ip6_addr, addr);
894 ip6_string(ip6_addr, addr, fmt);
896 return string(buf, end, ip6_addr, spec);
899 static noinline_for_stack
900 char *ip4_addr_string(
char *buf,
char *end,
const u8 *addr,
903 char ip4_addr[
sizeof(
"255.255.255.255")];
905 ip4_string(ip4_addr, addr, fmt);
907 return string(buf, end, ip4_addr, spec);
910 static noinline_for_stack
911 char *uuid_string(
char *buf,
char *end,
const u8 *addr,
914 char uuid[
sizeof(
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")];
917 static const u8 be[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
918 static const u8 le[16] = {3,2,1,0,5,4,7,6,8,9,10,11,12,13,14,15};
919 const u8 *index = be;
933 for (i = 0; i < 16; i++) {
934 p = hex_byte_pack(p, addr[index[i]]);
958 char *netdev_feature_string(
char *buf,
char *end,
const u8 *addr,
1030 static noinline_for_stack
1031 char *
pointer(
const char *fmt,
char *buf,
char *end,
void *ptr,
1034 int default_width = 2 *
sizeof(
void *) + (spec.
flags &
SPECIAL ? 2 : 0);
1036 if (!ptr && *fmt !=
'K') {
1043 return string(buf, end,
"(null)", spec);
1054 return symbol_string(buf, end, ptr, spec, *fmt);
1057 return resource_string(buf, end, ptr, spec, fmt);
1059 return hex_string(buf, end, ptr, spec, fmt);
1064 return mac_address_string(buf, end, ptr, spec, fmt);
1076 return ip6_addr_string(buf, end, ptr, spec, fmt);
1078 return ip4_addr_string(buf, end, ptr, spec, fmt);
1082 return uuid_string(buf, end, ptr, spec, fmt);
1087 va_copy(va, *((
struct va_format *)ptr)->va);
1088 buf +=
vsnprintf(buf, end > buf ? end - buf : 0,
1102 return string(buf, end,
"pK-error", spec);
1104 if (!((kptr_restrict == 0) ||
1105 (kptr_restrict == 1 &&
1112 return netdev_feature_string(buf, end, ptr, spec);
1123 return number(buf, end, (
unsigned long) ptr, spec);
1146 static noinline_for_stack
1147 int format_decode(
const char *fmt,
struct printf_spec *spec)
1179 if (fmt != start || !*fmt)
1196 default: found =
false;
1208 else if (*fmt ==
'*') {
1211 return ++fmt -
start;
1223 }
else if (*fmt ==
'*') {
1226 return ++fmt -
start;
1233 if (*fmt ==
'h' || _tolower(*fmt) ==
'l' ||
1234 _tolower(*fmt) ==
'z' || *fmt ==
't') {
1252 return ++fmt -
start;
1256 return ++fmt -
start;
1265 return ++fmt -
start;
1269 return ++fmt -
start;
1301 }
else if (_tolower(spec->
qualifier) ==
'z') {
1322 return ++fmt -
start;
1370 unsigned long long num;
1389 const char *old_fmt =
fmt;
1390 int read = format_decode(fmt, &spec);
1394 switch (spec.
type) {
1398 if (copy > end - str)
1400 memcpy(str, old_fmt, copy);
1463 if (qualifier ==
'l') {
1466 }
else if (_tolower(qualifier) ==
'z') {
1467 size_t *
ip =
va_arg(args,
size_t *);
1477 switch (spec.
type) {
1479 num =
va_arg(args,
long long);
1482 num =
va_arg(args,
unsigned long);
1485 num =
va_arg(args,
long);
1488 num =
va_arg(args,
size_t);
1509 num =
va_arg(args,
unsigned int);
1512 str =
number(str, end, num, spec);
1654 #ifdef CONFIG_BINARY_PRINTF
1678 int vbin_printf(
u32 *bin_buf,
size_t size,
const char *fmt,
va_list args)
1683 str = (
char *)bin_buf;
1684 end = (
char *)(bin_buf + size);
1686 #define save_arg(type) \
1688 if (sizeof(type) == 8) { \
1689 unsigned long long value; \
1690 str = PTR_ALIGN(str, sizeof(u32)); \
1691 value = va_arg(args, unsigned long long); \
1692 if (str + sizeof(type) <= end) { \
1693 *(u32 *)str = *(u32 *)&value; \
1694 *(u32 *)(str + 4) = *((u32 *)&value + 1); \
1697 unsigned long value; \
1698 str = PTR_ALIGN(str, sizeof(type)); \
1699 value = va_arg(args, int); \
1700 if (str + sizeof(type) <= end) \
1701 *(typeof(type) *)str = (type)value; \
1703 str += sizeof(type); \
1707 int read = format_decode(fmt, &spec);
1711 switch (spec.
type) {
1727 const char *save_str =
va_arg(args,
char *);
1730 if ((
unsigned long)save_str > (
unsigned long)-
PAGE_SIZE
1732 save_str =
"(null)";
1733 len =
strlen(save_str) + 1;
1734 if (str + len < end)
1735 memcpy(str, save_str, len);
1751 if (qualifier ==
'l')
1752 skip_arg =
va_arg(args,
long *);
1753 else if (_tolower(qualifier) ==
'z')
1754 skip_arg =
va_arg(args,
size_t *);
1756 skip_arg =
va_arg(args,
int *);
1761 switch (spec.
type) {
1764 save_arg(
long long);
1768 save_arg(
unsigned long);
1817 int bstr_printf(
char *buf,
size_t size,
const char *fmt,
const u32 *bin_buf)
1821 const char *args = (
const char *)bin_buf;
1829 #define get_arg(type) \
1831 typeof(type) value; \
1832 if (sizeof(type) == 8) { \
1833 args = PTR_ALIGN(args, sizeof(u32)); \
1834 *(u32 *)&value = *(u32 *)args; \
1835 *((u32 *)&value + 1) = *(u32 *)(args + 4); \
1837 args = PTR_ALIGN(args, sizeof(type)); \
1838 value = *(typeof(type) *)args; \
1840 args += sizeof(type); \
1851 const char *old_fmt =
fmt;
1852 int read = format_decode(fmt, &spec);
1856 switch (spec.
type) {
1860 if (copy > end - str)
1862 memcpy(str, old_fmt, copy);
1886 c = (
unsigned char) get_arg(
char);
1899 const char *str_arg = args;
1900 args +=
strlen(str_arg) + 1;
1901 str =
string(str, end, (
char *)str_arg, spec);
1906 str =
pointer(fmt+1, str, end, get_arg(
void *), spec);
1923 unsigned long long num;
1925 switch (spec.
type) {
1928 num = get_arg(
long long);
1932 num = get_arg(
unsigned long);
1935 num = get_arg(
size_t);
1941 num = get_arg(
unsigned char);
1944 num = get_arg(
signed char);
1947 num = get_arg(
unsigned short);
1950 num = get_arg(
short);
1953 num = get_arg(
unsigned int);
1959 str =
number(str, end, num, spec);
1988 int bprintf(
u32 *bin_buf,
size_t size,
const char *fmt, ...)
1994 ret = vbin_printf(bin_buf, size, fmt, args);
2011 const char *str =
buf;
2031 if (*fmt !=
'%' && *fmt) {
2032 if (*fmt++ != *str++)
2047 while (!
isspace(*fmt) && *fmt !=
'%' && *fmt)
2049 while (!
isspace(*str) && *str)
2057 field_width = skip_atoi(&fmt);
2061 if (*fmt ==
'h' || _tolower(*fmt) ==
'l' ||
2062 _tolower(*fmt) ==
'z') {
2065 if (qualifier ==
'h') {
2068 }
else if (qualifier ==
'l') {
2094 char *s = (
char *)
va_arg(args,
char*);
2095 if (field_width == -1)
2099 }
while (--field_width > 0 && *str);
2105 char *s = (
char *)
va_arg(args,
char *);
2106 if (field_width == -1)
2112 while (*str && !
isspace(*str) && field_width--)
2147 if (is_sign && digit ==
'-')
2151 || (base == 16 && !
isxdigit(digit))
2152 || (base == 10 && !
isdigit(digit))
2153 || (base == 8 && (!
isdigit(digit) || digit >
'7'))
2154 || (base == 0 && !
isdigit(digit)))
2157 switch (qualifier) {
2160 signed char *s = (
signed char *)
va_arg(args,
signed char *);
2163 unsigned char *s = (
unsigned char *)
va_arg(args,
unsigned char *);
2169 short *s = (
short *)
va_arg(args,
short *);
2172 unsigned short *s = (
unsigned short *)
va_arg(args,
unsigned short *);
2178 long *
l = (
long *)
va_arg(args,
long *);
2181 unsigned long *
l = (
unsigned long *)
va_arg(args,
unsigned long *);
2187 long long *
l = (
long long *)
va_arg(args,
long long *);
2190 unsigned long long *
l = (
unsigned long long *)
va_arg(args,
unsigned long long *);
2197 size_t *s = (
size_t *)
va_arg(args,
size_t *);
2203 int *i = (
int *)
va_arg(args,
int *);
2206 unsigned int *i = (
unsigned int *)
va_arg(args,
unsigned int*);
2228 int sscanf(
const char *buf,
const char *fmt, ...)