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