1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include <stdarg.h>
20#include <linux/clk.h>
21#include <linux/clk-provider.h>
22#include <linux/module.h>
23#include <linux/types.h>
24#include <linux/string.h>
25#include <linux/ctype.h>
26#include <linux/kernel.h>
27#include <linux/kallsyms.h>
28#include <linux/math64.h>
29#include <linux/uaccess.h>
30#include <linux/ioport.h>
31#include <linux/dcache.h>
32#include <linux/cred.h>
33#include <net/addrconf.h>
34#ifdef CONFIG_BLOCK
35#include <linux/blkdev.h>
36#endif
37
38#include <asm/page.h>
39#include <asm/sections.h>
40#include <asm/byteorder.h>
41
42#include <linux/string_helpers.h>
43#include "kstrtox.h"
44
45
46
47
48
49
50
51
52
53unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base)
54{
55 unsigned long long result;
56 unsigned int rv;
57
58 cp = _parse_integer_fixup_radix(cp, &base);
59 rv = _parse_integer(cp, base, &result);
60
61 cp += (rv & ~KSTRTOX_OVERFLOW);
62
63 if (endp)
64 *endp = (char *)cp;
65
66 return result;
67}
68EXPORT_SYMBOL(simple_strtoull);
69
70
71
72
73
74
75
76
77
78unsigned long simple_strtoul(const char *cp, char **endp, unsigned int base)
79{
80 return simple_strtoull(cp, endp, base);
81}
82EXPORT_SYMBOL(simple_strtoul);
83
84
85
86
87
88
89
90
91
92long simple_strtol(const char *cp, char **endp, unsigned int base)
93{
94 if (*cp == '-')
95 return -simple_strtoul(cp + 1, endp, base);
96
97 return simple_strtoul(cp, endp, base);
98}
99EXPORT_SYMBOL(simple_strtol);
100
101
102
103
104
105
106
107
108
109long long simple_strtoll(const char *cp, char **endp, unsigned int base)
110{
111 if (*cp == '-')
112 return -simple_strtoull(cp + 1, endp, base);
113
114 return simple_strtoull(cp, endp, base);
115}
116EXPORT_SYMBOL(simple_strtoll);
117
118static noinline_for_stack
119int skip_atoi(const char **s)
120{
121 int i = 0;
122
123 do {
124 i = i*10 + *((*s)++) - '0';
125 } while (isdigit(**s));
126
127 return i;
128}
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155static const u16 decpair[100] = {
156#define _(x) (__force u16) cpu_to_le16(((x % 10) | ((x / 10) << 8)) + 0x3030)
157 _( 0), _( 1), _( 2), _( 3), _( 4), _( 5), _( 6), _( 7), _( 8), _( 9),
158 _(10), _(11), _(12), _(13), _(14), _(15), _(16), _(17), _(18), _(19),
159 _(20), _(21), _(22), _(23), _(24), _(25), _(26), _(27), _(28), _(29),
160 _(30), _(31), _(32), _(33), _(34), _(35), _(36), _(37), _(38), _(39),
161 _(40), _(41), _(42), _(43), _(44), _(45), _(46), _(47), _(48), _(49),
162 _(50), _(51), _(52), _(53), _(54), _(55), _(56), _(57), _(58), _(59),
163 _(60), _(61), _(62), _(63), _(64), _(65), _(66), _(67), _(68), _(69),
164 _(70), _(71), _(72), _(73), _(74), _(75), _(76), _(77), _(78), _(79),
165 _(80), _(81), _(82), _(83), _(84), _(85), _(86), _(87), _(88), _(89),
166 _(90), _(91), _(92), _(93), _(94), _(95), _(96), _(97), _(98), _(99),
167#undef _
168};
169
170
171
172
173
174
175
176static noinline_for_stack
177char *put_dec_trunc8(char *buf, unsigned r)
178{
179 unsigned q;
180
181
182 if (r < 100)
183 goto out_r;
184
185
186 q = (r * (u64)0x28f5c29) >> 32;
187 *((u16 *)buf) = decpair[r - 100*q];
188 buf += 2;
189
190
191 if (q < 100)
192 goto out_q;
193
194
195 r = (q * (u64)0x28f5c29) >> 32;
196 *((u16 *)buf) = decpair[q - 100*r];
197 buf += 2;
198
199
200 if (r < 100)
201 goto out_r;
202
203
204 q = (r * 0x147b) >> 19;
205 *((u16 *)buf) = decpair[r - 100*q];
206 buf += 2;
207out_q:
208
209 r = q;
210out_r:
211
212 *((u16 *)buf) = decpair[r];
213 buf += r < 10 ? 1 : 2;
214 return buf;
215}
216
217#if BITS_PER_LONG == 64 && BITS_PER_LONG_LONG == 64
218static noinline_for_stack
219char *put_dec_full8(char *buf, unsigned r)
220{
221 unsigned q;
222
223
224 q = (r * (u64)0x28f5c29) >> 32;
225 *((u16 *)buf) = decpair[r - 100*q];
226 buf += 2;
227
228
229 r = (q * (u64)0x28f5c29) >> 32;
230 *((u16 *)buf) = decpair[q - 100*r];
231 buf += 2;
232
233
234 q = (r * 0x147b) >> 19;
235 *((u16 *)buf) = decpair[r - 100*q];
236 buf += 2;
237
238
239 *((u16 *)buf) = decpair[q];
240 buf += 2;
241 return buf;
242}
243
244static noinline_for_stack
245char *put_dec(char *buf, unsigned long long n)
246{
247 if (n >= 100*1000*1000)
248 buf = put_dec_full8(buf, do_div(n, 100*1000*1000));
249
250 if (n >= 100*1000*1000)
251 buf = put_dec_full8(buf, do_div(n, 100*1000*1000));
252
253 return put_dec_trunc8(buf, n);
254}
255
256#elif BITS_PER_LONG == 32 && BITS_PER_LONG_LONG == 64
257
258static void
259put_dec_full4(char *buf, unsigned r)
260{
261 unsigned q;
262
263
264 q = (r * 0x147b) >> 19;
265 *((u16 *)buf) = decpair[r - 100*q];
266 buf += 2;
267
268 *((u16 *)buf) = decpair[q];
269}
270
271
272
273
274
275
276
277
278static noinline_for_stack
279unsigned put_dec_helper4(char *buf, unsigned x)
280{
281 uint32_t q = (x * (uint64_t)0x346DC5D7) >> 43;
282
283 put_dec_full4(buf, x - q * 10000);
284 return q;
285}
286
287
288
289
290
291
292static
293char *put_dec(char *buf, unsigned long long n)
294{
295 uint32_t d3, d2, d1, q, h;
296
297 if (n < 100*1000*1000)
298 return put_dec_trunc8(buf, n);
299
300 d1 = ((uint32_t)n >> 16);
301 h = (n >> 32);
302 d2 = (h ) & 0xffff;
303 d3 = (h >> 16);
304
305
306
307 q = 656 * d3 + 7296 * d2 + 5536 * d1 + ((uint32_t)n & 0xffff);
308 q = put_dec_helper4(buf, q);
309
310 q += 7671 * d3 + 9496 * d2 + 6 * d1;
311 q = put_dec_helper4(buf+4, q);
312
313 q += 4749 * d3 + 42 * d2;
314 q = put_dec_helper4(buf+8, q);
315
316 q += 281 * d3;
317 buf += 12;
318 if (q)
319 buf = put_dec_trunc8(buf, q);
320 else while (buf[-1] == '0')
321 --buf;
322
323 return buf;
324}
325
326#endif
327
328
329
330
331
332
333
334int num_to_str(char *buf, int size, unsigned long long num)
335{
336
337 char tmp[sizeof(num) * 3] __aligned(2);
338 int idx, len;
339
340
341 if (num <= 9) {
342 tmp[0] = '0' + num;
343 len = 1;
344 } else {
345 len = put_dec(tmp, num) - tmp;
346 }
347
348 if (len > size)
349 return 0;
350 for (idx = 0; idx < len; ++idx)
351 buf[idx] = tmp[len - idx - 1];
352 return len;
353}
354
355#define SIGN 1
356#define LEFT 2
357#define PLUS 4
358#define SPACE 8
359#define ZEROPAD 16
360#define SMALL 32
361#define SPECIAL 64
362
363enum format_type {
364 FORMAT_TYPE_NONE,
365 FORMAT_TYPE_WIDTH,
366 FORMAT_TYPE_PRECISION,
367 FORMAT_TYPE_CHAR,
368 FORMAT_TYPE_STR,
369 FORMAT_TYPE_PTR,
370 FORMAT_TYPE_PERCENT_CHAR,
371 FORMAT_TYPE_INVALID,
372 FORMAT_TYPE_LONG_LONG,
373 FORMAT_TYPE_ULONG,
374 FORMAT_TYPE_LONG,
375 FORMAT_TYPE_UBYTE,
376 FORMAT_TYPE_BYTE,
377 FORMAT_TYPE_USHORT,
378 FORMAT_TYPE_SHORT,
379 FORMAT_TYPE_UINT,
380 FORMAT_TYPE_INT,
381 FORMAT_TYPE_SIZE_T,
382 FORMAT_TYPE_PTRDIFF
383};
384
385struct printf_spec {
386 unsigned int type:8;
387 signed int field_width:24;
388 unsigned int flags:8;
389 unsigned int base:8;
390 signed int precision:16;
391} __packed;
392#define FIELD_WIDTH_MAX ((1 << 23) - 1)
393#define PRECISION_MAX ((1 << 15) - 1)
394
395static noinline_for_stack
396char *number(char *buf, char *end, unsigned long long num,
397 struct printf_spec spec)
398{
399
400 char tmp[3 * sizeof(num)] __aligned(2);
401 char sign;
402 char locase;
403 int need_pfx = ((spec.flags & SPECIAL) && spec.base != 10);
404 int i;
405 bool is_zero = num == 0LL;
406 int field_width = spec.field_width;
407 int precision = spec.precision;
408
409 BUILD_BUG_ON(sizeof(struct printf_spec) != 8);
410
411
412
413 locase = (spec.flags & SMALL);
414 if (spec.flags & LEFT)
415 spec.flags &= ~ZEROPAD;
416 sign = 0;
417 if (spec.flags & SIGN) {
418 if ((signed long long)num < 0) {
419 sign = '-';
420 num = -(signed long long)num;
421 field_width--;
422 } else if (spec.flags & PLUS) {
423 sign = '+';
424 field_width--;
425 } else if (spec.flags & SPACE) {
426 sign = ' ';
427 field_width--;
428 }
429 }
430 if (need_pfx) {
431 if (spec.base == 16)
432 field_width -= 2;
433 else if (!is_zero)
434 field_width--;
435 }
436
437
438 i = 0;
439 if (num < spec.base)
440 tmp[i++] = hex_asc_upper[num] | locase;
441 else if (spec.base != 10) {
442 int mask = spec.base - 1;
443 int shift = 3;
444
445 if (spec.base == 16)
446 shift = 4;
447 do {
448 tmp[i++] = (hex_asc_upper[((unsigned char)num) & mask] | locase);
449 num >>= shift;
450 } while (num);
451 } else {
452 i = put_dec(tmp, num) - tmp;
453 }
454
455
456 if (i > precision)
457 precision = i;
458
459 field_width -= precision;
460 if (!(spec.flags & (ZEROPAD | LEFT))) {
461 while (--field_width >= 0) {
462 if (buf < end)
463 *buf = ' ';
464 ++buf;
465 }
466 }
467
468 if (sign) {
469 if (buf < end)
470 *buf = sign;
471 ++buf;
472 }
473
474 if (need_pfx) {
475 if (spec.base == 16 || !is_zero) {
476 if (buf < end)
477 *buf = '0';
478 ++buf;
479 }
480 if (spec.base == 16) {
481 if (buf < end)
482 *buf = ('X' | locase);
483 ++buf;
484 }
485 }
486
487 if (!(spec.flags & LEFT)) {
488 char c = ' ' + (spec.flags & ZEROPAD);
489 BUILD_BUG_ON(' ' + ZEROPAD != '0');
490 while (--field_width >= 0) {
491 if (buf < end)
492 *buf = c;
493 ++buf;
494 }
495 }
496
497 while (i <= --precision) {
498 if (buf < end)
499 *buf = '0';
500 ++buf;
501 }
502
503 while (--i >= 0) {
504 if (buf < end)
505 *buf = tmp[i];
506 ++buf;
507 }
508
509 while (--field_width >= 0) {
510 if (buf < end)
511 *buf = ' ';
512 ++buf;
513 }
514
515 return buf;
516}
517
518static noinline_for_stack
519char *special_hex_number(char *buf, char *end, unsigned long long num, int size)
520{
521 struct printf_spec spec;
522
523 spec.type = FORMAT_TYPE_PTR;
524 spec.field_width = 2 + 2 * size;
525 spec.flags = SPECIAL | SMALL | ZEROPAD;
526 spec.base = 16;
527 spec.precision = -1;
528
529 return number(buf, end, num, spec);
530}
531
532static void move_right(char *buf, char *end, unsigned len, unsigned spaces)
533{
534 size_t size;
535 if (buf >= end)
536 return;
537 size = end - buf;
538 if (size <= spaces) {
539 memset(buf, ' ', size);
540 return;
541 }
542 if (len) {
543 if (len > size - spaces)
544 len = size - spaces;
545 memmove(buf + spaces, buf, len);
546 }
547 memset(buf, ' ', spaces);
548}
549
550
551
552
553
554
555
556
557
558static noinline_for_stack
559char *widen_string(char *buf, int n, char *end, struct printf_spec spec)
560{
561 unsigned spaces;
562
563 if (likely(n >= spec.field_width))
564 return buf;
565
566 spaces = spec.field_width - n;
567 if (!(spec.flags & LEFT)) {
568 move_right(buf - n, end, n, spaces);
569 return buf + spaces;
570 }
571 while (spaces--) {
572 if (buf < end)
573 *buf = ' ';
574 ++buf;
575 }
576 return buf;
577}
578
579static noinline_for_stack
580char *string(char *buf, char *end, const char *s, struct printf_spec spec)
581{
582 int len = 0;
583 size_t lim = spec.precision;
584
585 if ((unsigned long)s < PAGE_SIZE)
586 s = "(null)";
587
588 while (lim--) {
589 char c = *s++;
590 if (!c)
591 break;
592 if (buf < end)
593 *buf = c;
594 ++buf;
595 ++len;
596 }
597 return widen_string(buf, len, end, spec);
598}
599
600static noinline_for_stack
601char *dentry_name(char *buf, char *end, const struct dentry *d, struct printf_spec spec,
602 const char *fmt)
603{
604 const char *array[4], *s;
605 const struct dentry *p;
606 int depth;
607 int i, n;
608
609 switch (fmt[1]) {
610 case '2': case '3': case '4':
611 depth = fmt[1] - '0';
612 break;
613 default:
614 depth = 1;
615 }
616
617 rcu_read_lock();
618 for (i = 0; i < depth; i++, d = p) {
619 p = ACCESS_ONCE(d->d_parent);
620 array[i] = ACCESS_ONCE(d->d_name.name);
621 if (p == d) {
622 if (i)
623 array[i] = "";
624 i++;
625 break;
626 }
627 }
628 s = array[--i];
629 for (n = 0; n != spec.precision; n++, buf++) {
630 char c = *s++;
631 if (!c) {
632 if (!i)
633 break;
634 c = '/';
635 s = array[--i];
636 }
637 if (buf < end)
638 *buf = c;
639 }
640 rcu_read_unlock();
641 return widen_string(buf, n, end, spec);
642}
643
644#ifdef CONFIG_BLOCK
645static noinline_for_stack
646char *bdev_name(char *buf, char *end, struct block_device *bdev,
647 struct printf_spec spec, const char *fmt)
648{
649 struct gendisk *hd = bdev->bd_disk;
650
651 buf = string(buf, end, hd->disk_name, spec);
652 if (bdev->bd_part->partno) {
653 if (isdigit(hd->disk_name[strlen(hd->disk_name)-1])) {
654 if (buf < end)
655 *buf = 'p';
656 buf++;
657 }
658 buf = number(buf, end, bdev->bd_part->partno, spec);
659 }
660 return buf;
661}
662#endif
663
664static noinline_for_stack
665char *symbol_string(char *buf, char *end, void *ptr,
666 struct printf_spec spec, const char *fmt)
667{
668 unsigned long value;
669#ifdef CONFIG_KALLSYMS
670 char sym[KSYM_SYMBOL_LEN];
671#endif
672
673 if (fmt[1] == 'R')
674 ptr = __builtin_extract_return_addr(ptr);
675 value = (unsigned long)ptr;
676
677#ifdef CONFIG_KALLSYMS
678 if (*fmt == 'B')
679 sprint_backtrace(sym, value);
680 else if (*fmt != 'f' && *fmt != 's')
681 sprint_symbol(sym, value);
682 else
683 sprint_symbol_no_offset(sym, value);
684
685 return string(buf, end, sym, spec);
686#else
687 return special_hex_number(buf, end, value, sizeof(void *));
688#endif
689}
690
691static noinline_for_stack
692char *resource_string(char *buf, char *end, struct resource *res,
693 struct printf_spec spec, const char *fmt)
694{
695#ifndef IO_RSRC_PRINTK_SIZE
696#define IO_RSRC_PRINTK_SIZE 6
697#endif
698
699#ifndef MEM_RSRC_PRINTK_SIZE
700#define MEM_RSRC_PRINTK_SIZE 10
701#endif
702 static const struct printf_spec io_spec = {
703 .base = 16,
704 .field_width = IO_RSRC_PRINTK_SIZE,
705 .precision = -1,
706 .flags = SPECIAL | SMALL | ZEROPAD,
707 };
708 static const struct printf_spec mem_spec = {
709 .base = 16,
710 .field_width = MEM_RSRC_PRINTK_SIZE,
711 .precision = -1,
712 .flags = SPECIAL | SMALL | ZEROPAD,
713 };
714 static const struct printf_spec bus_spec = {
715 .base = 16,
716 .field_width = 2,
717 .precision = -1,
718 .flags = SMALL | ZEROPAD,
719 };
720 static const struct printf_spec dec_spec = {
721 .base = 10,
722 .precision = -1,
723 .flags = 0,
724 };
725 static const struct printf_spec str_spec = {
726 .field_width = -1,
727 .precision = 10,
728 .flags = LEFT,
729 };
730 static const struct printf_spec flag_spec = {
731 .base = 16,
732 .precision = -1,
733 .flags = SPECIAL | SMALL,
734 };
735
736
737
738#define RSRC_BUF_SIZE ((2 * sizeof(resource_size_t)) + 4)
739#define FLAG_BUF_SIZE (2 * sizeof(res->flags))
740#define DECODED_BUF_SIZE sizeof("[mem - 64bit pref window disabled]")
741#define RAW_BUF_SIZE sizeof("[mem - flags 0x]")
742 char sym[max(2*RSRC_BUF_SIZE + DECODED_BUF_SIZE,
743 2*RSRC_BUF_SIZE + FLAG_BUF_SIZE + RAW_BUF_SIZE)];
744
745 char *p = sym, *pend = sym + sizeof(sym);
746 int decode = (fmt[0] == 'R') ? 1 : 0;
747 const struct printf_spec *specp;
748
749 *p++ = '[';
750 if (res->flags & IORESOURCE_IO) {
751 p = string(p, pend, "io ", str_spec);
752 specp = &io_spec;
753 } else if (res->flags & IORESOURCE_MEM) {
754 p = string(p, pend, "mem ", str_spec);
755 specp = &mem_spec;
756 } else if (res->flags & IORESOURCE_IRQ) {
757 p = string(p, pend, "irq ", str_spec);
758 specp = &dec_spec;
759 } else if (res->flags & IORESOURCE_DMA) {
760 p = string(p, pend, "dma ", str_spec);
761 specp = &dec_spec;
762 } else if (res->flags & IORESOURCE_BUS) {
763 p = string(p, pend, "bus ", str_spec);
764 specp = &bus_spec;
765 } else {
766 p = string(p, pend, "??? ", str_spec);
767 specp = &mem_spec;
768 decode = 0;
769 }
770 if (decode && res->flags & IORESOURCE_UNSET) {
771 p = string(p, pend, "size ", str_spec);
772 p = number(p, pend, resource_size(res), *specp);
773 } else {
774 p = number(p, pend, res->start, *specp);
775 if (res->start != res->end) {
776 *p++ = '-';
777 p = number(p, pend, res->end, *specp);
778 }
779 }
780 if (decode) {
781 if (res->flags & IORESOURCE_MEM_64)
782 p = string(p, pend, " 64bit", str_spec);
783 if (res->flags & IORESOURCE_PREFETCH)
784 p = string(p, pend, " pref", str_spec);
785 if (res->flags & IORESOURCE_WINDOW)
786 p = string(p, pend, " window", str_spec);
787 if (res->flags & IORESOURCE_DISABLED)
788 p = string(p, pend, " disabled", str_spec);
789 } else {
790 p = string(p, pend, " flags ", str_spec);
791 p = number(p, pend, res->flags, flag_spec);
792 }
793 *p++ = ']';
794 *p = '\0';
795
796 return string(buf, end, sym, spec);
797}
798
799static noinline_for_stack
800char *hex_string(char *buf, char *end, u8 *addr, struct printf_spec spec,
801 const char *fmt)
802{
803 int i, len = 1;
804
805 char separator;
806
807 if (spec.field_width == 0)
808
809 return buf;
810
811 if (ZERO_OR_NULL_PTR(addr))
812
813 return string(buf, end, NULL, spec);
814
815 switch (fmt[1]) {
816 case 'C':
817 separator = ':';
818 break;
819 case 'D':
820 separator = '-';
821 break;
822 case 'N':
823 separator = 0;
824 break;
825 default:
826 separator = ' ';
827 break;
828 }
829
830 if (spec.field_width > 0)
831 len = min_t(int, spec.field_width, 64);
832
833 for (i = 0; i < len; ++i) {
834 if (buf < end)
835 *buf = hex_asc_hi(addr[i]);
836 ++buf;
837 if (buf < end)
838 *buf = hex_asc_lo(addr[i]);
839 ++buf;
840
841 if (separator && i != len - 1) {
842 if (buf < end)
843 *buf = separator;
844 ++buf;
845 }
846 }
847
848 return buf;
849}
850
851static noinline_for_stack
852char *bitmap_string(char *buf, char *end, unsigned long *bitmap,
853 struct printf_spec spec, const char *fmt)
854{
855 const int CHUNKSZ = 32;
856 int nr_bits = max_t(int, spec.field_width, 0);
857 int i, chunksz;
858 bool first = true;
859
860
861 spec = (struct printf_spec){ .flags = SMALL | ZEROPAD, .base = 16 };
862
863 chunksz = nr_bits & (CHUNKSZ - 1);
864 if (chunksz == 0)
865 chunksz = CHUNKSZ;
866
867 i = ALIGN(nr_bits, CHUNKSZ) - CHUNKSZ;
868 for (; i >= 0; i -= CHUNKSZ) {
869 u32 chunkmask, val;
870 int word, bit;
871
872 chunkmask = ((1ULL << chunksz) - 1);
873 word = i / BITS_PER_LONG;
874 bit = i % BITS_PER_LONG;
875 val = (bitmap[word] >> bit) & chunkmask;
876
877 if (!first) {
878 if (buf < end)
879 *buf = ',';
880 buf++;
881 }
882 first = false;
883
884 spec.field_width = DIV_ROUND_UP(chunksz, 4);
885 buf = number(buf, end, val, spec);
886
887 chunksz = CHUNKSZ;
888 }
889 return buf;
890}
891
892static noinline_for_stack
893char *bitmap_list_string(char *buf, char *end, unsigned long *bitmap,
894 struct printf_spec spec, const char *fmt)
895{
896 int nr_bits = max_t(int, spec.field_width, 0);
897
898 int cur, rbot, rtop;
899 bool first = true;
900
901
902 spec = (struct printf_spec){ .base = 10 };
903
904 rbot = cur = find_first_bit(bitmap, nr_bits);
905 while (cur < nr_bits) {
906 rtop = cur;
907 cur = find_next_bit(bitmap, nr_bits, cur + 1);
908 if (cur < nr_bits && cur <= rtop + 1)
909 continue;
910
911 if (!first) {
912 if (buf < end)
913 *buf = ',';
914 buf++;
915 }
916 first = false;
917
918 buf = number(buf, end, rbot, spec);
919 if (rbot < rtop) {
920 if (buf < end)
921 *buf = '-';
922 buf++;
923
924 buf = number(buf, end, rtop, spec);
925 }
926
927 rbot = cur;
928 }
929 return buf;
930}
931
932static noinline_for_stack
933char *mac_address_string(char *buf, char *end, u8 *addr,
934 struct printf_spec spec, const char *fmt)
935{
936 char mac_addr[sizeof("xx:xx:xx:xx:xx:xx")];
937 char *p = mac_addr;
938 int i;
939 char separator;
940 bool reversed = false;
941
942 switch (fmt[1]) {
943 case 'F':
944 separator = '-';
945 break;
946
947 case 'R':
948 reversed = true;
949
950
951 default:
952 separator = ':';
953 break;
954 }
955
956 for (i = 0; i < 6; i++) {
957 if (reversed)
958 p = hex_byte_pack(p, addr[5 - i]);
959 else
960 p = hex_byte_pack(p, addr[i]);
961
962 if (fmt[0] == 'M' && i != 5)
963 *p++ = separator;
964 }
965 *p = '\0';
966
967 return string(buf, end, mac_addr, spec);
968}
969
970static noinline_for_stack
971char *ip4_string(char *p, const u8 *addr, const char *fmt)
972{
973 int i;
974 bool leading_zeros = (fmt[0] == 'i');
975 int index;
976 int step;
977
978 switch (fmt[2]) {
979 case 'h':
980#ifdef __BIG_ENDIAN
981 index = 0;
982 step = 1;
983#else
984 index = 3;
985 step = -1;
986#endif
987 break;
988 case 'l':
989 index = 3;
990 step = -1;
991 break;
992 case 'n':
993 case 'b':
994 default:
995 index = 0;
996 step = 1;
997 break;
998 }
999 for (i = 0; i < 4; i++) {
1000 char temp[4] __aligned(2);
1001 int digits = put_dec_trunc8(temp, addr[index]) - temp;
1002 if (leading_zeros) {
1003 if (digits < 3)
1004 *p++ = '0';
1005 if (digits < 2)
1006 *p++ = '0';
1007 }
1008
1009 while (digits--)
1010 *p++ = temp[digits];
1011 if (i < 3)
1012 *p++ = '.';
1013 index += step;
1014 }
1015 *p = '\0';
1016
1017 return p;
1018}
1019
1020static noinline_for_stack
1021char *ip6_compressed_string(char *p, const char *addr)
1022{
1023 int i, j, range;
1024 unsigned char zerolength[8];
1025 int longest = 1;
1026 int colonpos = -1;
1027 u16 word;
1028 u8 hi, lo;
1029 bool needcolon = false;
1030 bool useIPv4;
1031 struct in6_addr in6;
1032
1033 memcpy(&in6, addr, sizeof(struct in6_addr));
1034
1035 useIPv4 = ipv6_addr_v4mapped(&in6) || ipv6_addr_is_isatap(&in6);
1036
1037 memset(zerolength, 0, sizeof(zerolength));
1038
1039 if (useIPv4)
1040 range = 6;
1041 else
1042 range = 8;
1043
1044
1045 for (i = 0; i < range; i++) {
1046 for (j = i; j < range; j++) {
1047 if (in6.s6_addr16[j] != 0)
1048 break;
1049 zerolength[i]++;
1050 }
1051 }
1052 for (i = 0; i < range; i++) {
1053 if (zerolength[i] > longest) {
1054 longest = zerolength[i];
1055 colonpos = i;
1056 }
1057 }
1058 if (longest == 1)
1059 colonpos = -1;
1060
1061
1062 for (i = 0; i < range; i++) {
1063 if (i == colonpos) {
1064 if (needcolon || i == 0)
1065 *p++ = ':';
1066 *p++ = ':';
1067 needcolon = false;
1068 i += longest - 1;
1069 continue;
1070 }
1071 if (needcolon) {
1072 *p++ = ':';
1073 needcolon = false;
1074 }
1075
1076 word = ntohs(in6.s6_addr16[i]);
1077 hi = word >> 8;
1078 lo = word & 0xff;
1079 if (hi) {
1080 if (hi > 0x0f)
1081 p = hex_byte_pack(p, hi);
1082 else
1083 *p++ = hex_asc_lo(hi);
1084 p = hex_byte_pack(p, lo);
1085 }
1086 else if (lo > 0x0f)
1087 p = hex_byte_pack(p, lo);
1088 else
1089 *p++ = hex_asc_lo(lo);
1090 needcolon = true;
1091 }
1092
1093 if (useIPv4) {
1094 if (needcolon)
1095 *p++ = ':';
1096 p = ip4_string(p, &in6.s6_addr[12], "I4");
1097 }
1098 *p = '\0';
1099
1100 return p;
1101}
1102
1103static noinline_for_stack
1104char *ip6_string(char *p, const char *addr, const char *fmt)
1105{
1106 int i;
1107
1108 for (i = 0; i < 8; i++) {
1109 p = hex_byte_pack(p, *addr++);
1110 p = hex_byte_pack(p, *addr++);
1111 if (fmt[0] == 'I' && i != 7)
1112 *p++ = ':';
1113 }
1114 *p = '\0';
1115
1116 return p;
1117}
1118
1119static noinline_for_stack
1120char *ip6_addr_string(char *buf, char *end, const u8 *addr,
1121 struct printf_spec spec, const char *fmt)
1122{
1123 char ip6_addr[sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255")];
1124
1125 if (fmt[0] == 'I' && fmt[2] == 'c')
1126 ip6_compressed_string(ip6_addr, addr);
1127 else
1128 ip6_string(ip6_addr, addr, fmt);
1129
1130 return string(buf, end, ip6_addr, spec);
1131}
1132
1133static noinline_for_stack
1134char *ip4_addr_string(char *buf, char *end, const u8 *addr,
1135 struct printf_spec spec, const char *fmt)
1136{
1137 char ip4_addr[sizeof("255.255.255.255")];
1138
1139 ip4_string(ip4_addr, addr, fmt);
1140
1141 return string(buf, end, ip4_addr, spec);
1142}
1143
1144static noinline_for_stack
1145char *ip6_addr_string_sa(char *buf, char *end, const struct sockaddr_in6 *sa,
1146 struct printf_spec spec, const char *fmt)
1147{
1148 bool have_p = false, have_s = false, have_f = false, have_c = false;
1149 char ip6_addr[sizeof("[xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255]") +
1150 sizeof(":12345") + sizeof("/123456789") +
1151 sizeof("%1234567890")];
1152 char *p = ip6_addr, *pend = ip6_addr + sizeof(ip6_addr);
1153 const u8 *addr = (const u8 *) &sa->sin6_addr;
1154 char fmt6[2] = { fmt[0], '6' };
1155 u8 off = 0;
1156
1157 fmt++;
1158 while (isalpha(*++fmt)) {
1159 switch (*fmt) {
1160 case 'p':
1161 have_p = true;
1162 break;
1163 case 'f':
1164 have_f = true;
1165 break;
1166 case 's':
1167 have_s = true;
1168 break;
1169 case 'c':
1170 have_c = true;
1171 break;
1172 }
1173 }
1174
1175 if (have_p || have_s || have_f) {
1176 *p = '[';
1177 off = 1;
1178 }
1179
1180 if (fmt6[0] == 'I' && have_c)
1181 p = ip6_compressed_string(ip6_addr + off, addr);
1182 else
1183 p = ip6_string(ip6_addr + off, addr, fmt6);
1184
1185 if (have_p || have_s || have_f)
1186 *p++ = ']';
1187
1188 if (have_p) {
1189 *p++ = ':';
1190 p = number(p, pend, ntohs(sa->sin6_port), spec);
1191 }
1192 if (have_f) {
1193 *p++ = '/';
1194 p = number(p, pend, ntohl(sa->sin6_flowinfo &
1195 IPV6_FLOWINFO_MASK), spec);
1196 }
1197 if (have_s) {
1198 *p++ = '%';
1199 p = number(p, pend, sa->sin6_scope_id, spec);
1200 }
1201 *p = '\0';
1202
1203 return string(buf, end, ip6_addr, spec);
1204}
1205
1206static noinline_for_stack
1207char *ip4_addr_string_sa(char *buf, char *end, const struct sockaddr_in *sa,
1208 struct printf_spec spec, const char *fmt)
1209{
1210 bool have_p = false;
1211 char *p, ip4_addr[sizeof("255.255.255.255") + sizeof(":12345")];
1212 char *pend = ip4_addr + sizeof(ip4_addr);
1213 const u8 *addr = (const u8 *) &sa->sin_addr.s_addr;
1214 char fmt4[3] = { fmt[0], '4', 0 };
1215
1216 fmt++;
1217 while (isalpha(*++fmt)) {
1218 switch (*fmt) {
1219 case 'p':
1220 have_p = true;
1221 break;
1222 case 'h':
1223 case 'l':
1224 case 'n':
1225 case 'b':
1226 fmt4[2] = *fmt;
1227 break;
1228 }
1229 }
1230
1231 p = ip4_string(ip4_addr, addr, fmt4);
1232 if (have_p) {
1233 *p++ = ':';
1234 p = number(p, pend, ntohs(sa->sin_port), spec);
1235 }
1236 *p = '\0';
1237
1238 return string(buf, end, ip4_addr, spec);
1239}
1240
1241static noinline_for_stack
1242char *escaped_string(char *buf, char *end, u8 *addr, struct printf_spec spec,
1243 const char *fmt)
1244{
1245 bool found = true;
1246 int count = 1;
1247 unsigned int flags = 0;
1248 int len;
1249
1250 if (spec.field_width == 0)
1251 return buf;
1252
1253 if (ZERO_OR_NULL_PTR(addr))
1254 return string(buf, end, NULL, spec);
1255
1256
1257 do {
1258 switch (fmt[count++]) {
1259 case 'a':
1260 flags |= ESCAPE_ANY;
1261 break;
1262 case 'c':
1263 flags |= ESCAPE_SPECIAL;
1264 break;
1265 case 'h':
1266 flags |= ESCAPE_HEX;
1267 break;
1268 case 'n':
1269 flags |= ESCAPE_NULL;
1270 break;
1271 case 'o':
1272 flags |= ESCAPE_OCTAL;
1273 break;
1274 case 'p':
1275 flags |= ESCAPE_NP;
1276 break;
1277 case 's':
1278 flags |= ESCAPE_SPACE;
1279 break;
1280 default:
1281 found = false;
1282 break;
1283 }
1284 } while (found);
1285
1286 if (!flags)
1287 flags = ESCAPE_ANY_NP;
1288
1289 len = spec.field_width < 0 ? 1 : spec.field_width;
1290
1291
1292
1293
1294
1295
1296 buf += string_escape_mem(addr, len, buf, buf < end ? end - buf : 0, flags, NULL);
1297
1298 return buf;
1299}
1300
1301static noinline_for_stack
1302char *uuid_string(char *buf, char *end, const u8 *addr,
1303 struct printf_spec spec, const char *fmt)
1304{
1305 char uuid[sizeof("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")];
1306 char *p = uuid;
1307 int i;
1308 static const u8 be[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
1309 static const u8 le[16] = {3,2,1,0,5,4,7,6,8,9,10,11,12,13,14,15};
1310 const u8 *index = be;
1311 bool uc = false;
1312
1313 switch (*(++fmt)) {
1314 case 'L':
1315 uc = true;
1316 case 'l':
1317 index = le;
1318 break;
1319 case 'B':
1320 uc = true;
1321 break;
1322 }
1323
1324 for (i = 0; i < 16; i++) {
1325 p = hex_byte_pack(p, addr[index[i]]);
1326 switch (i) {
1327 case 3:
1328 case 5:
1329 case 7:
1330 case 9:
1331 *p++ = '-';
1332 break;
1333 }
1334 }
1335
1336 *p = 0;
1337
1338 if (uc) {
1339 p = uuid;
1340 do {
1341 *p = toupper(*p);
1342 } while (*(++p));
1343 }
1344
1345 return string(buf, end, uuid, spec);
1346}
1347
1348static noinline_for_stack
1349char *netdev_bits(char *buf, char *end, const void *addr, const char *fmt)
1350{
1351 unsigned long long num;
1352 int size;
1353
1354 switch (fmt[1]) {
1355 case 'F':
1356 num = *(const netdev_features_t *)addr;
1357 size = sizeof(netdev_features_t);
1358 break;
1359 default:
1360 num = (unsigned long)addr;
1361 size = sizeof(unsigned long);
1362 break;
1363 }
1364
1365 return special_hex_number(buf, end, num, size);
1366}
1367
1368static noinline_for_stack
1369char *address_val(char *buf, char *end, const void *addr, const char *fmt)
1370{
1371 unsigned long long num;
1372 int size;
1373
1374 switch (fmt[1]) {
1375 case 'd':
1376 num = *(const dma_addr_t *)addr;
1377 size = sizeof(dma_addr_t);
1378 break;
1379 case 'p':
1380 default:
1381 num = *(const phys_addr_t *)addr;
1382 size = sizeof(phys_addr_t);
1383 break;
1384 }
1385
1386 return special_hex_number(buf, end, num, size);
1387}
1388
1389static noinline_for_stack
1390char *clock(char *buf, char *end, struct clk *clk, struct printf_spec spec,
1391 const char *fmt)
1392{
1393 if (!IS_ENABLED(CONFIG_HAVE_CLK) || !clk)
1394 return string(buf, end, NULL, spec);
1395
1396 switch (fmt[1]) {
1397 case 'r':
1398 return number(buf, end, clk_get_rate(clk), spec);
1399
1400 case 'n':
1401 default:
1402#ifdef CONFIG_COMMON_CLK
1403 return string(buf, end, __clk_get_name(clk), spec);
1404#else
1405 return special_hex_number(buf, end, (unsigned long)clk, sizeof(unsigned long));
1406#endif
1407 }
1408}
1409
1410int kptr_restrict __read_mostly;
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505static noinline_for_stack
1506char *pointer(const char *fmt, char *buf, char *end, void *ptr,
1507 struct printf_spec spec)
1508{
1509 const int default_width = 2 * sizeof(void *);
1510
1511 if (!ptr && *fmt != 'K') {
1512
1513
1514
1515
1516 if (spec.field_width == -1)
1517 spec.field_width = default_width;
1518 return string(buf, end, "(null)", spec);
1519 }
1520
1521 switch (*fmt) {
1522 case 'F':
1523 case 'f':
1524 ptr = dereference_function_descriptor(ptr);
1525
1526 case 'S':
1527 case 's':
1528 case 'B':
1529 return symbol_string(buf, end, ptr, spec, fmt);
1530 case 'R':
1531 case 'r':
1532 return resource_string(buf, end, ptr, spec, fmt);
1533 case 'h':
1534 return hex_string(buf, end, ptr, spec, fmt);
1535 case 'b':
1536 switch (fmt[1]) {
1537 case 'l':
1538 return bitmap_list_string(buf, end, ptr, spec, fmt);
1539 default:
1540 return bitmap_string(buf, end, ptr, spec, fmt);
1541 }
1542 case 'M':
1543 case 'm':
1544
1545
1546 return mac_address_string(buf, end, ptr, spec, fmt);
1547 case 'I':
1548
1549
1550
1551
1552 case 'i':
1553
1554
1555
1556 switch (fmt[1]) {
1557 case '6':
1558 return ip6_addr_string(buf, end, ptr, spec, fmt);
1559 case '4':
1560 return ip4_addr_string(buf, end, ptr, spec, fmt);
1561 case 'S': {
1562 const union {
1563 struct sockaddr raw;
1564 struct sockaddr_in v4;
1565 struct sockaddr_in6 v6;
1566 } *sa = ptr;
1567
1568 switch (sa->raw.sa_family) {
1569 case AF_INET:
1570 return ip4_addr_string_sa(buf, end, &sa->v4, spec, fmt);
1571 case AF_INET6:
1572 return ip6_addr_string_sa(buf, end, &sa->v6, spec, fmt);
1573 default:
1574 return string(buf, end, "(invalid address)", spec);
1575 }}
1576 }
1577 break;
1578 case 'E':
1579 return escaped_string(buf, end, ptr, spec, fmt);
1580 case 'U':
1581 return uuid_string(buf, end, ptr, spec, fmt);
1582 case 'V':
1583 {
1584 va_list va;
1585
1586 va_copy(va, *((struct va_format *)ptr)->va);
1587 buf += vsnprintf(buf, end > buf ? end - buf : 0,
1588 ((struct va_format *)ptr)->fmt, va);
1589 va_end(va);
1590 return buf;
1591 }
1592 case 'K':
1593 switch (kptr_restrict) {
1594 case 0:
1595
1596 break;
1597 case 1: {
1598 const struct cred *cred;
1599
1600
1601
1602
1603
1604 if (in_irq() || in_serving_softirq() || in_nmi()) {
1605 if (spec.field_width == -1)
1606 spec.field_width = default_width;
1607 return string(buf, end, "pK-error", spec);
1608 }
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619 cred = current_cred();
1620 if (!has_capability_noaudit(current, CAP_SYSLOG) ||
1621 !uid_eq(cred->euid, cred->uid) ||
1622 !gid_eq(cred->egid, cred->gid))
1623 ptr = NULL;
1624 break;
1625 }
1626 case 2:
1627 default:
1628
1629 ptr = NULL;
1630 break;
1631 }
1632 break;
1633
1634 case 'N':
1635 return netdev_bits(buf, end, ptr, fmt);
1636 case 'a':
1637 return address_val(buf, end, ptr, fmt);
1638 case 'd':
1639 return dentry_name(buf, end, ptr, spec, fmt);
1640 case 'C':
1641 return clock(buf, end, ptr, spec, fmt);
1642 case 'D':
1643 return dentry_name(buf, end,
1644 ((const struct file *)ptr)->f_path.dentry,
1645 spec, fmt);
1646#ifdef CONFIG_BLOCK
1647 case 'g':
1648 return bdev_name(buf, end, ptr, spec, fmt);
1649#endif
1650
1651 }
1652 spec.flags |= SMALL;
1653 if (spec.field_width == -1) {
1654 spec.field_width = default_width;
1655 spec.flags |= ZEROPAD;
1656 }
1657 spec.base = 16;
1658
1659 return number(buf, end, (unsigned long) ptr, spec);
1660}
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682static noinline_for_stack
1683int format_decode(const char *fmt, struct printf_spec *spec)
1684{
1685 const char *start = fmt;
1686 char qualifier;
1687
1688
1689 if (spec->type == FORMAT_TYPE_WIDTH) {
1690 if (spec->field_width < 0) {
1691 spec->field_width = -spec->field_width;
1692 spec->flags |= LEFT;
1693 }
1694 spec->type = FORMAT_TYPE_NONE;
1695 goto precision;
1696 }
1697
1698
1699 if (spec->type == FORMAT_TYPE_PRECISION) {
1700 if (spec->precision < 0)
1701 spec->precision = 0;
1702
1703 spec->type = FORMAT_TYPE_NONE;
1704 goto qualifier;
1705 }
1706
1707
1708 spec->type = FORMAT_TYPE_NONE;
1709
1710 for (; *fmt ; ++fmt) {
1711 if (*fmt == '%')
1712 break;
1713 }
1714
1715
1716 if (fmt != start || !*fmt)
1717 return fmt - start;
1718
1719
1720 spec->flags = 0;
1721
1722 while (1) {
1723 bool found = true;
1724
1725 ++fmt;
1726
1727 switch (*fmt) {
1728 case '-': spec->flags |= LEFT; break;
1729 case '+': spec->flags |= PLUS; break;
1730 case ' ': spec->flags |= SPACE; break;
1731 case '#': spec->flags |= SPECIAL; break;
1732 case '0': spec->flags |= ZEROPAD; break;
1733 default: found = false;
1734 }
1735
1736 if (!found)
1737 break;
1738 }
1739
1740
1741 spec->field_width = -1;
1742
1743 if (isdigit(*fmt))
1744 spec->field_width = skip_atoi(&fmt);
1745 else if (*fmt == '*') {
1746
1747 spec->type = FORMAT_TYPE_WIDTH;
1748 return ++fmt - start;
1749 }
1750
1751precision:
1752
1753 spec->precision = -1;
1754 if (*fmt == '.') {
1755 ++fmt;
1756 if (isdigit(*fmt)) {
1757 spec->precision = skip_atoi(&fmt);
1758 if (spec->precision < 0)
1759 spec->precision = 0;
1760 } else if (*fmt == '*') {
1761
1762 spec->type = FORMAT_TYPE_PRECISION;
1763 return ++fmt - start;
1764 }
1765 }
1766
1767qualifier:
1768
1769 qualifier = 0;
1770 if (*fmt == 'h' || _tolower(*fmt) == 'l' ||
1771 _tolower(*fmt) == 'z' || *fmt == 't') {
1772 qualifier = *fmt++;
1773 if (unlikely(qualifier == *fmt)) {
1774 if (qualifier == 'l') {
1775 qualifier = 'L';
1776 ++fmt;
1777 } else if (qualifier == 'h') {
1778 qualifier = 'H';
1779 ++fmt;
1780 }
1781 }
1782 }
1783
1784
1785 spec->base = 10;
1786 switch (*fmt) {
1787 case 'c':
1788 spec->type = FORMAT_TYPE_CHAR;
1789 return ++fmt - start;
1790
1791 case 's':
1792 spec->type = FORMAT_TYPE_STR;
1793 return ++fmt - start;
1794
1795 case 'p':
1796 spec->type = FORMAT_TYPE_PTR;
1797 return ++fmt - start;
1798
1799 case '%':
1800 spec->type = FORMAT_TYPE_PERCENT_CHAR;
1801 return ++fmt - start;
1802
1803
1804 case 'o':
1805 spec->base = 8;
1806 break;
1807
1808 case 'x':
1809 spec->flags |= SMALL;
1810
1811 case 'X':
1812 spec->base = 16;
1813 break;
1814
1815 case 'd':
1816 case 'i':
1817 spec->flags |= SIGN;
1818 case 'u':
1819 break;
1820
1821 case 'n':
1822
1823
1824
1825
1826
1827
1828
1829 default:
1830 WARN_ONCE(1, "Please remove unsupported %%%c in format string\n", *fmt);
1831 spec->type = FORMAT_TYPE_INVALID;
1832 return fmt - start;
1833 }
1834
1835 if (qualifier == 'L')
1836 spec->type = FORMAT_TYPE_LONG_LONG;
1837 else if (qualifier == 'l') {
1838 BUILD_BUG_ON(FORMAT_TYPE_ULONG + SIGN != FORMAT_TYPE_LONG);
1839 spec->type = FORMAT_TYPE_ULONG + (spec->flags & SIGN);
1840 } else if (_tolower(qualifier) == 'z') {
1841 spec->type = FORMAT_TYPE_SIZE_T;
1842 } else if (qualifier == 't') {
1843 spec->type = FORMAT_TYPE_PTRDIFF;
1844 } else if (qualifier == 'H') {
1845 BUILD_BUG_ON(FORMAT_TYPE_UBYTE + SIGN != FORMAT_TYPE_BYTE);
1846 spec->type = FORMAT_TYPE_UBYTE + (spec->flags & SIGN);
1847 } else if (qualifier == 'h') {
1848 BUILD_BUG_ON(FORMAT_TYPE_USHORT + SIGN != FORMAT_TYPE_SHORT);
1849 spec->type = FORMAT_TYPE_USHORT + (spec->flags & SIGN);
1850 } else {
1851 BUILD_BUG_ON(FORMAT_TYPE_UINT + SIGN != FORMAT_TYPE_INT);
1852 spec->type = FORMAT_TYPE_UINT + (spec->flags & SIGN);
1853 }
1854
1855 return ++fmt - start;
1856}
1857
1858static void
1859set_field_width(struct printf_spec *spec, int width)
1860{
1861 spec->field_width = width;
1862 if (WARN_ONCE(spec->field_width != width, "field width %d too large", width)) {
1863 spec->field_width = clamp(width, -FIELD_WIDTH_MAX, FIELD_WIDTH_MAX);
1864 }
1865}
1866
1867static void
1868set_precision(struct printf_spec *spec, int prec)
1869{
1870 spec->precision = prec;
1871 if (WARN_ONCE(spec->precision != prec, "precision %d too large", prec)) {
1872 spec->precision = clamp(prec, 0, PRECISION_MAX);
1873 }
1874}
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
1905{
1906 unsigned long long num;
1907 char *str, *end;
1908 struct printf_spec spec = {0};
1909
1910
1911
1912 if (WARN_ON_ONCE(size > INT_MAX))
1913 return 0;
1914
1915 str = buf;
1916 end = buf + size;
1917
1918
1919 if (end < buf) {
1920 end = ((void *)-1);
1921 size = end - buf;
1922 }
1923
1924 while (*fmt) {
1925 const char *old_fmt = fmt;
1926 int read = format_decode(fmt, &spec);
1927
1928 fmt += read;
1929
1930 switch (spec.type) {
1931 case FORMAT_TYPE_NONE: {
1932 int copy = read;
1933 if (str < end) {
1934 if (copy > end - str)
1935 copy = end - str;
1936 memcpy(str, old_fmt, copy);
1937 }
1938 str += read;
1939 break;
1940 }
1941
1942 case FORMAT_TYPE_WIDTH:
1943 set_field_width(&spec, va_arg(args, int));
1944 break;
1945
1946 case FORMAT_TYPE_PRECISION:
1947 set_precision(&spec, va_arg(args, int));
1948 break;
1949
1950 case FORMAT_TYPE_CHAR: {
1951 char c;
1952
1953 if (!(spec.flags & LEFT)) {
1954 while (--spec.field_width > 0) {
1955 if (str < end)
1956 *str = ' ';
1957 ++str;
1958
1959 }
1960 }
1961 c = (unsigned char) va_arg(args, int);
1962 if (str < end)
1963 *str = c;
1964 ++str;
1965 while (--spec.field_width > 0) {
1966 if (str < end)
1967 *str = ' ';
1968 ++str;
1969 }
1970 break;
1971 }
1972
1973 case FORMAT_TYPE_STR:
1974 str = string(str, end, va_arg(args, char *), spec);
1975 break;
1976
1977 case FORMAT_TYPE_PTR:
1978 str = pointer(fmt, str, end, va_arg(args, void *),
1979 spec);
1980 while (isalnum(*fmt))
1981 fmt++;
1982 break;
1983
1984 case FORMAT_TYPE_PERCENT_CHAR:
1985 if (str < end)
1986 *str = '%';
1987 ++str;
1988 break;
1989
1990 case FORMAT_TYPE_INVALID:
1991
1992
1993
1994
1995
1996
1997
1998
1999 goto out;
2000
2001 default:
2002 switch (spec.type) {
2003 case FORMAT_TYPE_LONG_LONG:
2004 num = va_arg(args, long long);
2005 break;
2006 case FORMAT_TYPE_ULONG:
2007 num = va_arg(args, unsigned long);
2008 break;
2009 case FORMAT_TYPE_LONG:
2010 num = va_arg(args, long);
2011 break;
2012 case FORMAT_TYPE_SIZE_T:
2013 if (spec.flags & SIGN)
2014 num = va_arg(args, ssize_t);
2015 else
2016 num = va_arg(args, size_t);
2017 break;
2018 case FORMAT_TYPE_PTRDIFF:
2019 num = va_arg(args, ptrdiff_t);
2020 break;
2021 case FORMAT_TYPE_UBYTE:
2022 num = (unsigned char) va_arg(args, int);
2023 break;
2024 case FORMAT_TYPE_BYTE:
2025 num = (signed char) va_arg(args, int);
2026 break;
2027 case FORMAT_TYPE_USHORT:
2028 num = (unsigned short) va_arg(args, int);
2029 break;
2030 case FORMAT_TYPE_SHORT:
2031 num = (short) va_arg(args, int);
2032 break;
2033 case FORMAT_TYPE_INT:
2034 num = (int) va_arg(args, int);
2035 break;
2036 default:
2037 num = va_arg(args, unsigned int);
2038 }
2039
2040 str = number(str, end, num, spec);
2041 }
2042 }
2043
2044out:
2045 if (size > 0) {
2046 if (str < end)
2047 *str = '\0';
2048 else
2049 end[-1] = '\0';
2050 }
2051
2052
2053 return str-buf;
2054
2055}
2056EXPORT_SYMBOL(vsnprintf);
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073int vscnprintf(char *buf, size_t size, const char *fmt, va_list args)
2074{
2075 int i;
2076
2077 i = vsnprintf(buf, size, fmt, args);
2078
2079 if (likely(i < size))
2080 return i;
2081 if (size != 0)
2082 return size - 1;
2083 return 0;
2084}
2085EXPORT_SYMBOL(vscnprintf);
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101int snprintf(char *buf, size_t size, const char *fmt, ...)
2102{
2103 va_list args;
2104 int i;
2105
2106 va_start(args, fmt);
2107 i = vsnprintf(buf, size, fmt, args);
2108 va_end(args);
2109
2110 return i;
2111}
2112EXPORT_SYMBOL(snprintf);
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125int scnprintf(char *buf, size_t size, const char *fmt, ...)
2126{
2127 va_list args;
2128 int i;
2129
2130 va_start(args, fmt);
2131 i = vscnprintf(buf, size, fmt, args);
2132 va_end(args);
2133
2134 return i;
2135}
2136EXPORT_SYMBOL(scnprintf);
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152int vsprintf(char *buf, const char *fmt, va_list args)
2153{
2154 return vsnprintf(buf, INT_MAX, fmt, args);
2155}
2156EXPORT_SYMBOL(vsprintf);
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170int sprintf(char *buf, const char *fmt, ...)
2171{
2172 va_list args;
2173 int i;
2174
2175 va_start(args, fmt);
2176 i = vsnprintf(buf, INT_MAX, fmt, args);
2177 va_end(args);
2178
2179 return i;
2180}
2181EXPORT_SYMBOL(sprintf);
2182
2183#ifdef CONFIG_BINARY_PRINTF
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207int vbin_printf(u32 *bin_buf, size_t size, const char *fmt, va_list args)
2208{
2209 struct printf_spec spec = {0};
2210 char *str, *end;
2211
2212 str = (char *)bin_buf;
2213 end = (char *)(bin_buf + size);
2214
2215#define save_arg(type) \
2216do { \
2217 if (sizeof(type) == 8) { \
2218 unsigned long long value; \
2219 str = PTR_ALIGN(str, sizeof(u32)); \
2220 value = va_arg(args, unsigned long long); \
2221 if (str + sizeof(type) <= end) { \
2222 *(u32 *)str = *(u32 *)&value; \
2223 *(u32 *)(str + 4) = *((u32 *)&value + 1); \
2224 } \
2225 } else { \
2226 unsigned long value; \
2227 str = PTR_ALIGN(str, sizeof(type)); \
2228 value = va_arg(args, int); \
2229 if (str + sizeof(type) <= end) \
2230 *(typeof(type) *)str = (type)value; \
2231 } \
2232 str += sizeof(type); \
2233} while (0)
2234
2235 while (*fmt) {
2236 int read = format_decode(fmt, &spec);
2237
2238 fmt += read;
2239
2240 switch (spec.type) {
2241 case FORMAT_TYPE_NONE:
2242 case FORMAT_TYPE_PERCENT_CHAR:
2243 break;
2244 case FORMAT_TYPE_INVALID:
2245 goto out;
2246
2247 case FORMAT_TYPE_WIDTH:
2248 case FORMAT_TYPE_PRECISION:
2249 save_arg(int);
2250 break;
2251
2252 case FORMAT_TYPE_CHAR:
2253 save_arg(char);
2254 break;
2255
2256 case FORMAT_TYPE_STR: {
2257 const char *save_str = va_arg(args, char *);
2258 size_t len;
2259
2260 if ((unsigned long)save_str > (unsigned long)-PAGE_SIZE
2261 || (unsigned long)save_str < PAGE_SIZE)
2262 save_str = "(null)";
2263 len = strlen(save_str) + 1;
2264 if (str + len < end)
2265 memcpy(str, save_str, len);
2266 str += len;
2267 break;
2268 }
2269
2270 case FORMAT_TYPE_PTR:
2271 save_arg(void *);
2272
2273 while (isalnum(*fmt))
2274 fmt++;
2275 break;
2276
2277 default:
2278 switch (spec.type) {
2279
2280 case FORMAT_TYPE_LONG_LONG:
2281 save_arg(long long);
2282 break;
2283 case FORMAT_TYPE_ULONG:
2284 case FORMAT_TYPE_LONG:
2285 save_arg(unsigned long);
2286 break;
2287 case FORMAT_TYPE_SIZE_T:
2288 save_arg(size_t);
2289 break;
2290 case FORMAT_TYPE_PTRDIFF:
2291 save_arg(ptrdiff_t);
2292 break;
2293 case FORMAT_TYPE_UBYTE:
2294 case FORMAT_TYPE_BYTE:
2295 save_arg(char);
2296 break;
2297 case FORMAT_TYPE_USHORT:
2298 case FORMAT_TYPE_SHORT:
2299 save_arg(short);
2300 break;
2301 default:
2302 save_arg(int);
2303 }
2304 }
2305 }
2306
2307out:
2308 return (u32 *)(PTR_ALIGN(str, sizeof(u32))) - bin_buf;
2309#undef save_arg
2310}
2311EXPORT_SYMBOL_GPL(vbin_printf);
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335int bstr_printf(char *buf, size_t size, const char *fmt, const u32 *bin_buf)
2336{
2337 struct printf_spec spec = {0};
2338 char *str, *end;
2339 const char *args = (const char *)bin_buf;
2340
2341 if (WARN_ON_ONCE(size > INT_MAX))
2342 return 0;
2343
2344 str = buf;
2345 end = buf + size;
2346
2347#define get_arg(type) \
2348({ \
2349 typeof(type) value; \
2350 if (sizeof(type) == 8) { \
2351 args = PTR_ALIGN(args, sizeof(u32)); \
2352 *(u32 *)&value = *(u32 *)args; \
2353 *((u32 *)&value + 1) = *(u32 *)(args + 4); \
2354 } else { \
2355 args = PTR_ALIGN(args, sizeof(type)); \
2356 value = *(typeof(type) *)args; \
2357 } \
2358 args += sizeof(type); \
2359 value; \
2360})
2361
2362
2363 if (end < buf) {
2364 end = ((void *)-1);
2365 size = end - buf;
2366 }
2367
2368 while (*fmt) {
2369 const char *old_fmt = fmt;
2370 int read = format_decode(fmt, &spec);
2371
2372 fmt += read;
2373
2374 switch (spec.type) {
2375 case FORMAT_TYPE_NONE: {
2376 int copy = read;
2377 if (str < end) {
2378 if (copy > end - str)
2379 copy = end - str;
2380 memcpy(str, old_fmt, copy);
2381 }
2382 str += read;
2383 break;
2384 }
2385
2386 case FORMAT_TYPE_WIDTH:
2387 set_field_width(&spec, get_arg(int));
2388 break;
2389
2390 case FORMAT_TYPE_PRECISION:
2391 set_precision(&spec, get_arg(int));
2392 break;
2393
2394 case FORMAT_TYPE_CHAR: {
2395 char c;
2396
2397 if (!(spec.flags & LEFT)) {
2398 while (--spec.field_width > 0) {
2399 if (str < end)
2400 *str = ' ';
2401 ++str;
2402 }
2403 }
2404 c = (unsigned char) get_arg(char);
2405 if (str < end)
2406 *str = c;
2407 ++str;
2408 while (--spec.field_width > 0) {
2409 if (str < end)
2410 *str = ' ';
2411 ++str;
2412 }
2413 break;
2414 }
2415
2416 case FORMAT_TYPE_STR: {
2417 const char *str_arg = args;
2418 args += strlen(str_arg) + 1;
2419 str = string(str, end, (char *)str_arg, spec);
2420 break;
2421 }
2422
2423 case FORMAT_TYPE_PTR:
2424 str = pointer(fmt, str, end, get_arg(void *), spec);
2425 while (isalnum(*fmt))
2426 fmt++;
2427 break;
2428
2429 case FORMAT_TYPE_PERCENT_CHAR:
2430 if (str < end)
2431 *str = '%';
2432 ++str;
2433 break;
2434
2435 case FORMAT_TYPE_INVALID:
2436 goto out;
2437
2438 default: {
2439 unsigned long long num;
2440
2441 switch (spec.type) {
2442
2443 case FORMAT_TYPE_LONG_LONG:
2444 num = get_arg(long long);
2445 break;
2446 case FORMAT_TYPE_ULONG:
2447 case FORMAT_TYPE_LONG:
2448 num = get_arg(unsigned long);
2449 break;
2450 case FORMAT_TYPE_SIZE_T:
2451 num = get_arg(size_t);
2452 break;
2453 case FORMAT_TYPE_PTRDIFF:
2454 num = get_arg(ptrdiff_t);
2455 break;
2456 case FORMAT_TYPE_UBYTE:
2457 num = get_arg(unsigned char);
2458 break;
2459 case FORMAT_TYPE_BYTE:
2460 num = get_arg(signed char);
2461 break;
2462 case FORMAT_TYPE_USHORT:
2463 num = get_arg(unsigned short);
2464 break;
2465 case FORMAT_TYPE_SHORT:
2466 num = get_arg(short);
2467 break;
2468 case FORMAT_TYPE_UINT:
2469 num = get_arg(unsigned int);
2470 break;
2471 default:
2472 num = get_arg(int);
2473 }
2474
2475 str = number(str, end, num, spec);
2476 }
2477 }
2478 }
2479
2480out:
2481 if (size > 0) {
2482 if (str < end)
2483 *str = '\0';
2484 else
2485 end[-1] = '\0';
2486 }
2487
2488#undef get_arg
2489
2490
2491 return str - buf;
2492}
2493EXPORT_SYMBOL_GPL(bstr_printf);
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505int bprintf(u32 *bin_buf, size_t size, const char *fmt, ...)
2506{
2507 va_list args;
2508 int ret;
2509
2510 va_start(args, fmt);
2511 ret = vbin_printf(bin_buf, size, fmt, args);
2512 va_end(args);
2513
2514 return ret;
2515}
2516EXPORT_SYMBOL_GPL(bprintf);
2517
2518#endif
2519
2520
2521
2522
2523
2524
2525
2526int vsscanf(const char *buf, const char *fmt, va_list args)
2527{
2528 const char *str = buf;
2529 char *next;
2530 char digit;
2531 int num = 0;
2532 u8 qualifier;
2533 unsigned int base;
2534 union {
2535 long long s;
2536 unsigned long long u;
2537 } val;
2538 s16 field_width;
2539 bool is_sign;
2540
2541 while (*fmt) {
2542
2543
2544
2545
2546 if (isspace(*fmt)) {
2547 fmt = skip_spaces(++fmt);
2548 str = skip_spaces(str);
2549 }
2550
2551
2552 if (*fmt != '%' && *fmt) {
2553 if (*fmt++ != *str++)
2554 break;
2555 continue;
2556 }
2557
2558 if (!*fmt)
2559 break;
2560 ++fmt;
2561
2562
2563
2564
2565 if (*fmt == '*') {
2566 if (!*str)
2567 break;
2568 while (!isspace(*fmt) && *fmt != '%' && *fmt)
2569 fmt++;
2570 while (!isspace(*str) && *str)
2571 str++;
2572 continue;
2573 }
2574
2575
2576 field_width = -1;
2577 if (isdigit(*fmt)) {
2578 field_width = skip_atoi(&fmt);
2579 if (field_width <= 0)
2580 break;
2581 }
2582
2583
2584 qualifier = -1;
2585 if (*fmt == 'h' || _tolower(*fmt) == 'l' ||
2586 _tolower(*fmt) == 'z') {
2587 qualifier = *fmt++;
2588 if (unlikely(qualifier == *fmt)) {
2589 if (qualifier == 'h') {
2590 qualifier = 'H';
2591 fmt++;
2592 } else if (qualifier == 'l') {
2593 qualifier = 'L';
2594 fmt++;
2595 }
2596 }
2597 }
2598
2599 if (!*fmt)
2600 break;
2601
2602 if (*fmt == 'n') {
2603
2604 *va_arg(args, int *) = str - buf;
2605 ++fmt;
2606 continue;
2607 }
2608
2609 if (!*str)
2610 break;
2611
2612 base = 10;
2613 is_sign = false;
2614
2615 switch (*fmt++) {
2616 case 'c':
2617 {
2618 char *s = (char *)va_arg(args, char*);
2619 if (field_width == -1)
2620 field_width = 1;
2621 do {
2622 *s++ = *str++;
2623 } while (--field_width > 0 && *str);
2624 num++;
2625 }
2626 continue;
2627 case 's':
2628 {
2629 char *s = (char *)va_arg(args, char *);
2630 if (field_width == -1)
2631 field_width = SHRT_MAX;
2632
2633 str = skip_spaces(str);
2634
2635
2636 while (*str && !isspace(*str) && field_width--)
2637 *s++ = *str++;
2638 *s = '\0';
2639 num++;
2640 }
2641 continue;
2642 case 'o':
2643 base = 8;
2644 break;
2645 case 'x':
2646 case 'X':
2647 base = 16;
2648 break;
2649 case 'i':
2650 base = 0;
2651 case 'd':
2652 is_sign = true;
2653 case 'u':
2654 break;
2655 case '%':
2656
2657 if (*str++ != '%')
2658 return num;
2659 continue;
2660 default:
2661
2662 return num;
2663 }
2664
2665
2666
2667
2668 str = skip_spaces(str);
2669
2670 digit = *str;
2671 if (is_sign && digit == '-')
2672 digit = *(str + 1);
2673
2674 if (!digit
2675 || (base == 16 && !isxdigit(digit))
2676 || (base == 10 && !isdigit(digit))
2677 || (base == 8 && (!isdigit(digit) || digit > '7'))
2678 || (base == 0 && !isdigit(digit)))
2679 break;
2680
2681 if (is_sign)
2682 val.s = qualifier != 'L' ?
2683 simple_strtol(str, &next, base) :
2684 simple_strtoll(str, &next, base);
2685 else
2686 val.u = qualifier != 'L' ?
2687 simple_strtoul(str, &next, base) :
2688 simple_strtoull(str, &next, base);
2689
2690 if (field_width > 0 && next - str > field_width) {
2691 if (base == 0)
2692 _parse_integer_fixup_radix(str, &base);
2693 while (next - str > field_width) {
2694 if (is_sign)
2695 val.s = div_s64(val.s, base);
2696 else
2697 val.u = div_u64(val.u, base);
2698 --next;
2699 }
2700 }
2701
2702 switch (qualifier) {
2703 case 'H':
2704 if (is_sign)
2705 *va_arg(args, signed char *) = val.s;
2706 else
2707 *va_arg(args, unsigned char *) = val.u;
2708 break;
2709 case 'h':
2710 if (is_sign)
2711 *va_arg(args, short *) = val.s;
2712 else
2713 *va_arg(args, unsigned short *) = val.u;
2714 break;
2715 case 'l':
2716 if (is_sign)
2717 *va_arg(args, long *) = val.s;
2718 else
2719 *va_arg(args, unsigned long *) = val.u;
2720 break;
2721 case 'L':
2722 if (is_sign)
2723 *va_arg(args, long long *) = val.s;
2724 else
2725 *va_arg(args, unsigned long long *) = val.u;
2726 break;
2727 case 'Z':
2728 case 'z':
2729 *va_arg(args, size_t *) = val.u;
2730 break;
2731 default:
2732 if (is_sign)
2733 *va_arg(args, int *) = val.s;
2734 else
2735 *va_arg(args, unsigned int *) = val.u;
2736 break;
2737 }
2738 num++;
2739
2740 if (!next)
2741 break;
2742 str = next;
2743 }
2744
2745 return num;
2746}
2747EXPORT_SYMBOL(vsscanf);
2748
2749
2750
2751
2752
2753
2754
2755int sscanf(const char *buf, const char *fmt, ...)
2756{
2757 va_list args;
2758 int i;
2759
2760 va_start(args, fmt);
2761 i = vsscanf(buf, fmt, args);
2762 va_end(args);
2763
2764 return i;
2765}
2766EXPORT_SYMBOL(sscanf);
2767