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