1/*
2 *  linux/lib/vsprintf.c
3 *
4 *  Copyright (C) 1991, 1992  Linus Torvalds
5 */
6
7/* vsprintf.c -- Lars Wirzenius & Linus Torvalds. */
8/*
9 * Wirzenius wrote this portably, Torvalds fucked it up :-)
10 */
11
12/*
13 * Fri Jul 13 2001 Crutcher Dunnavant <crutcher+kernel@datastacks.com>
14 * - changed to provide snprintf and vsnprintf functions
15 * So Feb  1 16:51:32 CET 2004 Juergen Quade <quade@hsnr.de>
16 * - scnprintf and vscnprintf
17 */
18
19#include <stdarg.h>
20#include <linux/module.h>
21#include <linux/types.h>
22#include <linux/string.h>
23#include <linux/ctype.h>
24#include <linux/kernel.h>
25#include <linux/kallsyms.h>
26#include <linux/uaccess.h>
27#include <linux/ioport.h>
28#include <net/addrconf.h>
29
30#include <asm/page.h>		/* for PAGE_SIZE */
31#include <asm/div64.h>
32#include <asm/sections.h>	/* for dereference_function_descriptor() */
33
34/* Works only for digits and letters, but small and fast */
35#define TOLOWER(x) ((x) | 0x20)
36
37static unsigned int simple_guess_base(const char *cp)
38{
39	if (cp[0] == '0') {
40		if (TOLOWER(cp[1]) == 'x' && isxdigit(cp[2]))
41			return 16;
42		else
43			return 8;
44	} else {
45		return 10;
46	}
47}
48
49/**
50 * simple_strtoull - convert a string to an unsigned long long
51 * @cp: The start of the string
52 * @endp: A pointer to the end of the parsed string will be placed here
53 * @base: The number base to use
54 */
55unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base)
56{
57	unsigned long long result = 0;
58
59	if (!base)
60		base = simple_guess_base(cp);
61
62	if (base == 16 && cp[0] == '0' && TOLOWER(cp[1]) == 'x')
63		cp += 2;
64
65	while (isxdigit(*cp)) {
66		unsigned int value;
67
68		value = isdigit(*cp) ? *cp - '0' : TOLOWER(*cp) - 'a' + 10;
69		if (value >= base)
70			break;
71		result = result * base + value;
72		cp++;
73	}
74	if (endp)
75		*endp = (char *)cp;
76
77	return result;
78}
79EXPORT_SYMBOL(simple_strtoull);
80
81/**
82 * simple_strtoul - convert a string to an unsigned long
83 * @cp: The start of the string
84 * @endp: A pointer to the end of the parsed string will be placed here
85 * @base: The number base to use
86 */
87unsigned long simple_strtoul(const char *cp, char **endp, unsigned int base)
88{
89	return simple_strtoull(cp, endp, base);
90}
91EXPORT_SYMBOL(simple_strtoul);
92
93/**
94 * simple_strtol - convert a string to a signed long
95 * @cp: The start of the string
96 * @endp: A pointer to the end of the parsed string will be placed here
97 * @base: The number base to use
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 * simple_strtoll - convert a string to a signed long long
110 * @cp: The start of the string
111 * @endp: A pointer to the end of the parsed string will be placed here
112 * @base: The number base to use
113 */
114long long simple_strtoll(const char *cp, char **endp, unsigned int base)
115{
116	if (*cp == '-')
117		return -simple_strtoull(cp + 1, endp, base);
118
119	return simple_strtoull(cp, endp, base);
120}
121EXPORT_SYMBOL(simple_strtoll);
122
123/**
124 * strict_strtoul - convert a string to an unsigned long strictly
125 * @cp: The string to be converted
126 * @base: The number base to use
127 * @res: The converted result value
128 *
129 * strict_strtoul converts a string to an unsigned long only if the
130 * string is really an unsigned long string, any string containing
131 * any invalid char at the tail will be rejected and -EINVAL is returned,
132 * only a newline char at the tail is acceptible because people generally
133 * change a module parameter in the following way:
134 *
135 * 	echo 1024 > /sys/module/e1000/parameters/copybreak
136 *
137 * echo will append a newline to the tail.
138 *
139 * It returns 0 if conversion is successful and *res is set to the converted
140 * value, otherwise it returns -EINVAL and *res is set to 0.
141 *
142 * simple_strtoul just ignores the successive invalid characters and
143 * return the converted value of prefix part of the string.
144 */
145int strict_strtoul(const char *cp, unsigned int base, unsigned long *res)
146{
147	char *tail;
148	unsigned long val;
149
150	*res = 0;
151	if (!*cp)
152		return -EINVAL;
153
154	val = simple_strtoul(cp, &tail, base);
155	if (tail == cp)
156		return -EINVAL;
157
158	if ((tail[0] == '\0') || (tail[0] == '\n' && tail[1] == '\0')) {
159		*res = val;
160		return 0;
161	}
162
163	return -EINVAL;
164}
165EXPORT_SYMBOL(strict_strtoul);
166
167/**
168 * strict_strtol - convert a string to a long strictly
169 * @cp: The string to be converted
170 * @base: The number base to use
171 * @res: The converted result value
172 *
173 * strict_strtol is similiar to strict_strtoul, but it allows the first
174 * character of a string is '-'.
175 *
176 * It returns 0 if conversion is successful and *res is set to the converted
177 * value, otherwise it returns -EINVAL and *res is set to 0.
178 */
179int strict_strtol(const char *cp, unsigned int base, long *res)
180{
181	int ret;
182	if (*cp == '-') {
183		ret = strict_strtoul(cp + 1, base, (unsigned long *)res);
184		if (!ret)
185			*res = -(*res);
186	} else {
187		ret = strict_strtoul(cp, base, (unsigned long *)res);
188	}
189
190	return ret;
191}
192EXPORT_SYMBOL(strict_strtol);
193
194/**
195 * strict_strtoull - convert a string to an unsigned long long strictly
196 * @cp: The string to be converted
197 * @base: The number base to use
198 * @res: The converted result value
199 *
200 * strict_strtoull converts a string to an unsigned long long only if the
201 * string is really an unsigned long long string, any string containing
202 * any invalid char at the tail will be rejected and -EINVAL is returned,
203 * only a newline char at the tail is acceptible because people generally
204 * change a module parameter in the following way:
205 *
206 * 	echo 1024 > /sys/module/e1000/parameters/copybreak
207 *
208 * echo will append a newline to the tail of the string.
209 *
210 * It returns 0 if conversion is successful and *res is set to the converted
211 * value, otherwise it returns -EINVAL and *res is set to 0.
212 *
213 * simple_strtoull just ignores the successive invalid characters and
214 * return the converted value of prefix part of the string.
215 */
216int strict_strtoull(const char *cp, unsigned int base, unsigned long long *res)
217{
218	char *tail;
219	unsigned long long val;
220
221	*res = 0;
222	if (!*cp)
223		return -EINVAL;
224
225	val = simple_strtoull(cp, &tail, base);
226	if (tail == cp)
227		return -EINVAL;
228	if ((tail[0] == '\0') || (tail[0] == '\n' && tail[1] == '\0')) {
229		*res = val;
230		return 0;
231	}
232
233	return -EINVAL;
234}
235EXPORT_SYMBOL(strict_strtoull);
236
237/**
238 * strict_strtoll - convert a string to a long long strictly
239 * @cp: The string to be converted
240 * @base: The number base to use
241 * @res: The converted result value
242 *
243 * strict_strtoll is similiar to strict_strtoull, but it allows the first
244 * character of a string is '-'.
245 *
246 * It returns 0 if conversion is successful and *res is set to the converted
247 * value, otherwise it returns -EINVAL and *res is set to 0.
248 */
249int strict_strtoll(const char *cp, unsigned int base, long long *res)
250{
251	int ret;
252	if (*cp == '-') {
253		ret = strict_strtoull(cp + 1, base, (unsigned long long *)res);
254		if (!ret)
255			*res = -(*res);
256	} else {
257		ret = strict_strtoull(cp, base, (unsigned long long *)res);
258	}
259
260	return ret;
261}
262EXPORT_SYMBOL(strict_strtoll);
263
264static noinline_for_stack
265int skip_atoi(const char **s)
266{
267	int i = 0;
268
269	while (isdigit(**s))
270		i = i*10 + *((*s)++) - '0';
271
272	return i;
273}
274
275/* Decimal conversion is by far the most typical, and is used
276 * for /proc and /sys data. This directly impacts e.g. top performance
277 * with many processes running. We optimize it for speed
278 * using code from
279 * http://www.cs.uiowa.edu/~jones/bcd/decimal.html
280 * (with permission from the author, Douglas W. Jones). */
281
282/* Formats correctly any integer in [0,99999].
283 * Outputs from one to five digits depending on input.
284 * On i386 gcc 4.1.2 -O2: ~250 bytes of code. */
285static noinline_for_stack
286char *put_dec_trunc(char *buf, unsigned q)
287{
288	unsigned d3, d2, d1, d0;
289	d1 = (q>>4) & 0xf;
290	d2 = (q>>8) & 0xf;
291	d3 = (q>>12);
292
293	d0 = 6*(d3 + d2 + d1) + (q & 0xf);
294	q = (d0 * 0xcd) >> 11;
295	d0 = d0 - 10*q;
296	*buf++ = d0 + '0'; /* least significant digit */
297	d1 = q + 9*d3 + 5*d2 + d1;
298	if (d1 != 0) {
299		q = (d1 * 0xcd) >> 11;
300		d1 = d1 - 10*q;
301		*buf++ = d1 + '0'; /* next digit */
302
303		d2 = q + 2*d2;
304		if ((d2 != 0) || (d3 != 0)) {
305			q = (d2 * 0xd) >> 7;
306			d2 = d2 - 10*q;
307			*buf++ = d2 + '0'; /* next digit */
308
309			d3 = q + 4*d3;
310			if (d3 != 0) {
311				q = (d3 * 0xcd) >> 11;
312				d3 = d3 - 10*q;
313				*buf++ = d3 + '0';  /* next digit */
314				if (q != 0)
315					*buf++ = q + '0'; /* most sign. digit */
316			}
317		}
318	}
319
320	return buf;
321}
322/* Same with if's removed. Always emits five digits */
323static noinline_for_stack
324char *put_dec_full(char *buf, unsigned q)
325{
326	/* BTW, if q is in [0,9999], 8-bit ints will be enough, */
327	/* but anyway, gcc produces better code with full-sized ints */
328	unsigned d3, d2, d1, d0;
329	d1 = (q>>4) & 0xf;
330	d2 = (q>>8) & 0xf;
331	d3 = (q>>12);
332
333	/*
334	 * Possible ways to approx. divide by 10
335	 * gcc -O2 replaces multiply with shifts and adds
336	 * (x * 0xcd) >> 11: 11001101 - shorter code than * 0x67 (on i386)
337	 * (x * 0x67) >> 10:  1100111
338	 * (x * 0x34) >> 9:    110100 - same
339	 * (x * 0x1a) >> 8:     11010 - same
340	 * (x * 0x0d) >> 7:      1101 - same, shortest code (on i386)
341	 */
342	d0 = 6*(d3 + d2 + d1) + (q & 0xf);
343	q = (d0 * 0xcd) >> 11;
344	d0 = d0 - 10*q;
345	*buf++ = d0 + '0';
346	d1 = q + 9*d3 + 5*d2 + d1;
347		q = (d1 * 0xcd) >> 11;
348		d1 = d1 - 10*q;
349		*buf++ = d1 + '0';
350
351		d2 = q + 2*d2;
352			q = (d2 * 0xd) >> 7;
353			d2 = d2 - 10*q;
354			*buf++ = d2 + '0';
355
356			d3 = q + 4*d3;
357				q = (d3 * 0xcd) >> 11; /* - shorter code */
358				/* q = (d3 * 0x67) >> 10; - would also work */
359				d3 = d3 - 10*q;
360				*buf++ = d3 + '0';
361					*buf++ = q + '0';
362
363	return buf;
364}
365/* No inlining helps gcc to use registers better */
366static noinline_for_stack
367char *put_dec(char *buf, unsigned long long num)
368{
369	while (1) {
370		unsigned rem;
371		if (num < 100000)
372			return put_dec_trunc(buf, num);
373		rem = do_div(num, 100000);
374		buf = put_dec_full(buf, rem);
375	}
376}
377
378#define ZEROPAD	1		/* pad with zero */
379#define SIGN	2		/* unsigned/signed long */
380#define PLUS	4		/* show plus */
381#define SPACE	8		/* space if plus */
382#define LEFT	16		/* left justified */
383#define SMALL	32		/* use lowercase in hex (must be 32 == 0x20) */
384#define SPECIAL	64		/* prefix hex with "0x", octal with "0" */
385
386enum format_type {
387	FORMAT_TYPE_NONE, /* Just a string part */
388	FORMAT_TYPE_WIDTH,
389	FORMAT_TYPE_PRECISION,
390	FORMAT_TYPE_CHAR,
391	FORMAT_TYPE_STR,
392	FORMAT_TYPE_PTR,
393	FORMAT_TYPE_PERCENT_CHAR,
394	FORMAT_TYPE_INVALID,
395	FORMAT_TYPE_LONG_LONG,
396	FORMAT_TYPE_ULONG,
397	FORMAT_TYPE_LONG,
398	FORMAT_TYPE_UBYTE,
399	FORMAT_TYPE_BYTE,
400	FORMAT_TYPE_USHORT,
401	FORMAT_TYPE_SHORT,
402	FORMAT_TYPE_UINT,
403	FORMAT_TYPE_INT,
404	FORMAT_TYPE_NRCHARS,
405	FORMAT_TYPE_SIZE_T,
406	FORMAT_TYPE_PTRDIFF
407};
408
409struct printf_spec {
410	u8	type;		/* format_type enum */
411	u8	flags;		/* flags to number() */
412	u8	base;		/* number base, 8, 10 or 16 only */
413	u8	qualifier;	/* number qualifier, one of 'hHlLtzZ' */
414	s16	field_width;	/* width of output field */
415	s16	precision;	/* # of digits/chars */
416};
417
418static noinline_for_stack
419char *number(char *buf, char *end, unsigned long long num,
420	     struct printf_spec spec)
421{
422	/* we are called with base 8, 10 or 16, only, thus don't need "G..."  */
423	static const char digits[16] = "0123456789ABCDEF"; /* "GHIJKLMNOPQRSTUVWXYZ"; */
424
425	char tmp[66];
426	char sign;
427	char locase;
428	int need_pfx = ((spec.flags & SPECIAL) && spec.base != 10);
429	int i;
430
431	/* locase = 0 or 0x20. ORing digits or letters with 'locase'
432	 * produces same digits or (maybe lowercased) letters */
433	locase = (spec.flags & SMALL);
434	if (spec.flags & LEFT)
435		spec.flags &= ~ZEROPAD;
436	sign = 0;
437	if (spec.flags & SIGN) {
438		if ((signed long long)num < 0) {
439			sign = '-';
440			num = -(signed long long)num;
441			spec.field_width--;
442		} else if (spec.flags & PLUS) {
443			sign = '+';
444			spec.field_width--;
445		} else if (spec.flags & SPACE) {
446			sign = ' ';
447			spec.field_width--;
448		}
449	}
450	if (need_pfx) {
451		spec.field_width--;
452		if (spec.base == 16)
453			spec.field_width--;
454	}
455
456	/* generate full string in tmp[], in reverse order */
457	i = 0;
458	if (num == 0)
459		tmp[i++] = '0';
460	/* Generic code, for any base:
461	else do {
462		tmp[i++] = (digits[do_div(num,base)] | locase);
463	} while (num != 0);
464	*/
465	else if (spec.base != 10) { /* 8 or 16 */
466		int mask = spec.base - 1;
467		int shift = 3;
468
469		if (spec.base == 16)
470			shift = 4;
471		do {
472			tmp[i++] = (digits[((unsigned char)num) & mask] | locase);
473			num >>= shift;
474		} while (num);
475	} else { /* base 10 */
476		i = put_dec(tmp, num) - tmp;
477	}
478
479	/* printing 100 using %2d gives "100", not "00" */
480	if (i > spec.precision)
481		spec.precision = i;
482	/* leading space padding */
483	spec.field_width -= spec.precision;
484	if (!(spec.flags & (ZEROPAD+LEFT))) {
485		while (--spec.field_width >= 0) {
486			if (buf < end)
487				*buf = ' ';
488			++buf;
489		}
490	}
491	/* sign */
492	if (sign) {
493		if (buf < end)
494			*buf = sign;
495		++buf;
496	}
497	/* "0x" / "0" prefix */
498	if (need_pfx) {
499		if (buf < end)
500			*buf = '0';
501		++buf;
502		if (spec.base == 16) {
503			if (buf < end)
504				*buf = ('X' | locase);
505			++buf;
506		}
507	}
508	/* zero or space padding */
509	if (!(spec.flags & LEFT)) {
510		char c = (spec.flags & ZEROPAD) ? '0' : ' ';
511		while (--spec.field_width >= 0) {
512			if (buf < end)
513				*buf = c;
514			++buf;
515		}
516	}
517	/* hmm even more zero padding? */
518	while (i <= --spec.precision) {
519		if (buf < end)
520			*buf = '0';
521		++buf;
522	}
523	/* actual digits of result */
524	while (--i >= 0) {
525		if (buf < end)
526			*buf = tmp[i];
527		++buf;
528	}
529	/* trailing space padding */
530	while (--spec.field_width >= 0) {
531		if (buf < end)
532			*buf = ' ';
533		++buf;
534	}
535
536	return buf;
537}
538
539static noinline_for_stack
540char *string(char *buf, char *end, const char *s, struct printf_spec spec)
541{
542	int len, i;
543
544	if ((unsigned long)s < PAGE_SIZE)
545		s = "(null)";
546
547	len = strnlen(s, spec.precision);
548
549	if (!(spec.flags & LEFT)) {
550		while (len < spec.field_width--) {
551			if (buf < end)
552				*buf = ' ';
553			++buf;
554		}
555	}
556	for (i = 0; i < len; ++i) {
557		if (buf < end)
558			*buf = *s;
559		++buf; ++s;
560	}
561	while (len < spec.field_width--) {
562		if (buf < end)
563			*buf = ' ';
564		++buf;
565	}
566
567	return buf;
568}
569
570static noinline_for_stack
571char *symbol_string(char *buf, char *end, void *ptr,
572		    struct printf_spec spec, char ext)
573{
574	unsigned long value = (unsigned long) ptr;
575#ifdef CONFIG_KALLSYMS
576	char sym[KSYM_SYMBOL_LEN];
577	if (ext != 'f' && ext != 's')
578		sprint_symbol(sym, value);
579	else
580		kallsyms_lookup(value, NULL, NULL, NULL, sym);
581
582	return string(buf, end, sym, spec);
583#else
584	spec.field_width = 2 * sizeof(void *);
585	spec.flags |= SPECIAL | SMALL | ZEROPAD;
586	spec.base = 16;
587
588	return number(buf, end, value, spec);
589#endif
590}
591
592static noinline_for_stack
593char *resource_string(char *buf, char *end, struct resource *res,
594		      struct printf_spec spec, const char *fmt)
595{
596#ifndef IO_RSRC_PRINTK_SIZE
597#define IO_RSRC_PRINTK_SIZE	6
598#endif
599
600#ifndef MEM_RSRC_PRINTK_SIZE
601#define MEM_RSRC_PRINTK_SIZE	10
602#endif
603	static const struct printf_spec io_spec = {
604		.base = 16,
605		.field_width = IO_RSRC_PRINTK_SIZE,
606		.precision = -1,
607		.flags = SPECIAL | SMALL | ZEROPAD,
608	};
609	static const struct printf_spec mem_spec = {
610		.base = 16,
611		.field_width = MEM_RSRC_PRINTK_SIZE,
612		.precision = -1,
613		.flags = SPECIAL | SMALL | ZEROPAD,
614	};
615	static const struct printf_spec bus_spec = {
616		.base = 16,
617		.field_width = 2,
618		.precision = -1,
619		.flags = SMALL | ZEROPAD,
620	};
621	static const struct printf_spec dec_spec = {
622		.base = 10,
623		.precision = -1,
624		.flags = 0,
625	};
626	static const struct printf_spec str_spec = {
627		.field_width = -1,
628		.precision = 10,
629		.flags = LEFT,
630	};
631	static const struct printf_spec flag_spec = {
632		.base = 16,
633		.precision = -1,
634		.flags = SPECIAL | SMALL,
635	};
636
637	/* 32-bit res (sizeof==4): 10 chars in dec, 10 in hex ("0x" + 8)
638	 * 64-bit res (sizeof==8): 20 chars in dec, 18 in hex ("0x" + 16) */
639#define RSRC_BUF_SIZE		((2 * sizeof(resource_size_t)) + 4)
640#define FLAG_BUF_SIZE		(2 * sizeof(res->flags))
641#define DECODED_BUF_SIZE	sizeof("[mem - 64bit pref window disabled]")
642#define RAW_BUF_SIZE		sizeof("[mem - flags 0x]")
643	char sym[max(2*RSRC_BUF_SIZE + DECODED_BUF_SIZE,
644		     2*RSRC_BUF_SIZE + FLAG_BUF_SIZE + RAW_BUF_SIZE)];
645
646	char *p = sym, *pend = sym + sizeof(sym);
647	int decode = (fmt[0] == 'R') ? 1 : 0;
648	const struct printf_spec *specp;
649
650	*p++ = '[';
651	if (res->flags & IORESOURCE_IO) {
652		p = string(p, pend, "io  ", str_spec);
653		specp = &io_spec;
654	} else if (res->flags & IORESOURCE_MEM) {
655		p = string(p, pend, "mem ", str_spec);
656		specp = &mem_spec;
657	} else if (res->flags & IORESOURCE_IRQ) {
658		p = string(p, pend, "irq ", str_spec);
659		specp = &dec_spec;
660	} else if (res->flags & IORESOURCE_DMA) {
661		p = string(p, pend, "dma ", str_spec);
662		specp = &dec_spec;
663	} else if (res->flags & IORESOURCE_BUS) {
664		p = string(p, pend, "bus ", str_spec);
665		specp = &bus_spec;
666	} else {
667		p = string(p, pend, "??? ", str_spec);
668		specp = &mem_spec;
669		decode = 0;
670	}
671	p = number(p, pend, res->start, *specp);
672	if (res->start != res->end) {
673		*p++ = '-';
674		p = number(p, pend, res->end, *specp);
675	}
676	if (decode) {
677		if (res->flags & IORESOURCE_MEM_64)
678			p = string(p, pend, " 64bit", str_spec);
679		if (res->flags & IORESOURCE_PREFETCH)
680			p = string(p, pend, " pref", str_spec);
681		if (res->flags & IORESOURCE_WINDOW)
682			p = string(p, pend, " window", str_spec);
683		if (res->flags & IORESOURCE_DISABLED)
684			p = string(p, pend, " disabled", str_spec);
685	} else {
686		p = string(p, pend, " flags ", str_spec);
687		p = number(p, pend, res->flags, flag_spec);
688	}
689	*p++ = ']';
690	*p = '\0';
691
692	return string(buf, end, sym, spec);
693}
694
695static noinline_for_stack
696char *mac_address_string(char *buf, char *end, u8 *addr,
697			 struct printf_spec spec, const char *fmt)
698{
699	char mac_addr[sizeof("xx:xx:xx:xx:xx:xx")];
700	char *p = mac_addr;
701	int i;
702	char separator;
703
704	if (fmt[1] == 'F') {		/* FDDI canonical format */
705		separator = '-';
706	} else {
707		separator = ':';
708	}
709
710	for (i = 0; i < 6; i++) {
711		p = pack_hex_byte(p, addr[i]);
712		if (fmt[0] == 'M' && i != 5)
713			*p++ = separator;
714	}
715	*p = '\0';
716
717	return string(buf, end, mac_addr, spec);
718}
719
720static noinline_for_stack
721char *ip4_string(char *p, const u8 *addr, const char *fmt)
722{
723	int i;
724	bool leading_zeros = (fmt[0] == 'i');
725	int index;
726	int step;
727
728	switch (fmt[2]) {
729	case 'h':
730#ifdef __BIG_ENDIAN
731		index = 0;
732		step = 1;
733#else
734		index = 3;
735		step = -1;
736#endif
737		break;
738	case 'l':
739		index = 3;
740		step = -1;
741		break;
742	case 'n':
743	case 'b':
744	default:
745		index = 0;
746		step = 1;
747		break;
748	}
749	for (i = 0; i < 4; i++) {
750		char temp[3];	/* hold each IP quad in reverse order */
751		int digits = put_dec_trunc(temp, addr[index]) - temp;
752		if (leading_zeros) {
753			if (digits < 3)
754				*p++ = '0';
755			if (digits < 2)
756				*p++ = '0';
757		}
758		/* reverse the digits in the quad */
759		while (digits--)
760			*p++ = temp[digits];
761		if (i < 3)
762			*p++ = '.';
763		index += step;
764	}
765	*p = '\0';
766
767	return p;
768}
769
770static noinline_for_stack
771char *ip6_compressed_string(char *p, const char *addr)
772{
773	int i, j, range;
774	unsigned char zerolength[8];
775	int longest = 1;
776	int colonpos = -1;
777	u16 word;
778	u8 hi, lo;
779	bool needcolon = false;
780	bool useIPv4;
781	struct in6_addr in6;
782
783	memcpy(&in6, addr, sizeof(struct in6_addr));
784
785	useIPv4 = ipv6_addr_v4mapped(&in6) || ipv6_addr_is_isatap(&in6);
786
787	memset(zerolength, 0, sizeof(zerolength));
788
789	if (useIPv4)
790		range = 6;
791	else
792		range = 8;
793
794	/* find position of longest 0 run */
795	for (i = 0; i < range; i++) {
796		for (j = i; j < range; j++) {
797			if (in6.s6_addr16[j] != 0)
798				break;
799			zerolength[i]++;
800		}
801	}
802	for (i = 0; i < range; i++) {
803		if (zerolength[i] > longest) {
804			longest = zerolength[i];
805			colonpos = i;
806		}
807	}
808
809	/* emit address */
810	for (i = 0; i < range; i++) {
811		if (i == colonpos) {
812			if (needcolon || i == 0)
813				*p++ = ':';
814			*p++ = ':';
815			needcolon = false;
816			i += longest - 1;
817			continue;
818		}
819		if (needcolon) {
820			*p++ = ':';
821			needcolon = false;
822		}
823		/* hex u16 without leading 0s */
824		word = ntohs(in6.s6_addr16[i]);
825		hi = word >> 8;
826		lo = word & 0xff;
827		if (hi) {
828			if (hi > 0x0f)
829				p = pack_hex_byte(p, hi);
830			else
831				*p++ = hex_asc_lo(hi);
832			p = pack_hex_byte(p, lo);
833		}
834		else if (lo > 0x0f)
835			p = pack_hex_byte(p, lo);
836		else
837			*p++ = hex_asc_lo(lo);
838		needcolon = true;
839	}
840
841	if (useIPv4) {
842		if (needcolon)
843			*p++ = ':';
844		p = ip4_string(p, &in6.s6_addr[12], "I4");
845	}
846	*p = '\0';
847
848	return p;
849}
850
851static noinline_for_stack
852char *ip6_string(char *p, const char *addr, const char *fmt)
853{
854	int i;
855
856	for (i = 0; i < 8; i++) {
857		p = pack_hex_byte(p, *addr++);
858		p = pack_hex_byte(p, *addr++);
859		if (fmt[0] == 'I' && i != 7)
860			*p++ = ':';
861	}
862	*p = '\0';
863
864	return p;
865}
866
867static noinline_for_stack
868char *ip6_addr_string(char *buf, char *end, const u8 *addr,
869		      struct printf_spec spec, const char *fmt)
870{
871	char ip6_addr[sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255")];
872
873	if (fmt[0] == 'I' && fmt[2] == 'c')
874		ip6_compressed_string(ip6_addr, addr);
875	else
876		ip6_string(ip6_addr, addr, fmt);
877
878	return string(buf, end, ip6_addr, spec);
879}
880
881static noinline_for_stack
882char *ip4_addr_string(char *buf, char *end, const u8 *addr,
883		      struct printf_spec spec, const char *fmt)
884{
885	char ip4_addr[sizeof("255.255.255.255")];
886
887	ip4_string(ip4_addr, addr, fmt);
888
889	return string(buf, end, ip4_addr, spec);
890}
891
892static noinline_for_stack
893char *uuid_string(char *buf, char *end, const u8 *addr,
894		  struct printf_spec spec, const char *fmt)
895{
896	char uuid[sizeof("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")];
897	char *p = uuid;
898	int i;
899	static const u8 be[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
900	static const u8 le[16] = {3,2,1,0,5,4,7,6,8,9,10,11,12,13,14,15};
901	const u8 *index = be;
902	bool uc = false;
903
904	switch (*(++fmt)) {
905	case 'L':
906		uc = true;		/* fall-through */
907	case 'l':
908		index = le;
909		break;
910	case 'B':
911		uc = true;
912		break;
913	}
914
915	for (i = 0; i < 16; i++) {
916		p = pack_hex_byte(p, addr[index[i]]);
917		switch (i) {
918		case 3:
919		case 5:
920		case 7:
921		case 9:
922			*p++ = '-';
923			break;
924		}
925	}
926
927	*p = 0;
928
929	if (uc) {
930		p = uuid;
931		do {
932			*p = toupper(*p);
933		} while (*(++p));
934	}
935
936	return string(buf, end, uuid, spec);
937}
938
939static noinline_for_stack
940char *pointer(const char *fmt, char *buf, char *end, void *ptr,
941	      struct printf_spec spec)
942{
943	if (!ptr)
944		return string(buf, end, "(null)", spec);
945
946	switch (*fmt) {
947	case 'F':
948	case 'f':
949		ptr = dereference_function_descriptor(ptr);
950		/* Fallthrough */
951	case 'S':
952	case 's':
953		return symbol_string(buf, end, ptr, spec, *fmt);
954	case 'R':
955	case 'r':
956		return resource_string(buf, end, ptr, spec, fmt);
957	case 'M':			/* Colon separated: 00:01:02:03:04:05 */
958	case 'm':			/* Contiguous: 000102030405 */
959					/* [mM]F (FDDI, bit reversed) */
960		return mac_address_string(buf, end, ptr, spec, fmt);
961	case 'I':			/* Formatted IP supported
962					 * 4:	1.2.3.4
963					 * 6:	0001:0203:...:0708
964					 * 6c:	1::708 or 1::1.2.3.4
965					 */
966	case 'i':			/* Contiguous:
967					 * 4:	001.002.003.004
968					 * 6:   000102...0f
969					 */
970		switch (fmt[1]) {
971		case '6':
972			return ip6_addr_string(buf, end, ptr, spec, fmt);
973		case '4':
974			return ip4_addr_string(buf, end, ptr, spec, fmt);
975		}
976		break;
977	case 'U':
978		return uuid_string(buf, end, ptr, spec, fmt);
979	case 'V':
980		return buf + vsnprintf(buf, end - buf,
981				       ((struct va_format *)ptr)->fmt,
982				       *(((struct va_format *)ptr)->va));
983	}
984	spec.flags |= SMALL;
985	if (spec.field_width == -1) {
986		spec.field_width = 2*sizeof(void *);
987		spec.flags |= ZEROPAD;
988	}
989	spec.base = 16;
990
991	return number(buf, end, (unsigned long) ptr, spec);
992}
993
994/*
995 * Helper function to decode printf style format.
996 * Each call decode a token from the format and return the
997 * number of characters read (or likely the delta where it wants
998 * to go on the next call).
999 * The decoded token is returned through the parameters
1000 *
1001 * 'h', 'l', or 'L' for integer fields
1002 * 'z' support added 23/7/1999 S.H.
1003 * 'z' changed to 'Z' --davidm 1/25/99
1004 * 't' added for ptrdiff_t
1005 *
1006 * @fmt: the format string
1007 * @type of the token returned
1008 * @flags: various flags such as +, -, # tokens..
1009 * @field_width: overwritten width
1010 * @base: base of the number (octal, hex, ...)
1011 * @precision: precision of a number
1012 * @qualifier: qualifier of a number (long, size_t, ...)
1013 */
1014static noinline_for_stack
1015int format_decode(const char *fmt, struct printf_spec *spec)
1016{
1017	const char *start = fmt;
1018
1019	/* we finished early by reading the field width */
1020	if (spec->type == FORMAT_TYPE_WIDTH) {
1021		if (spec->field_width < 0) {
1022			spec->field_width = -spec->field_width;
1023			spec->flags |= LEFT;
1024		}
1025		spec->type = FORMAT_TYPE_NONE;
1026		goto precision;
1027	}
1028
1029	/* we finished early by reading the precision */
1030	if (spec->type == FORMAT_TYPE_PRECISION) {
1031		if (spec->precision < 0)
1032			spec->precision = 0;
1033
1034		spec->type = FORMAT_TYPE_NONE;
1035		goto qualifier;
1036	}
1037
1038	/* By default */
1039	spec->type = FORMAT_TYPE_NONE;
1040
1041	for (; *fmt ; ++fmt) {
1042		if (*fmt == '%')
1043			break;
1044	}
1045
1046	/* Return the current non-format string */
1047	if (fmt != start || !*fmt)
1048		return fmt - start;
1049
1050	/* Process flags */
1051	spec->flags = 0;
1052
1053	while (1) { /* this also skips first '%' */
1054		bool found = true;
1055
1056		++fmt;
1057
1058		switch (*fmt) {
1059		case '-': spec->flags |= LEFT;    break;
1060		case '+': spec->flags |= PLUS;    break;
1061		case ' ': spec->flags |= SPACE;   break;
1062		case '#': spec->flags |= SPECIAL; break;
1063		case '0': spec->flags |= ZEROPAD; break;
1064		default:  found = false;
1065		}
1066
1067		if (!found)
1068			break;
1069	}
1070
1071	/* get field width */
1072	spec->field_width = -1;
1073
1074	if (isdigit(*fmt))
1075		spec->field_width = skip_atoi(&fmt);
1076	else if (*fmt == '*') {
1077		/* it's the next argument */
1078		spec->type = FORMAT_TYPE_WIDTH;
1079		return ++fmt - start;
1080	}
1081
1082precision:
1083	/* get the precision */
1084	spec->precision = -1;
1085	if (*fmt == '.') {
1086		++fmt;
1087		if (isdigit(*fmt)) {
1088			spec->precision = skip_atoi(&fmt);
1089			if (spec->precision < 0)
1090				spec->precision = 0;
1091		} else if (*fmt == '*') {
1092			/* it's the next argument */
1093			spec->type = FORMAT_TYPE_PRECISION;
1094			return ++fmt - start;
1095		}
1096	}
1097
1098qualifier:
1099	/* get the conversion qualifier */
1100	spec->qualifier = -1;
1101	if (*fmt == 'h' || TOLOWER(*fmt) == 'l' ||
1102	    TOLOWER(*fmt) == 'z' || *fmt == 't') {
1103		spec->qualifier = *fmt++;
1104		if (unlikely(spec->qualifier == *fmt)) {
1105			if (spec->qualifier == 'l') {
1106				spec->qualifier = 'L';
1107				++fmt;
1108			} else if (spec->qualifier == 'h') {
1109				spec->qualifier = 'H';
1110				++fmt;
1111			}
1112		}
1113	}
1114
1115	/* default base */
1116	spec->base = 10;
1117	switch (*fmt) {
1118	case 'c':
1119		spec->type = FORMAT_TYPE_CHAR;
1120		return ++fmt - start;
1121
1122	case 's':
1123		spec->type = FORMAT_TYPE_STR;
1124		return ++fmt - start;
1125
1126	case 'p':
1127		spec->type = FORMAT_TYPE_PTR;
1128		return fmt - start;
1129		/* skip alnum */
1130
1131	case 'n':
1132		spec->type = FORMAT_TYPE_NRCHARS;
1133		return ++fmt - start;
1134
1135	case '%':
1136		spec->type = FORMAT_TYPE_PERCENT_CHAR;
1137		return ++fmt - start;
1138
1139	/* integer number formats - set up the flags and "break" */
1140	case 'o':
1141		spec->base = 8;
1142		break;
1143
1144	case 'x':
1145		spec->flags |= SMALL;
1146
1147	case 'X':
1148		spec->base = 16;
1149		break;
1150
1151	case 'd':
1152	case 'i':
1153		spec->flags |= SIGN;
1154	case 'u':
1155		break;
1156
1157	default:
1158		spec->type = FORMAT_TYPE_INVALID;
1159		return fmt - start;
1160	}
1161
1162	if (spec->qualifier == 'L')
1163		spec->type = FORMAT_TYPE_LONG_LONG;
1164	else if (spec->qualifier == 'l') {
1165		if (spec->flags & SIGN)
1166			spec->type = FORMAT_TYPE_LONG;
1167		else
1168			spec->type = FORMAT_TYPE_ULONG;
1169	} else if (TOLOWER(spec->qualifier) == 'z') {
1170		spec->type = FORMAT_TYPE_SIZE_T;
1171	} else if (spec->qualifier == 't') {
1172		spec->type = FORMAT_TYPE_PTRDIFF;
1173	} else if (spec->qualifier == 'H') {
1174		if (spec->flags & SIGN)
1175			spec->type = FORMAT_TYPE_BYTE;
1176		else
1177			spec->type = FORMAT_TYPE_UBYTE;
1178	} else if (spec->qualifier == 'h') {
1179		if (spec->flags & SIGN)
1180			spec->type = FORMAT_TYPE_SHORT;
1181		else
1182			spec->type = FORMAT_TYPE_USHORT;
1183	} else {
1184		if (spec->flags & SIGN)
1185			spec->type = FORMAT_TYPE_INT;
1186		else
1187			spec->type = FORMAT_TYPE_UINT;
1188	}
1189
1190	return ++fmt - start;
1191}
1192
1193/**
1194 * vsnprintf - Format a string and place it in a buffer
1195 * @buf: The buffer to place the result into
1196 * @size: The size of the buffer, including the trailing null space
1197 * @fmt: The format string to use
1198 * @args: Arguments for the format string
1199 *
1200 * This function follows C99 vsnprintf, but has some extensions:
1201 * %pS output the name of a text symbol with offset
1202 * %ps output the name of a text symbol without offset
1203 * %pF output the name of a function pointer with its offset
1204 * %pf output the name of a function pointer without its offset
1205 * %pR output the address range in a struct resource with decoded flags
1206 * %pr output the address range in a struct resource with raw flags
1207 * %pM output a 6-byte MAC address with colons
1208 * %pm output a 6-byte MAC address without colons
1209 * %pI4 print an IPv4 address without leading zeros
1210 * %pi4 print an IPv4 address with leading zeros
1211 * %pI6 print an IPv6 address with colons
1212 * %pi6 print an IPv6 address without colons
1213 * %pI6c print an IPv6 address as specified by
1214 *   http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-00
1215 * %pU[bBlL] print a UUID/GUID in big or little endian using lower or upper
1216 *   case.
1217 * %n is ignored
1218 *
1219 * The return value is the number of characters which would
1220 * be generated for the given input, excluding the trailing
1221 * '\0', as per ISO C99. If you want to have the exact
1222 * number of characters written into @buf as return value
1223 * (not including the trailing '\0'), use vscnprintf(). If the
1224 * return is greater than or equal to @size, the resulting
1225 * string is truncated.
1226 *
1227 * Call this function if you are already dealing with a va_list.
1228 * You probably want snprintf() instead.
1229 */
1230int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
1231{
1232	unsigned long long num;
1233	char *str, *end;
1234	struct printf_spec spec = {0};
1235
1236	/* Reject out-of-range values early.  Large positive sizes are
1237	   used for unknown buffer sizes. */
1238	if (WARN_ON_ONCE((int) size < 0))
1239		return 0;
1240
1241	str = buf;
1242	end = buf + size;
1243
1244	/* Make sure end is always >= buf */
1245	if (end < buf) {
1246		end = ((void *)-1);
1247		size = end - buf;
1248	}
1249
1250	while (*fmt) {
1251		const char *old_fmt = fmt;
1252		int read = format_decode(fmt, &spec);
1253
1254		fmt += read;
1255
1256		switch (spec.type) {
1257		case FORMAT_TYPE_NONE: {
1258			int copy = read;
1259			if (str < end) {
1260				if (copy > end - str)
1261					copy = end - str;
1262				memcpy(str, old_fmt, copy);
1263			}
1264			str += read;
1265			break;
1266		}
1267
1268		case FORMAT_TYPE_WIDTH:
1269			spec.field_width = va_arg(args, int);
1270			break;
1271
1272		case FORMAT_TYPE_PRECISION:
1273			spec.precision = va_arg(args, int);
1274			break;
1275
1276		case FORMAT_TYPE_CHAR: {
1277			char c;
1278
1279			if (!(spec.flags & LEFT)) {
1280				while (--spec.field_width > 0) {
1281					if (str < end)
1282						*str = ' ';
1283					++str;
1284
1285				}
1286			}
1287			c = (unsigned char) va_arg(args, int);
1288			if (str < end)
1289				*str = c;
1290			++str;
1291			while (--spec.field_width > 0) {
1292				if (str < end)
1293					*str = ' ';
1294				++str;
1295			}
1296			break;
1297		}
1298
1299		case FORMAT_TYPE_STR:
1300			str = string(str, end, va_arg(args, char *), spec);
1301			break;
1302
1303		case FORMAT_TYPE_PTR:
1304			str = pointer(fmt+1, str, end, va_arg(args, void *),
1305				      spec);
1306			while (isalnum(*fmt))
1307				fmt++;
1308			break;
1309
1310		case FORMAT_TYPE_PERCENT_CHAR:
1311			if (str < end)
1312				*str = '%';
1313			++str;
1314			break;
1315
1316		case FORMAT_TYPE_INVALID:
1317			if (str < end)
1318				*str = '%';
1319			++str;
1320			break;
1321
1322		case FORMAT_TYPE_NRCHARS: {
1323			u8 qualifier = spec.qualifier;
1324
1325			if (qualifier == 'l') {
1326				long *ip = va_arg(args, long *);
1327				*ip = (str - buf);
1328			} else if (TOLOWER(qualifier) == 'z') {
1329				size_t *ip = va_arg(args, size_t *);
1330				*ip = (str - buf);
1331			} else {
1332				int *ip = va_arg(args, int *);
1333				*ip = (str - buf);
1334			}
1335			break;
1336		}
1337
1338		default:
1339			switch (spec.type) {
1340			case FORMAT_TYPE_LONG_LONG:
1341				num = va_arg(args, long long);
1342				break;
1343			case FORMAT_TYPE_ULONG:
1344				num = va_arg(args, unsigned long);
1345				break;
1346			case FORMAT_TYPE_LONG:
1347				num = va_arg(args, long);
1348				break;
1349			case FORMAT_TYPE_SIZE_T:
1350				num = va_arg(args, size_t);
1351				break;
1352			case FORMAT_TYPE_PTRDIFF:
1353				num = va_arg(args, ptrdiff_t);
1354				break;
1355			case FORMAT_TYPE_UBYTE:
1356				num = (unsigned char) va_arg(args, int);
1357				break;
1358			case FORMAT_TYPE_BYTE:
1359				num = (signed char) va_arg(args, int);
1360				break;
1361			case FORMAT_TYPE_USHORT:
1362				num = (unsigned short) va_arg(args, int);
1363				break;
1364			case FORMAT_TYPE_SHORT:
1365				num = (short) va_arg(args, int);
1366				break;
1367			case FORMAT_TYPE_INT:
1368				num = (int) va_arg(args, int);
1369				break;
1370			default:
1371				num = va_arg(args, unsigned int);
1372			}
1373
1374			str = number(str, end, num, spec);
1375		}
1376	}
1377
1378	if (size > 0) {
1379		if (str < end)
1380			*str = '\0';
1381		else
1382			end[-1] = '\0';
1383	}
1384
1385	/* the trailing null byte doesn't count towards the total */
1386	return str-buf;
1387
1388}
1389EXPORT_SYMBOL(vsnprintf);
1390
1391/**
1392 * vscnprintf - Format a string and place it in a buffer
1393 * @buf: The buffer to place the result into
1394 * @size: The size of the buffer, including the trailing null space
1395 * @fmt: The format string to use
1396 * @args: Arguments for the format string
1397 *
1398 * The return value is the number of characters which have been written into
1399 * the @buf not including the trailing '\0'. If @size is <= 0 the function
1400 * returns 0.
1401 *
1402 * Call this function if you are already dealing with a va_list.
1403 * You probably want scnprintf() instead.
1404 *
1405 * See the vsnprintf() documentation for format string extensions over C99.
1406 */
1407int vscnprintf(char *buf, size_t size, const char *fmt, va_list args)
1408{
1409	int i;
1410
1411	i = vsnprintf(buf, size, fmt, args);
1412
1413	return (i >= size) ? (size - 1) : i;
1414}
1415EXPORT_SYMBOL(vscnprintf);
1416
1417/**
1418 * snprintf - Format a string and place it in a buffer
1419 * @buf: The buffer to place the result into
1420 * @size: The size of the buffer, including the trailing null space
1421 * @fmt: The format string to use
1422 * @...: Arguments for the format string
1423 *
1424 * The return value is the number of characters which would be
1425 * generated for the given input, excluding the trailing null,
1426 * as per ISO C99.  If the return is greater than or equal to
1427 * @size, the resulting string is truncated.
1428 *
1429 * See the vsnprintf() documentation for format string extensions over C99.
1430 */
1431int snprintf(char *buf, size_t size, const char *fmt, ...)
1432{
1433	va_list args;
1434	int i;
1435
1436	va_start(args, fmt);
1437	i = vsnprintf(buf, size, fmt, args);
1438	va_end(args);
1439
1440	return i;
1441}
1442EXPORT_SYMBOL(snprintf);
1443
1444/**
1445 * scnprintf - Format a string and place it in a buffer
1446 * @buf: The buffer to place the result into
1447 * @size: The size of the buffer, including the trailing null space
1448 * @fmt: The format string to use
1449 * @...: Arguments for the format string
1450 *
1451 * The return value is the number of characters written into @buf not including
1452 * the trailing '\0'. If @size is <= 0 the function returns 0.
1453 */
1454
1455int scnprintf(char *buf, size_t size, const char *fmt, ...)
1456{
1457	va_list args;
1458	int i;
1459
1460	va_start(args, fmt);
1461	i = vsnprintf(buf, size, fmt, args);
1462	va_end(args);
1463
1464	return (i >= size) ? (size - 1) : i;
1465}
1466EXPORT_SYMBOL(scnprintf);
1467
1468/**
1469 * vsprintf - Format a string and place it in a buffer
1470 * @buf: The buffer to place the result into
1471 * @fmt: The format string to use
1472 * @args: Arguments for the format string
1473 *
1474 * The function returns the number of characters written
1475 * into @buf. Use vsnprintf() or vscnprintf() in order to avoid
1476 * buffer overflows.
1477 *
1478 * Call this function if you are already dealing with a va_list.
1479 * You probably want sprintf() instead.
1480 *
1481 * See the vsnprintf() documentation for format string extensions over C99.
1482 */
1483int vsprintf(char *buf, const char *fmt, va_list args)
1484{
1485	return vsnprintf(buf, INT_MAX, fmt, args);
1486}
1487EXPORT_SYMBOL(vsprintf);
1488
1489/**
1490 * sprintf - Format a string and place it in a buffer
1491 * @buf: The buffer to place the result into
1492 * @fmt: The format string to use
1493 * @...: Arguments for the format string
1494 *
1495 * The function returns the number of characters written
1496 * into @buf. Use snprintf() or scnprintf() in order to avoid
1497 * buffer overflows.
1498 *
1499 * See the vsnprintf() documentation for format string extensions over C99.
1500 */
1501int sprintf(char *buf, const char *fmt, ...)
1502{
1503	va_list args;
1504	int i;
1505
1506	va_start(args, fmt);
1507	i = vsnprintf(buf, INT_MAX, fmt, args);
1508	va_end(args);
1509
1510	return i;
1511}
1512EXPORT_SYMBOL(sprintf);
1513
1514#ifdef CONFIG_BINARY_PRINTF
1515/*
1516 * bprintf service:
1517 * vbin_printf() - VA arguments to binary data
1518 * bstr_printf() - Binary data to text string
1519 */
1520
1521/**
1522 * vbin_printf - Parse a format string and place args' binary value in a buffer
1523 * @bin_buf: The buffer to place args' binary value
1524 * @size: The size of the buffer(by words(32bits), not characters)
1525 * @fmt: The format string to use
1526 * @args: Arguments for the format string
1527 *
1528 * The format follows C99 vsnprintf, except %n is ignored, and its argument
1529 * is skiped.
1530 *
1531 * The return value is the number of words(32bits) which would be generated for
1532 * the given input.
1533 *
1534 * NOTE:
1535 * If the return value is greater than @size, the resulting bin_buf is NOT
1536 * valid for bstr_printf().
1537 */
1538int vbin_printf(u32 *bin_buf, size_t size, const char *fmt, va_list args)
1539{
1540	struct printf_spec spec = {0};
1541	char *str, *end;
1542
1543	str = (char *)bin_buf;
1544	end = (char *)(bin_buf + size);
1545
1546#define save_arg(type)							\
1547do {									\
1548	if (sizeof(type) == 8) {					\
1549		unsigned long long value;				\
1550		str = PTR_ALIGN(str, sizeof(u32));			\
1551		value = va_arg(args, unsigned long long);		\
1552		if (str + sizeof(type) <= end) {			\
1553			*(u32 *)str = *(u32 *)&value;			\
1554			*(u32 *)(str + 4) = *((u32 *)&value + 1);	\
1555		}							\
1556	} else {							\
1557		unsigned long value;					\
1558		str = PTR_ALIGN(str, sizeof(type));			\
1559		value = va_arg(args, int);				\
1560		if (str + sizeof(type) <= end)				\
1561			*(typeof(type) *)str = (type)value;		\
1562	}								\
1563	str += sizeof(type);						\
1564} while (0)
1565
1566	while (*fmt) {
1567		int read = format_decode(fmt, &spec);
1568
1569		fmt += read;
1570
1571		switch (spec.type) {
1572		case FORMAT_TYPE_NONE:
1573		case FORMAT_TYPE_INVALID:
1574		case FORMAT_TYPE_PERCENT_CHAR:
1575			break;
1576
1577		case FORMAT_TYPE_WIDTH:
1578		case FORMAT_TYPE_PRECISION:
1579			save_arg(int);
1580			break;
1581
1582		case FORMAT_TYPE_CHAR:
1583			save_arg(char);
1584			break;
1585
1586		case FORMAT_TYPE_STR: {
1587			const char *save_str = va_arg(args, char *);
1588			size_t len;
1589
1590			if ((unsigned long)save_str > (unsigned long)-PAGE_SIZE
1591					|| (unsigned long)save_str < PAGE_SIZE)
1592				save_str = "(null)";
1593			len = strlen(save_str) + 1;
1594			if (str + len < end)
1595				memcpy(str, save_str, len);
1596			str += len;
1597			break;
1598		}
1599
1600		case FORMAT_TYPE_PTR:
1601			save_arg(void *);
1602			/* skip all alphanumeric pointer suffixes */
1603			while (isalnum(*fmt))
1604				fmt++;
1605			break;
1606
1607		case FORMAT_TYPE_NRCHARS: {
1608			/* skip %n 's argument */
1609			u8 qualifier = spec.qualifier;
1610			void *skip_arg;
1611			if (qualifier == 'l')
1612				skip_arg = va_arg(args, long *);
1613			else if (TOLOWER(qualifier) == 'z')
1614				skip_arg = va_arg(args, size_t *);
1615			else
1616				skip_arg = va_arg(args, int *);
1617			break;
1618		}
1619
1620		default:
1621			switch (spec.type) {
1622
1623			case FORMAT_TYPE_LONG_LONG:
1624				save_arg(long long);
1625				break;
1626			case FORMAT_TYPE_ULONG:
1627			case FORMAT_TYPE_LONG:
1628				save_arg(unsigned long);
1629				break;
1630			case FORMAT_TYPE_SIZE_T:
1631				save_arg(size_t);
1632				break;
1633			case FORMAT_TYPE_PTRDIFF:
1634				save_arg(ptrdiff_t);
1635				break;
1636			case FORMAT_TYPE_UBYTE:
1637			case FORMAT_TYPE_BYTE:
1638				save_arg(char);
1639				break;
1640			case FORMAT_TYPE_USHORT:
1641			case FORMAT_TYPE_SHORT:
1642				save_arg(short);
1643				break;
1644			default:
1645				save_arg(int);
1646			}
1647		}
1648	}
1649
1650	return (u32 *)(PTR_ALIGN(str, sizeof(u32))) - bin_buf;
1651#undef save_arg
1652}
1653EXPORT_SYMBOL_GPL(vbin_printf);
1654
1655/**
1656 * bstr_printf - Format a string from binary arguments and place it in a buffer
1657 * @buf: The buffer to place the result into
1658 * @size: The size of the buffer, including the trailing null space
1659 * @fmt: The format string to use
1660 * @bin_buf: Binary arguments for the format string
1661 *
1662 * This function like C99 vsnprintf, but the difference is that vsnprintf gets
1663 * arguments from stack, and bstr_printf gets arguments from @bin_buf which is
1664 * a binary buffer that generated by vbin_printf.
1665 *
1666 * The format follows C99 vsnprintf, but has some extensions:
1667 *  see vsnprintf comment for details.
1668 *
1669 * The return value is the number of characters which would
1670 * be generated for the given input, excluding the trailing
1671 * '\0', as per ISO C99. If you want to have the exact
1672 * number of characters written into @buf as return value
1673 * (not including the trailing '\0'), use vscnprintf(). If the
1674 * return is greater than or equal to @size, the resulting
1675 * string is truncated.
1676 */
1677int bstr_printf(char *buf, size_t size, const char *fmt, const u32 *bin_buf)
1678{
1679	struct printf_spec spec = {0};
1680	char *str, *end;
1681	const char *args = (const char *)bin_buf;
1682
1683	if (WARN_ON_ONCE((int) size < 0))
1684		return 0;
1685
1686	str = buf;
1687	end = buf + size;
1688
1689#define get_arg(type)							\
1690({									\
1691	typeof(type) value;						\
1692	if (sizeof(type) == 8) {					\
1693		args = PTR_ALIGN(args, sizeof(u32));			\
1694		*(u32 *)&value = *(u32 *)args;				\
1695		*((u32 *)&value + 1) = *(u32 *)(args + 4);		\
1696	} else {							\
1697		args = PTR_ALIGN(args, sizeof(type));			\
1698		value = *(typeof(type) *)args;				\
1699	}								\
1700	args += sizeof(type);						\
1701	value;								\
1702})
1703
1704	/* Make sure end is always >= buf */
1705	if (end < buf) {
1706		end = ((void *)-1);
1707		size = end - buf;
1708	}
1709
1710	while (*fmt) {
1711		const char *old_fmt = fmt;
1712		int read = format_decode(fmt, &spec);
1713
1714		fmt += read;
1715
1716		switch (spec.type) {
1717		case FORMAT_TYPE_NONE: {
1718			int copy = read;
1719			if (str < end) {
1720				if (copy > end - str)
1721					copy = end - str;
1722				memcpy(str, old_fmt, copy);
1723			}
1724			str += read;
1725			break;
1726		}
1727
1728		case FORMAT_TYPE_WIDTH:
1729			spec.field_width = get_arg(int);
1730			break;
1731
1732		case FORMAT_TYPE_PRECISION:
1733			spec.precision = get_arg(int);
1734			break;
1735
1736		case FORMAT_TYPE_CHAR: {
1737			char c;
1738
1739			if (!(spec.flags & LEFT)) {
1740				while (--spec.field_width > 0) {
1741					if (str < end)
1742						*str = ' ';
1743					++str;
1744				}
1745			}
1746			c = (unsigned char) get_arg(char);
1747			if (str < end)
1748				*str = c;
1749			++str;
1750			while (--spec.field_width > 0) {
1751				if (str < end)
1752					*str = ' ';
1753				++str;
1754			}
1755			break;
1756		}
1757
1758		case FORMAT_TYPE_STR: {
1759			const char *str_arg = args;
1760			args += strlen(str_arg) + 1;
1761			str = string(str, end, (char *)str_arg, spec);
1762			break;
1763		}
1764
1765		case FORMAT_TYPE_PTR:
1766			str = pointer(fmt+1, str, end, get_arg(void *), spec);
1767			while (isalnum(*fmt))
1768				fmt++;
1769			break;
1770
1771		case FORMAT_TYPE_PERCENT_CHAR:
1772		case FORMAT_TYPE_INVALID:
1773			if (str < end)
1774				*str = '%';
1775			++str;
1776			break;
1777
1778		case FORMAT_TYPE_NRCHARS:
1779			/* skip */
1780			break;
1781
1782		default: {
1783			unsigned long long num;
1784
1785			switch (spec.type) {
1786
1787			case FORMAT_TYPE_LONG_LONG:
1788				num = get_arg(long long);
1789				break;
1790			case FORMAT_TYPE_ULONG:
1791			case FORMAT_TYPE_LONG:
1792				num = get_arg(unsigned long);
1793				break;
1794			case FORMAT_TYPE_SIZE_T:
1795				num = get_arg(size_t);
1796				break;
1797			case FORMAT_TYPE_PTRDIFF:
1798				num = get_arg(ptrdiff_t);
1799				break;
1800			case FORMAT_TYPE_UBYTE:
1801				num = get_arg(unsigned char);
1802				break;
1803			case FORMAT_TYPE_BYTE:
1804				num = get_arg(signed char);
1805				break;
1806			case FORMAT_TYPE_USHORT:
1807				num = get_arg(unsigned short);
1808				break;
1809			case FORMAT_TYPE_SHORT:
1810				num = get_arg(short);
1811				break;
1812			case FORMAT_TYPE_UINT:
1813				num = get_arg(unsigned int);
1814				break;
1815			default:
1816				num = get_arg(int);
1817			}
1818
1819			str = number(str, end, num, spec);
1820		} /* default: */
1821		} /* switch(spec.type) */
1822	} /* while(*fmt) */
1823
1824	if (size > 0) {
1825		if (str < end)
1826			*str = '\0';
1827		else
1828			end[-1] = '\0';
1829	}
1830
1831#undef get_arg
1832
1833	/* the trailing null byte doesn't count towards the total */
1834	return str - buf;
1835}
1836EXPORT_SYMBOL_GPL(bstr_printf);
1837
1838/**
1839 * bprintf - Parse a format string and place args' binary value in a buffer
1840 * @bin_buf: The buffer to place args' binary value
1841 * @size: The size of the buffer(by words(32bits), not characters)
1842 * @fmt: The format string to use
1843 * @...: Arguments for the format string
1844 *
1845 * The function returns the number of words(u32) written
1846 * into @bin_buf.
1847 */
1848int bprintf(u32 *bin_buf, size_t size, const char *fmt, ...)
1849{
1850	va_list args;
1851	int ret;
1852
1853	va_start(args, fmt);
1854	ret = vbin_printf(bin_buf, size, fmt, args);
1855	va_end(args);
1856
1857	return ret;
1858}
1859EXPORT_SYMBOL_GPL(bprintf);
1860
1861#endif /* CONFIG_BINARY_PRINTF */
1862
1863/**
1864 * vsscanf - Unformat a buffer into a list of arguments
1865 * @buf:	input buffer
1866 * @fmt:	format of buffer
1867 * @args:	arguments
1868 */
1869int vsscanf(const char *buf, const char *fmt, va_list args)
1870{
1871	const char *str = buf;
1872	char *next;
1873	char digit;
1874	int num = 0;
1875	u8 qualifier;
1876	u8 base;
1877	s16 field_width;
1878	bool is_sign;
1879
1880	while (*fmt && *str) {
1881		/* skip any white space in format */
1882		/* white space in format matchs any amount of
1883		 * white space, including none, in the input.
1884		 */
1885		if (isspace(*fmt)) {
1886			fmt = skip_spaces(++fmt);
1887			str = skip_spaces(str);
1888		}
1889
1890		/* anything that is not a conversion must match exactly */
1891		if (*fmt != '%' && *fmt) {
1892			if (*fmt++ != *str++)
1893				break;
1894			continue;
1895		}
1896
1897		if (!*fmt)
1898			break;
1899		++fmt;
1900
1901		/* skip this conversion.
1902		 * advance both strings to next white space
1903		 */
1904		if (*fmt == '*') {
1905			while (!isspace(*fmt) && *fmt != '%' && *fmt)
1906				fmt++;
1907			while (!isspace(*str) && *str)
1908				str++;
1909			continue;
1910		}
1911
1912		/* get field width */
1913		field_width = -1;
1914		if (isdigit(*fmt))
1915			field_width = skip_atoi(&fmt);
1916
1917		/* get conversion qualifier */
1918		qualifier = -1;
1919		if (*fmt == 'h' || TOLOWER(*fmt) == 'l' ||
1920		    TOLOWER(*fmt) == 'z') {
1921			qualifier = *fmt++;
1922			if (unlikely(qualifier == *fmt)) {
1923				if (qualifier == 'h') {
1924					qualifier = 'H';
1925					fmt++;
1926				} else if (qualifier == 'l') {
1927					qualifier = 'L';
1928					fmt++;
1929				}
1930			}
1931		}
1932
1933		if (!*fmt || !*str)
1934			break;
1935
1936		base = 10;
1937		is_sign = 0;
1938
1939		switch (*fmt++) {
1940		case 'c':
1941		{
1942			char *s = (char *)va_arg(args, char*);
1943			if (field_width == -1)
1944				field_width = 1;
1945			do {
1946				*s++ = *str++;
1947			} while (--field_width > 0 && *str);
1948			num++;
1949		}
1950		continue;
1951		case 's':
1952		{
1953			char *s = (char *)va_arg(args, char *);
1954			if (field_width == -1)
1955				field_width = SHRT_MAX;
1956			/* first, skip leading white space in buffer */
1957			str = skip_spaces(str);
1958
1959			/* now copy until next white space */
1960			while (*str && !isspace(*str) && field_width--)
1961				*s++ = *str++;
1962			*s = '\0';
1963			num++;
1964		}
1965		continue;
1966		case 'n':
1967			/* return number of characters read so far */
1968		{
1969			int *i = (int *)va_arg(args, int*);
1970			*i = str - buf;
1971		}
1972		continue;
1973		case 'o':
1974			base = 8;
1975			break;
1976		case 'x':
1977		case 'X':
1978			base = 16;
1979			break;
1980		case 'i':
1981			base = 0;
1982		case 'd':
1983			is_sign = 1;
1984		case 'u':
1985			break;
1986		case '%':
1987			/* looking for '%' in str */
1988			if (*str++ != '%')
1989				return num;
1990			continue;
1991		default:
1992			/* invalid format; stop here */
1993			return num;
1994		}
1995
1996		/* have some sort of integer conversion.
1997		 * first, skip white space in buffer.
1998		 */
1999		str = skip_spaces(str);
2000
2001		digit = *str;
2002		if (is_sign && digit == '-')
2003			digit = *(str + 1);
2004
2005		if (!digit
2006		    || (base == 16 && !isxdigit(digit))
2007		    || (base == 10 && !isdigit(digit))
2008		    || (base == 8 && (!isdigit(digit) || digit > '7'))
2009		    || (base == 0 && !isdigit(digit)))
2010			break;
2011
2012		switch (qualifier) {
2013		case 'H':	/* that's 'hh' in format */
2014			if (is_sign) {
2015				signed char *s = (signed char *)va_arg(args, signed char *);
2016				*s = (signed char)simple_strtol(str, &next, base);
2017			} else {
2018				unsigned char *s = (unsigned char *)va_arg(args, unsigned char *);
2019				*s = (unsigned char)simple_strtoul(str, &next, base);
2020			}
2021			break;
2022		case 'h':
2023			if (is_sign) {
2024				short *s = (short *)va_arg(args, short *);
2025				*s = (short)simple_strtol(str, &next, base);
2026			} else {
2027				unsigned short *s = (unsigned short *)va_arg(args, unsigned short *);
2028				*s = (unsigned short)simple_strtoul(str, &next, base);
2029			}
2030			break;
2031		case 'l':
2032			if (is_sign) {
2033				long *l = (long *)va_arg(args, long *);
2034				*l = simple_strtol(str, &next, base);
2035			} else {
2036				unsigned long *l = (unsigned long *)va_arg(args, unsigned long *);
2037				*l = simple_strtoul(str, &next, base);
2038			}
2039			break;
2040		case 'L':
2041			if (is_sign) {
2042				long long *l = (long long *)va_arg(args, long long *);
2043				*l = simple_strtoll(str, &next, base);
2044			} else {
2045				unsigned long long *l = (unsigned long long *)va_arg(args, unsigned long long *);
2046				*l = simple_strtoull(str, &next, base);
2047			}
2048			break;
2049		case 'Z':
2050		case 'z':
2051		{
2052			size_t *s = (size_t *)va_arg(args, size_t *);
2053			*s = (size_t)simple_strtoul(str, &next, base);
2054		}
2055		break;
2056		default:
2057			if (is_sign) {
2058				int *i = (int *)va_arg(args, int *);
2059				*i = (int)simple_strtol(str, &next, base);
2060			} else {
2061				unsigned int *i = (unsigned int *)va_arg(args, unsigned int*);
2062				*i = (unsigned int)simple_strtoul(str, &next, base);
2063			}
2064			break;
2065		}
2066		num++;
2067
2068		if (!next)
2069			break;
2070		str = next;
2071	}
2072
2073	/*
2074	 * Now we've come all the way through so either the input string or the
2075	 * format ended. In the former case, there can be a %n at the current
2076	 * position in the format that needs to be filled.
2077	 */
2078	if (*fmt == '%' && *(fmt + 1) == 'n') {
2079		int *p = (int *)va_arg(args, int *);
2080		*p = str - buf;
2081	}
2082
2083	return num;
2084}
2085EXPORT_SYMBOL(vsscanf);
2086
2087/**
2088 * sscanf - Unformat a buffer into a list of arguments
2089 * @buf:	input buffer
2090 * @fmt:	formatting of buffer
2091 * @...:	resulting arguments
2092 */
2093int sscanf(const char *buf, const char *fmt, ...)
2094{
2095	va_list args;
2096	int i;
2097
2098	va_start(args, fmt);
2099	i = vsscanf(buf, fmt, args);
2100	va_end(args);
2101
2102	return i;
2103}
2104EXPORT_SYMBOL(sscanf);
2105