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