linux/lib/vsprintf.c
<<
>>
Prefs
   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>       /* for KSYM_SYMBOL_LEN */
  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/math64.h>
  27#include <linux/uaccess.h>
  28#include <linux/ioport.h>
  29#include <linux/dcache.h>
  30#include <linux/cred.h>
  31#include <net/addrconf.h>
  32
  33#include <asm/page.h>           /* for PAGE_SIZE */
  34#include <asm/sections.h>       /* for dereference_function_descriptor() */
  35
  36#include <linux/string_helpers.h>
  37#include "kstrtox.h"
  38
  39/**
  40 * simple_strtoull - convert a string to an unsigned long long
  41 * @cp: The start of the string
  42 * @endp: A pointer to the end of the parsed string will be placed here
  43 * @base: The number base to use
  44 *
  45 * This function is obsolete. Please use kstrtoull instead.
  46 */
  47unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base)
  48{
  49        unsigned long long result;
  50        unsigned int rv;
  51
  52        cp = _parse_integer_fixup_radix(cp, &base);
  53        rv = _parse_integer(cp, base, &result);
  54        /* FIXME */
  55        cp += (rv & ~KSTRTOX_OVERFLOW);
  56
  57        if (endp)
  58                *endp = (char *)cp;
  59
  60        return result;
  61}
  62EXPORT_SYMBOL(simple_strtoull);
  63
  64/**
  65 * simple_strtoul - convert a string to an unsigned long
  66 * @cp: The start of the string
  67 * @endp: A pointer to the end of the parsed string will be placed here
  68 * @base: The number base to use
  69 *
  70 * This function is obsolete. Please use kstrtoul instead.
  71 */
  72unsigned long simple_strtoul(const char *cp, char **endp, unsigned int base)
  73{
  74        return simple_strtoull(cp, endp, base);
  75}
  76EXPORT_SYMBOL(simple_strtoul);
  77
  78/**
  79 * simple_strtol - convert a string to a signed long
  80 * @cp: The start of the string
  81 * @endp: A pointer to the end of the parsed string will be placed here
  82 * @base: The number base to use
  83 *
  84 * This function is obsolete. Please use kstrtol instead.
  85 */
  86long simple_strtol(const char *cp, char **endp, unsigned int base)
  87{
  88        if (*cp == '-')
  89                return -simple_strtoul(cp + 1, endp, base);
  90
  91        return simple_strtoul(cp, endp, base);
  92}
  93EXPORT_SYMBOL(simple_strtol);
  94
  95/**
  96 * simple_strtoll - convert a string to a signed long long
  97 * @cp: The start of the string
  98 * @endp: A pointer to the end of the parsed string will be placed here
  99 * @base: The number base to use
 100 *
 101 * This function is obsolete. Please use kstrtoll instead.
 102 */
 103long long simple_strtoll(const char *cp, char **endp, unsigned int base)
 104{
 105        if (*cp == '-')
 106                return -simple_strtoull(cp + 1, endp, base);
 107
 108        return simple_strtoull(cp, endp, base);
 109}
 110EXPORT_SYMBOL(simple_strtoll);
 111
 112static noinline_for_stack
 113int skip_atoi(const char **s)
 114{
 115        int i = 0;
 116
 117        while (isdigit(**s))
 118                i = i*10 + *((*s)++) - '0';
 119
 120        return i;
 121}
 122
 123/* Decimal conversion is by far the most typical, and is used
 124 * for /proc and /sys data. This directly impacts e.g. top performance
 125 * with many processes running. We optimize it for speed
 126 * using ideas described at <http://www.cs.uiowa.edu/~jones/bcd/divide.html>
 127 * (with permission from the author, Douglas W. Jones).
 128 */
 129
 130#if BITS_PER_LONG != 32 || BITS_PER_LONG_LONG != 64
 131/* Formats correctly any integer in [0, 999999999] */
 132static noinline_for_stack
 133char *put_dec_full9(char *buf, unsigned q)
 134{
 135        unsigned r;
 136
 137        /*
 138         * Possible ways to approx. divide by 10
 139         * (x * 0x1999999a) >> 32 x < 1073741829 (multiply must be 64-bit)
 140         * (x * 0xcccd) >> 19     x <      81920 (x < 262149 when 64-bit mul)
 141         * (x * 0x6667) >> 18     x <      43699
 142         * (x * 0x3334) >> 17     x <      16389
 143         * (x * 0x199a) >> 16     x <      16389
 144         * (x * 0x0ccd) >> 15     x <      16389
 145         * (x * 0x0667) >> 14     x <       2739
 146         * (x * 0x0334) >> 13     x <       1029
 147         * (x * 0x019a) >> 12     x <       1029
 148         * (x * 0x00cd) >> 11     x <       1029 shorter code than * 0x67 (on i386)
 149         * (x * 0x0067) >> 10     x <        179
 150         * (x * 0x0034) >>  9     x <         69 same
 151         * (x * 0x001a) >>  8     x <         69 same
 152         * (x * 0x000d) >>  7     x <         69 same, shortest code (on i386)
 153         * (x * 0x0007) >>  6     x <         19
 154         * See <http://www.cs.uiowa.edu/~jones/bcd/divide.html>
 155         */
 156        r      = (q * (uint64_t)0x1999999a) >> 32;
 157        *buf++ = (q - 10 * r) + '0'; /* 1 */
 158        q      = (r * (uint64_t)0x1999999a) >> 32;
 159        *buf++ = (r - 10 * q) + '0'; /* 2 */
 160        r      = (q * (uint64_t)0x1999999a) >> 32;
 161        *buf++ = (q - 10 * r) + '0'; /* 3 */
 162        q      = (r * (uint64_t)0x1999999a) >> 32;
 163        *buf++ = (r - 10 * q) + '0'; /* 4 */
 164        r      = (q * (uint64_t)0x1999999a) >> 32;
 165        *buf++ = (q - 10 * r) + '0'; /* 5 */
 166        /* Now value is under 10000, can avoid 64-bit multiply */
 167        q      = (r * 0x199a) >> 16;
 168        *buf++ = (r - 10 * q)  + '0'; /* 6 */
 169        r      = (q * 0xcd) >> 11;
 170        *buf++ = (q - 10 * r)  + '0'; /* 7 */
 171        q      = (r * 0xcd) >> 11;
 172        *buf++ = (r - 10 * q) + '0'; /* 8 */
 173        *buf++ = q + '0'; /* 9 */
 174        return buf;
 175}
 176#endif
 177
 178/* Similar to above but do not pad with zeros.
 179 * Code can be easily arranged to print 9 digits too, but our callers
 180 * always call put_dec_full9() instead when the number has 9 decimal digits.
 181 */
 182static noinline_for_stack
 183char *put_dec_trunc8(char *buf, unsigned r)
 184{
 185        unsigned q;
 186
 187        /* Copy of previous function's body with added early returns */
 188        while (r >= 10000) {
 189                q = r + '0';
 190                r  = (r * (uint64_t)0x1999999a) >> 32;
 191                *buf++ = q - 10*r;
 192        }
 193
 194        q      = (r * 0x199a) >> 16;    /* r <= 9999 */
 195        *buf++ = (r - 10 * q)  + '0';
 196        if (q == 0)
 197                return buf;
 198        r      = (q * 0xcd) >> 11;      /* q <= 999 */
 199        *buf++ = (q - 10 * r)  + '0';
 200        if (r == 0)
 201                return buf;
 202        q      = (r * 0xcd) >> 11;      /* r <= 99 */
 203        *buf++ = (r - 10 * q) + '0';
 204        if (q == 0)
 205                return buf;
 206        *buf++ = q + '0';                /* q <= 9 */
 207        return buf;
 208}
 209
 210/* There are two algorithms to print larger numbers.
 211 * One is generic: divide by 1000000000 and repeatedly print
 212 * groups of (up to) 9 digits. It's conceptually simple,
 213 * but requires a (unsigned long long) / 1000000000 division.
 214 *
 215 * Second algorithm splits 64-bit unsigned long long into 16-bit chunks,
 216 * manipulates them cleverly and generates groups of 4 decimal digits.
 217 * It so happens that it does NOT require long long division.
 218 *
 219 * If long is > 32 bits, division of 64-bit values is relatively easy,
 220 * and we will use the first algorithm.
 221 * If long long is > 64 bits (strange architecture with VERY large long long),
 222 * second algorithm can't be used, and we again use the first one.
 223 *
 224 * Else (if long is 32 bits and long long is 64 bits) we use second one.
 225 */
 226
 227#if BITS_PER_LONG != 32 || BITS_PER_LONG_LONG != 64
 228
 229/* First algorithm: generic */
 230
 231static
 232char *put_dec(char *buf, unsigned long long n)
 233{
 234        if (n >= 100*1000*1000) {
 235                while (n >= 1000*1000*1000)
 236                        buf = put_dec_full9(buf, do_div(n, 1000*1000*1000));
 237                if (n >= 100*1000*1000)
 238                        return put_dec_full9(buf, n);
 239        }
 240        return put_dec_trunc8(buf, n);
 241}
 242
 243#else
 244
 245/* Second algorithm: valid only for 64-bit long longs */
 246
 247/* See comment in put_dec_full9 for choice of constants */
 248static noinline_for_stack
 249void put_dec_full4(char *buf, unsigned q)
 250{
 251        unsigned r;
 252        r      = (q * 0xccd) >> 15;
 253        buf[0] = (q - 10 * r) + '0';
 254        q      = (r * 0xcd) >> 11;
 255        buf[1] = (r - 10 * q)  + '0';
 256        r      = (q * 0xcd) >> 11;
 257        buf[2] = (q - 10 * r)  + '0';
 258        buf[3] = r + '0';
 259}
 260
 261/*
 262 * Call put_dec_full4 on x % 10000, return x / 10000.
 263 * The approximation x/10000 == (x * 0x346DC5D7) >> 43
 264 * holds for all x < 1,128,869,999.  The largest value this
 265 * helper will ever be asked to convert is 1,125,520,955.
 266 * (d1 in the put_dec code, assuming n is all-ones).
 267 */
 268static
 269unsigned put_dec_helper4(char *buf, unsigned x)
 270{
 271        uint32_t q = (x * (uint64_t)0x346DC5D7) >> 43;
 272
 273        put_dec_full4(buf, x - q * 10000);
 274        return q;
 275}
 276
 277/* Based on code by Douglas W. Jones found at
 278 * <http://www.cs.uiowa.edu/~jones/bcd/decimal.html#sixtyfour>
 279 * (with permission from the author).
 280 * Performs no 64-bit division and hence should be fast on 32-bit machines.
 281 */
 282static
 283char *put_dec(char *buf, unsigned long long n)
 284{
 285        uint32_t d3, d2, d1, q, h;
 286
 287        if (n < 100*1000*1000)
 288                return put_dec_trunc8(buf, n);
 289
 290        d1  = ((uint32_t)n >> 16); /* implicit "& 0xffff" */
 291        h   = (n >> 32);
 292        d2  = (h      ) & 0xffff;
 293        d3  = (h >> 16); /* implicit "& 0xffff" */
 294
 295        q   = 656 * d3 + 7296 * d2 + 5536 * d1 + ((uint32_t)n & 0xffff);
 296        q = put_dec_helper4(buf, q);
 297
 298        q += 7671 * d3 + 9496 * d2 + 6 * d1;
 299        q = put_dec_helper4(buf+4, q);
 300
 301        q += 4749 * d3 + 42 * d2;
 302        q = put_dec_helper4(buf+8, q);
 303
 304        q += 281 * d3;
 305        buf += 12;
 306        if (q)
 307                buf = put_dec_trunc8(buf, q);
 308        else while (buf[-1] == '0')
 309                --buf;
 310
 311        return buf;
 312}
 313
 314#endif
 315
 316/*
 317 * Convert passed number to decimal string.
 318 * Returns the length of string.  On buffer overflow, returns 0.
 319 *
 320 * If speed is not important, use snprintf(). It's easy to read the code.
 321 */
 322int num_to_str(char *buf, int size, unsigned long long num)
 323{
 324        char tmp[sizeof(num) * 3];
 325        int idx, len;
 326
 327        /* put_dec() may work incorrectly for num = 0 (generate "", not "0") */
 328        if (num <= 9) {
 329                tmp[0] = '0' + num;
 330                len = 1;
 331        } else {
 332                len = put_dec(tmp, num) - tmp;
 333        }
 334
 335        if (len > size)
 336                return 0;
 337        for (idx = 0; idx < len; ++idx)
 338                buf[idx] = tmp[len - idx - 1];
 339        return len;
 340}
 341
 342#define ZEROPAD 1               /* pad with zero */
 343#define SIGN    2               /* unsigned/signed long */
 344#define PLUS    4               /* show plus */
 345#define SPACE   8               /* space if plus */
 346#define LEFT    16              /* left justified */
 347#define SMALL   32              /* use lowercase in hex (must be 32 == 0x20) */
 348#define SPECIAL 64              /* prefix hex with "0x", octal with "0" */
 349
 350enum format_type {
 351        FORMAT_TYPE_NONE, /* Just a string part */
 352        FORMAT_TYPE_WIDTH,
 353        FORMAT_TYPE_PRECISION,
 354        FORMAT_TYPE_CHAR,
 355        FORMAT_TYPE_STR,
 356        FORMAT_TYPE_PTR,
 357        FORMAT_TYPE_PERCENT_CHAR,
 358        FORMAT_TYPE_INVALID,
 359        FORMAT_TYPE_LONG_LONG,
 360        FORMAT_TYPE_ULONG,
 361        FORMAT_TYPE_LONG,
 362        FORMAT_TYPE_UBYTE,
 363        FORMAT_TYPE_BYTE,
 364        FORMAT_TYPE_USHORT,
 365        FORMAT_TYPE_SHORT,
 366        FORMAT_TYPE_UINT,
 367        FORMAT_TYPE_INT,
 368        FORMAT_TYPE_SIZE_T,
 369        FORMAT_TYPE_PTRDIFF
 370};
 371
 372struct printf_spec {
 373        u8      type;           /* format_type enum */
 374        u8      flags;          /* flags to number() */
 375        u8      base;           /* number base, 8, 10 or 16 only */
 376        u8      qualifier;      /* number qualifier, one of 'hHlLtzZ' */
 377        s16     field_width;    /* width of output field */
 378        s16     precision;      /* # of digits/chars */
 379};
 380
 381static noinline_for_stack
 382char *number(char *buf, char *end, unsigned long long num,
 383             struct printf_spec spec)
 384{
 385        /* we are called with base 8, 10 or 16, only, thus don't need "G..."  */
 386        static const char digits[16] = "0123456789ABCDEF"; /* "GHIJKLMNOPQRSTUVWXYZ"; */
 387
 388        char tmp[66];
 389        char sign;
 390        char locase;
 391        int need_pfx = ((spec.flags & SPECIAL) && spec.base != 10);
 392        int i;
 393        bool is_zero = num == 0LL;
 394
 395        /* locase = 0 or 0x20. ORing digits or letters with 'locase'
 396         * produces same digits or (maybe lowercased) letters */
 397        locase = (spec.flags & SMALL);
 398        if (spec.flags & LEFT)
 399                spec.flags &= ~ZEROPAD;
 400        sign = 0;
 401        if (spec.flags & SIGN) {
 402                if ((signed long long)num < 0) {
 403                        sign = '-';
 404                        num = -(signed long long)num;
 405                        spec.field_width--;
 406                } else if (spec.flags & PLUS) {
 407                        sign = '+';
 408                        spec.field_width--;
 409                } else if (spec.flags & SPACE) {
 410                        sign = ' ';
 411                        spec.field_width--;
 412                }
 413        }
 414        if (need_pfx) {
 415                if (spec.base == 16)
 416                        spec.field_width -= 2;
 417                else if (!is_zero)
 418                        spec.field_width--;
 419        }
 420
 421        /* generate full string in tmp[], in reverse order */
 422        i = 0;
 423        if (num < spec.base)
 424                tmp[i++] = digits[num] | locase;
 425        /* Generic code, for any base:
 426        else do {
 427                tmp[i++] = (digits[do_div(num,base)] | locase);
 428        } while (num != 0);
 429        */
 430        else if (spec.base != 10) { /* 8 or 16 */
 431                int mask = spec.base - 1;
 432                int shift = 3;
 433
 434                if (spec.base == 16)
 435                        shift = 4;
 436                do {
 437                        tmp[i++] = (digits[((unsigned char)num) & mask] | locase);
 438                        num >>= shift;
 439                } while (num);
 440        } else { /* base 10 */
 441                i = put_dec(tmp, num) - tmp;
 442        }
 443
 444        /* printing 100 using %2d gives "100", not "00" */
 445        if (i > spec.precision)
 446                spec.precision = i;
 447        /* leading space padding */
 448        spec.field_width -= spec.precision;
 449        if (!(spec.flags & (ZEROPAD+LEFT))) {
 450                while (--spec.field_width >= 0) {
 451                        if (buf < end)
 452                                *buf = ' ';
 453                        ++buf;
 454                }
 455        }
 456        /* sign */
 457        if (sign) {
 458                if (buf < end)
 459                        *buf = sign;
 460                ++buf;
 461        }
 462        /* "0x" / "0" prefix */
 463        if (need_pfx) {
 464                if (spec.base == 16 || !is_zero) {
 465                        if (buf < end)
 466                                *buf = '0';
 467                        ++buf;
 468                }
 469                if (spec.base == 16) {
 470                        if (buf < end)
 471                                *buf = ('X' | locase);
 472                        ++buf;
 473                }
 474        }
 475        /* zero or space padding */
 476        if (!(spec.flags & LEFT)) {
 477                char c = (spec.flags & ZEROPAD) ? '0' : ' ';
 478                while (--spec.field_width >= 0) {
 479                        if (buf < end)
 480                                *buf = c;
 481                        ++buf;
 482                }
 483        }
 484        /* hmm even more zero padding? */
 485        while (i <= --spec.precision) {
 486                if (buf < end)
 487                        *buf = '0';
 488                ++buf;
 489        }
 490        /* actual digits of result */
 491        while (--i >= 0) {
 492                if (buf < end)
 493                        *buf = tmp[i];
 494                ++buf;
 495        }
 496        /* trailing space padding */
 497        while (--spec.field_width >= 0) {
 498                if (buf < end)
 499                        *buf = ' ';
 500                ++buf;
 501        }
 502
 503        return buf;
 504}
 505
 506static noinline_for_stack
 507char *string(char *buf, char *end, const char *s, struct printf_spec spec)
 508{
 509        int len, i;
 510
 511        if ((unsigned long)s < PAGE_SIZE)
 512                s = "(null)";
 513
 514        len = strnlen(s, spec.precision);
 515
 516        if (!(spec.flags & LEFT)) {
 517                while (len < spec.field_width--) {
 518                        if (buf < end)
 519                                *buf = ' ';
 520                        ++buf;
 521                }
 522        }
 523        for (i = 0; i < len; ++i) {
 524                if (buf < end)
 525                        *buf = *s;
 526                ++buf; ++s;
 527        }
 528        while (len < spec.field_width--) {
 529                if (buf < end)
 530                        *buf = ' ';
 531                ++buf;
 532        }
 533
 534        return buf;
 535}
 536
 537static void widen(char *buf, char *end, unsigned len, unsigned spaces)
 538{
 539        size_t size;
 540        if (buf >= end) /* nowhere to put anything */
 541                return;
 542        size = end - buf;
 543        if (size <= spaces) {
 544                memset(buf, ' ', size);
 545                return;
 546        }
 547        if (len) {
 548                if (len > size - spaces)
 549                        len = size - spaces;
 550                memmove(buf + spaces, buf, len);
 551        }
 552        memset(buf, ' ', spaces);
 553}
 554
 555static noinline_for_stack
 556char *dentry_name(char *buf, char *end, const struct dentry *d, struct printf_spec spec,
 557                  const char *fmt)
 558{
 559        const char *array[4], *s;
 560        const struct dentry *p;
 561        int depth;
 562        int i, n;
 563
 564        switch (fmt[1]) {
 565                case '2': case '3': case '4':
 566                        depth = fmt[1] - '0';
 567                        break;
 568                default:
 569                        depth = 1;
 570        }
 571
 572        rcu_read_lock();
 573        for (i = 0; i < depth; i++, d = p) {
 574                p = ACCESS_ONCE(d->d_parent);
 575                array[i] = ACCESS_ONCE(d->d_name.name);
 576                if (p == d) {
 577                        if (i)
 578                                array[i] = "";
 579                        i++;
 580                        break;
 581                }
 582        }
 583        s = array[--i];
 584        for (n = 0; n != spec.precision; n++, buf++) {
 585                char c = *s++;
 586                if (!c) {
 587                        if (!i)
 588                                break;
 589                        c = '/';
 590                        s = array[--i];
 591                }
 592                if (buf < end)
 593                        *buf = c;
 594        }
 595        rcu_read_unlock();
 596        if (n < spec.field_width) {
 597                /* we want to pad the sucker */
 598                unsigned spaces = spec.field_width - n;
 599                if (!(spec.flags & LEFT)) {
 600                        widen(buf - n, end, n, spaces);
 601                        return buf + spaces;
 602                }
 603                while (spaces--) {
 604                        if (buf < end)
 605                                *buf = ' ';
 606                        ++buf;
 607                }
 608        }
 609        return buf;
 610}
 611
 612static noinline_for_stack
 613char *symbol_string(char *buf, char *end, void *ptr,
 614                    struct printf_spec spec, const char *fmt)
 615{
 616        unsigned long value;
 617#ifdef CONFIG_KALLSYMS
 618        char sym[KSYM_SYMBOL_LEN];
 619#endif
 620
 621        if (fmt[1] == 'R')
 622                ptr = __builtin_extract_return_addr(ptr);
 623        value = (unsigned long)ptr;
 624
 625#ifdef CONFIG_KALLSYMS
 626        if (*fmt == 'B')
 627                sprint_backtrace(sym, value);
 628        else if (*fmt != 'f' && *fmt != 's')
 629                sprint_symbol(sym, value);
 630        else
 631                sprint_symbol_no_offset(sym, value);
 632
 633        return string(buf, end, sym, spec);
 634#else
 635        spec.field_width = 2 * sizeof(void *);
 636        spec.flags |= SPECIAL | SMALL | ZEROPAD;
 637        spec.base = 16;
 638
 639        return number(buf, end, value, spec);
 640#endif
 641}
 642
 643static noinline_for_stack
 644char *resource_string(char *buf, char *end, struct resource *res,
 645                      struct printf_spec spec, const char *fmt)
 646{
 647#ifndef IO_RSRC_PRINTK_SIZE
 648#define IO_RSRC_PRINTK_SIZE     6
 649#endif
 650
 651#ifndef MEM_RSRC_PRINTK_SIZE
 652#define MEM_RSRC_PRINTK_SIZE    10
 653#endif
 654        static const struct printf_spec io_spec = {
 655                .base = 16,
 656                .field_width = IO_RSRC_PRINTK_SIZE,
 657                .precision = -1,
 658                .flags = SPECIAL | SMALL | ZEROPAD,
 659        };
 660        static const struct printf_spec mem_spec = {
 661                .base = 16,
 662                .field_width = MEM_RSRC_PRINTK_SIZE,
 663                .precision = -1,
 664                .flags = SPECIAL | SMALL | ZEROPAD,
 665        };
 666        static const struct printf_spec bus_spec = {
 667                .base = 16,
 668                .field_width = 2,
 669                .precision = -1,
 670                .flags = SMALL | ZEROPAD,
 671        };
 672        static const struct printf_spec dec_spec = {
 673                .base = 10,
 674                .precision = -1,
 675                .flags = 0,
 676        };
 677        static const struct printf_spec str_spec = {
 678                .field_width = -1,
 679                .precision = 10,
 680                .flags = LEFT,
 681        };
 682        static const struct printf_spec flag_spec = {
 683                .base = 16,
 684                .precision = -1,
 685                .flags = SPECIAL | SMALL,
 686        };
 687
 688        /* 32-bit res (sizeof==4): 10 chars in dec, 10 in hex ("0x" + 8)
 689         * 64-bit res (sizeof==8): 20 chars in dec, 18 in hex ("0x" + 16) */
 690#define RSRC_BUF_SIZE           ((2 * sizeof(resource_size_t)) + 4)
 691#define FLAG_BUF_SIZE           (2 * sizeof(res->flags))
 692#define DECODED_BUF_SIZE        sizeof("[mem - 64bit pref window disabled]")
 693#define RAW_BUF_SIZE            sizeof("[mem - flags 0x]")
 694        char sym[max(2*RSRC_BUF_SIZE + DECODED_BUF_SIZE,
 695                     2*RSRC_BUF_SIZE + FLAG_BUF_SIZE + RAW_BUF_SIZE)];
 696
 697        char *p = sym, *pend = sym + sizeof(sym);
 698        int decode = (fmt[0] == 'R') ? 1 : 0;
 699        const struct printf_spec *specp;
 700
 701        *p++ = '[';
 702        if (res->flags & IORESOURCE_IO) {
 703                p = string(p, pend, "io  ", str_spec);
 704                specp = &io_spec;
 705        } else if (res->flags & IORESOURCE_MEM) {
 706                p = string(p, pend, "mem ", str_spec);
 707                specp = &mem_spec;
 708        } else if (res->flags & IORESOURCE_IRQ) {
 709                p = string(p, pend, "irq ", str_spec);
 710                specp = &dec_spec;
 711        } else if (res->flags & IORESOURCE_DMA) {
 712                p = string(p, pend, "dma ", str_spec);
 713                specp = &dec_spec;
 714        } else if (res->flags & IORESOURCE_BUS) {
 715                p = string(p, pend, "bus ", str_spec);
 716                specp = &bus_spec;
 717        } else {
 718                p = string(p, pend, "??? ", str_spec);
 719                specp = &mem_spec;
 720                decode = 0;
 721        }
 722        if (decode && res->flags & IORESOURCE_UNSET) {
 723                p = string(p, pend, "size ", str_spec);
 724                p = number(p, pend, resource_size(res), *specp);
 725        } else {
 726                p = number(p, pend, res->start, *specp);
 727                if (res->start != res->end) {
 728                        *p++ = '-';
 729                        p = number(p, pend, res->end, *specp);
 730                }
 731        }
 732        if (decode) {
 733                if (res->flags & IORESOURCE_MEM_64)
 734                        p = string(p, pend, " 64bit", str_spec);
 735                if (res->flags & IORESOURCE_PREFETCH)
 736                        p = string(p, pend, " pref", str_spec);
 737                if (res->flags & IORESOURCE_WINDOW)
 738                        p = string(p, pend, " window", str_spec);
 739                if (res->flags & IORESOURCE_DISABLED)
 740                        p = string(p, pend, " disabled", str_spec);
 741        } else {
 742                p = string(p, pend, " flags ", str_spec);
 743                p = number(p, pend, res->flags, flag_spec);
 744        }
 745        *p++ = ']';
 746        *p = '\0';
 747
 748        return string(buf, end, sym, spec);
 749}
 750
 751static noinline_for_stack
 752char *hex_string(char *buf, char *end, u8 *addr, struct printf_spec spec,
 753                 const char *fmt)
 754{
 755        int i, len = 1;         /* if we pass '%ph[CDN]', field width remains
 756                                   negative value, fallback to the default */
 757        char separator;
 758
 759        if (spec.field_width == 0)
 760                /* nothing to print */
 761                return buf;
 762
 763        if (ZERO_OR_NULL_PTR(addr))
 764                /* NULL pointer */
 765                return string(buf, end, NULL, spec);
 766
 767        switch (fmt[1]) {
 768        case 'C':
 769                separator = ':';
 770                break;
 771        case 'D':
 772                separator = '-';
 773                break;
 774        case 'N':
 775                separator = 0;
 776                break;
 777        default:
 778                separator = ' ';
 779                break;
 780        }
 781
 782        if (spec.field_width > 0)
 783                len = min_t(int, spec.field_width, 64);
 784
 785        for (i = 0; i < len && buf < end - 1; i++) {
 786                buf = hex_byte_pack(buf, addr[i]);
 787
 788                if (buf < end && separator && i != len - 1)
 789                        *buf++ = separator;
 790        }
 791
 792        return buf;
 793}
 794
 795static noinline_for_stack
 796char *mac_address_string(char *buf, char *end, u8 *addr,
 797                         struct printf_spec spec, const char *fmt)
 798{
 799        char mac_addr[sizeof("xx:xx:xx:xx:xx:xx")];
 800        char *p = mac_addr;
 801        int i;
 802        char separator;
 803        bool reversed = false;
 804
 805        switch (fmt[1]) {
 806        case 'F':
 807                separator = '-';
 808                break;
 809
 810        case 'R':
 811                reversed = true;
 812                /* fall through */
 813
 814        default:
 815                separator = ':';
 816                break;
 817        }
 818
 819        for (i = 0; i < 6; i++) {
 820                if (reversed)
 821                        p = hex_byte_pack(p, addr[5 - i]);
 822                else
 823                        p = hex_byte_pack(p, addr[i]);
 824
 825                if (fmt[0] == 'M' && i != 5)
 826                        *p++ = separator;
 827        }
 828        *p = '\0';
 829
 830        return string(buf, end, mac_addr, spec);
 831}
 832
 833static noinline_for_stack
 834char *ip4_string(char *p, const u8 *addr, const char *fmt)
 835{
 836        int i;
 837        bool leading_zeros = (fmt[0] == 'i');
 838        int index;
 839        int step;
 840
 841        switch (fmt[2]) {
 842        case 'h':
 843#ifdef __BIG_ENDIAN
 844                index = 0;
 845                step = 1;
 846#else
 847                index = 3;
 848                step = -1;
 849#endif
 850                break;
 851        case 'l':
 852                index = 3;
 853                step = -1;
 854                break;
 855        case 'n':
 856        case 'b':
 857        default:
 858                index = 0;
 859                step = 1;
 860                break;
 861        }
 862        for (i = 0; i < 4; i++) {
 863                char temp[3];   /* hold each IP quad in reverse order */
 864                int digits = put_dec_trunc8(temp, addr[index]) - temp;
 865                if (leading_zeros) {
 866                        if (digits < 3)
 867                                *p++ = '0';
 868                        if (digits < 2)
 869                                *p++ = '0';
 870                }
 871                /* reverse the digits in the quad */
 872                while (digits--)
 873                        *p++ = temp[digits];
 874                if (i < 3)
 875                        *p++ = '.';
 876                index += step;
 877        }
 878        *p = '\0';
 879
 880        return p;
 881}
 882
 883static noinline_for_stack
 884char *ip6_compressed_string(char *p, const char *addr)
 885{
 886        int i, j, range;
 887        unsigned char zerolength[8];
 888        int longest = 1;
 889        int colonpos = -1;
 890        u16 word;
 891        u8 hi, lo;
 892        bool needcolon = false;
 893        bool useIPv4;
 894        struct in6_addr in6;
 895
 896        memcpy(&in6, addr, sizeof(struct in6_addr));
 897
 898        useIPv4 = ipv6_addr_v4mapped(&in6) || ipv6_addr_is_isatap(&in6);
 899
 900        memset(zerolength, 0, sizeof(zerolength));
 901
 902        if (useIPv4)
 903                range = 6;
 904        else
 905                range = 8;
 906
 907        /* find position of longest 0 run */
 908        for (i = 0; i < range; i++) {
 909                for (j = i; j < range; j++) {
 910                        if (in6.s6_addr16[j] != 0)
 911                                break;
 912                        zerolength[i]++;
 913                }
 914        }
 915        for (i = 0; i < range; i++) {
 916                if (zerolength[i] > longest) {
 917                        longest = zerolength[i];
 918                        colonpos = i;
 919                }
 920        }
 921        if (longest == 1)               /* don't compress a single 0 */
 922                colonpos = -1;
 923
 924        /* emit address */
 925        for (i = 0; i < range; i++) {
 926                if (i == colonpos) {
 927                        if (needcolon || i == 0)
 928                                *p++ = ':';
 929                        *p++ = ':';
 930                        needcolon = false;
 931                        i += longest - 1;
 932                        continue;
 933                }
 934                if (needcolon) {
 935                        *p++ = ':';
 936                        needcolon = false;
 937                }
 938                /* hex u16 without leading 0s */
 939                word = ntohs(in6.s6_addr16[i]);
 940                hi = word >> 8;
 941                lo = word & 0xff;
 942                if (hi) {
 943                        if (hi > 0x0f)
 944                                p = hex_byte_pack(p, hi);
 945                        else
 946                                *p++ = hex_asc_lo(hi);
 947                        p = hex_byte_pack(p, lo);
 948                }
 949                else if (lo > 0x0f)
 950                        p = hex_byte_pack(p, lo);
 951                else
 952                        *p++ = hex_asc_lo(lo);
 953                needcolon = true;
 954        }
 955
 956        if (useIPv4) {
 957                if (needcolon)
 958                        *p++ = ':';
 959                p = ip4_string(p, &in6.s6_addr[12], "I4");
 960        }
 961        *p = '\0';
 962
 963        return p;
 964}
 965
 966static noinline_for_stack
 967char *ip6_string(char *p, const char *addr, const char *fmt)
 968{
 969        int i;
 970
 971        for (i = 0; i < 8; i++) {
 972                p = hex_byte_pack(p, *addr++);
 973                p = hex_byte_pack(p, *addr++);
 974                if (fmt[0] == 'I' && i != 7)
 975                        *p++ = ':';
 976        }
 977        *p = '\0';
 978
 979        return p;
 980}
 981
 982static noinline_for_stack
 983char *ip6_addr_string(char *buf, char *end, const u8 *addr,
 984                      struct printf_spec spec, const char *fmt)
 985{
 986        char ip6_addr[sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255")];
 987
 988        if (fmt[0] == 'I' && fmt[2] == 'c')
 989                ip6_compressed_string(ip6_addr, addr);
 990        else
 991                ip6_string(ip6_addr, addr, fmt);
 992
 993        return string(buf, end, ip6_addr, spec);
 994}
 995
 996static noinline_for_stack
 997char *ip4_addr_string(char *buf, char *end, const u8 *addr,
 998                      struct printf_spec spec, const char *fmt)
 999{
1000        char ip4_addr[sizeof("255.255.255.255")];
1001
1002        ip4_string(ip4_addr, addr, fmt);
1003
1004        return string(buf, end, ip4_addr, spec);
1005}
1006
1007static noinline_for_stack
1008char *ip6_addr_string_sa(char *buf, char *end, const struct sockaddr_in6 *sa,
1009                         struct printf_spec spec, const char *fmt)
1010{
1011        bool have_p = false, have_s = false, have_f = false, have_c = false;
1012        char ip6_addr[sizeof("[xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255]") +
1013                      sizeof(":12345") + sizeof("/123456789") +
1014                      sizeof("%1234567890")];
1015        char *p = ip6_addr, *pend = ip6_addr + sizeof(ip6_addr);
1016        const u8 *addr = (const u8 *) &sa->sin6_addr;
1017        char fmt6[2] = { fmt[0], '6' };
1018        u8 off = 0;
1019
1020        fmt++;
1021        while (isalpha(*++fmt)) {
1022                switch (*fmt) {
1023                case 'p':
1024                        have_p = true;
1025                        break;
1026                case 'f':
1027                        have_f = true;
1028                        break;
1029                case 's':
1030                        have_s = true;
1031                        break;
1032                case 'c':
1033                        have_c = true;
1034                        break;
1035                }
1036        }
1037
1038        if (have_p || have_s || have_f) {
1039                *p = '[';
1040                off = 1;
1041        }
1042
1043        if (fmt6[0] == 'I' && have_c)
1044                p = ip6_compressed_string(ip6_addr + off, addr);
1045        else
1046                p = ip6_string(ip6_addr + off, addr, fmt6);
1047
1048        if (have_p || have_s || have_f)
1049                *p++ = ']';
1050
1051        if (have_p) {
1052                *p++ = ':';
1053                p = number(p, pend, ntohs(sa->sin6_port), spec);
1054        }
1055        if (have_f) {
1056                *p++ = '/';
1057                p = number(p, pend, ntohl(sa->sin6_flowinfo &
1058                                          IPV6_FLOWINFO_MASK), spec);
1059        }
1060        if (have_s) {
1061                *p++ = '%';
1062                p = number(p, pend, sa->sin6_scope_id, spec);
1063        }
1064        *p = '\0';
1065
1066        return string(buf, end, ip6_addr, spec);
1067}
1068
1069static noinline_for_stack
1070char *ip4_addr_string_sa(char *buf, char *end, const struct sockaddr_in *sa,
1071                         struct printf_spec spec, const char *fmt)
1072{
1073        bool have_p = false;
1074        char *p, ip4_addr[sizeof("255.255.255.255") + sizeof(":12345")];
1075        char *pend = ip4_addr + sizeof(ip4_addr);
1076        const u8 *addr = (const u8 *) &sa->sin_addr.s_addr;
1077        char fmt4[3] = { fmt[0], '4', 0 };
1078
1079        fmt++;
1080        while (isalpha(*++fmt)) {
1081                switch (*fmt) {
1082                case 'p':
1083                        have_p = true;
1084                        break;
1085                case 'h':
1086                case 'l':
1087                case 'n':
1088                case 'b':
1089                        fmt4[2] = *fmt;
1090                        break;
1091                }
1092        }
1093
1094        p = ip4_string(ip4_addr, addr, fmt4);
1095        if (have_p) {
1096                *p++ = ':';
1097                p = number(p, pend, ntohs(sa->sin_port), spec);
1098        }
1099        *p = '\0';
1100
1101        return string(buf, end, ip4_addr, spec);
1102}
1103
1104static noinline_for_stack
1105char *escaped_string(char *buf, char *end, u8 *addr, struct printf_spec spec,
1106                     const char *fmt)
1107{
1108        bool found = true;
1109        int count = 1;
1110        unsigned int flags = 0;
1111        int len;
1112
1113        if (spec.field_width == 0)
1114                return buf;                             /* nothing to print */
1115
1116        if (ZERO_OR_NULL_PTR(addr))
1117                return string(buf, end, NULL, spec);    /* NULL pointer */
1118
1119
1120        do {
1121                switch (fmt[count++]) {
1122                case 'a':
1123                        flags |= ESCAPE_ANY;
1124                        break;
1125                case 'c':
1126                        flags |= ESCAPE_SPECIAL;
1127                        break;
1128                case 'h':
1129                        flags |= ESCAPE_HEX;
1130                        break;
1131                case 'n':
1132                        flags |= ESCAPE_NULL;
1133                        break;
1134                case 'o':
1135                        flags |= ESCAPE_OCTAL;
1136                        break;
1137                case 'p':
1138                        flags |= ESCAPE_NP;
1139                        break;
1140                case 's':
1141                        flags |= ESCAPE_SPACE;
1142                        break;
1143                default:
1144                        found = false;
1145                        break;
1146                }
1147        } while (found);
1148
1149        if (!flags)
1150                flags = ESCAPE_ANY_NP;
1151
1152        len = spec.field_width < 0 ? 1 : spec.field_width;
1153
1154        /* Ignore the error. We print as many characters as we can */
1155        string_escape_mem(addr, len, &buf, end - buf, flags, NULL);
1156
1157        return buf;
1158}
1159
1160static noinline_for_stack
1161char *uuid_string(char *buf, char *end, const u8 *addr,
1162                  struct printf_spec spec, const char *fmt)
1163{
1164        char uuid[sizeof("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")];
1165        char *p = uuid;
1166        int i;
1167        static const u8 be[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
1168        static const u8 le[16] = {3,2,1,0,5,4,7,6,8,9,10,11,12,13,14,15};
1169        const u8 *index = be;
1170        bool uc = false;
1171
1172        switch (*(++fmt)) {
1173        case 'L':
1174                uc = true;              /* fall-through */
1175        case 'l':
1176                index = le;
1177                break;
1178        case 'B':
1179                uc = true;
1180                break;
1181        }
1182
1183        for (i = 0; i < 16; i++) {
1184                p = hex_byte_pack(p, addr[index[i]]);
1185                switch (i) {
1186                case 3:
1187                case 5:
1188                case 7:
1189                case 9:
1190                        *p++ = '-';
1191                        break;
1192                }
1193        }
1194
1195        *p = 0;
1196
1197        if (uc) {
1198                p = uuid;
1199                do {
1200                        *p = toupper(*p);
1201                } while (*(++p));
1202        }
1203
1204        return string(buf, end, uuid, spec);
1205}
1206
1207static
1208char *netdev_feature_string(char *buf, char *end, const u8 *addr,
1209                      struct printf_spec spec)
1210{
1211        spec.flags |= SPECIAL | SMALL | ZEROPAD;
1212        if (spec.field_width == -1)
1213                spec.field_width = 2 + 2 * sizeof(netdev_features_t);
1214        spec.base = 16;
1215
1216        return number(buf, end, *(const netdev_features_t *)addr, spec);
1217}
1218
1219static noinline_for_stack
1220char *address_val(char *buf, char *end, const void *addr,
1221                  struct printf_spec spec, const char *fmt)
1222{
1223        unsigned long long num;
1224
1225        spec.flags |= SPECIAL | SMALL | ZEROPAD;
1226        spec.base = 16;
1227
1228        switch (fmt[1]) {
1229        case 'd':
1230                num = *(const dma_addr_t *)addr;
1231                spec.field_width = sizeof(dma_addr_t) * 2 + 2;
1232                break;
1233        case 'p':
1234        default:
1235                num = *(const phys_addr_t *)addr;
1236                spec.field_width = sizeof(phys_addr_t) * 2 + 2;
1237                break;
1238        }
1239
1240        return number(buf, end, num, spec);
1241}
1242
1243int kptr_restrict __read_mostly;
1244
1245/*
1246 * Show a '%p' thing.  A kernel extension is that the '%p' is followed
1247 * by an extra set of alphanumeric characters that are extended format
1248 * specifiers.
1249 *
1250 * Right now we handle:
1251 *
1252 * - 'F' For symbolic function descriptor pointers with offset
1253 * - 'f' For simple symbolic function names without offset
1254 * - 'S' For symbolic direct pointers with offset
1255 * - 's' For symbolic direct pointers without offset
1256 * - '[FfSs]R' as above with __builtin_extract_return_addr() translation
1257 * - 'B' For backtraced symbolic direct pointers with offset
1258 * - 'R' For decoded struct resource, e.g., [mem 0x0-0x1f 64bit pref]
1259 * - 'r' For raw struct resource, e.g., [mem 0x0-0x1f flags 0x201]
1260 * - 'M' For a 6-byte MAC address, it prints the address in the
1261 *       usual colon-separated hex notation
1262 * - 'm' For a 6-byte MAC address, it prints the hex address without colons
1263 * - 'MF' For a 6-byte MAC FDDI address, it prints the address
1264 *       with a dash-separated hex notation
1265 * - '[mM]R' For a 6-byte MAC address, Reverse order (Bluetooth)
1266 * - 'I' [46] for IPv4/IPv6 addresses printed in the usual way
1267 *       IPv4 uses dot-separated decimal without leading 0's (1.2.3.4)
1268 *       IPv6 uses colon separated network-order 16 bit hex with leading 0's
1269 *       [S][pfs]
1270 *       Generic IPv4/IPv6 address (struct sockaddr *) that falls back to
1271 *       [4] or [6] and is able to print port [p], flowinfo [f], scope [s]
1272 * - 'i' [46] for 'raw' IPv4/IPv6 addresses
1273 *       IPv6 omits the colons (01020304...0f)
1274 *       IPv4 uses dot-separated decimal with leading 0's (010.123.045.006)
1275 *       [S][pfs]
1276 *       Generic IPv4/IPv6 address (struct sockaddr *) that falls back to
1277 *       [4] or [6] and is able to print port [p], flowinfo [f], scope [s]
1278 * - '[Ii][4S][hnbl]' IPv4 addresses in host, network, big or little endian order
1279 * - 'I[6S]c' for IPv6 addresses printed as specified by
1280 *       http://tools.ietf.org/html/rfc5952
1281 * - 'E[achnops]' For an escaped buffer, where rules are defined by combination
1282 *                of the following flags (see string_escape_mem() for the
1283 *                details):
1284 *                  a - ESCAPE_ANY
1285 *                  c - ESCAPE_SPECIAL
1286 *                  h - ESCAPE_HEX
1287 *                  n - ESCAPE_NULL
1288 *                  o - ESCAPE_OCTAL
1289 *                  p - ESCAPE_NP
1290 *                  s - ESCAPE_SPACE
1291 *                By default ESCAPE_ANY_NP is used.
1292 * - 'U' For a 16 byte UUID/GUID, it prints the UUID/GUID in the form
1293 *       "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
1294 *       Options for %pU are:
1295 *         b big endian lower case hex (default)
1296 *         B big endian UPPER case hex
1297 *         l little endian lower case hex
1298 *         L little endian UPPER case hex
1299 *           big endian output byte order is:
1300 *             [0][1][2][3]-[4][5]-[6][7]-[8][9]-[10][11][12][13][14][15]
1301 *           little endian output byte order is:
1302 *             [3][2][1][0]-[5][4]-[7][6]-[8][9]-[10][11][12][13][14][15]
1303 * - 'V' For a struct va_format which contains a format string * and va_list *,
1304 *       call vsnprintf(->format, *->va_list).
1305 *       Implements a "recursive vsnprintf".
1306 *       Do not use this feature without some mechanism to verify the
1307 *       correctness of the format string and va_list arguments.
1308 * - 'K' For a kernel pointer that should be hidden from unprivileged users
1309 * - 'NF' For a netdev_features_t
1310 * - 'h[CDN]' For a variable-length buffer, it prints it as a hex string with
1311 *            a certain separator (' ' by default):
1312 *              C colon
1313 *              D dash
1314 *              N no separator
1315 *            The maximum supported length is 64 bytes of the input. Consider
1316 *            to use print_hex_dump() for the larger input.
1317 * - 'a[pd]' For address types [p] phys_addr_t, [d] dma_addr_t and derivatives
1318 *           (default assumed to be phys_addr_t, passed by reference)
1319 * - 'd[234]' For a dentry name (optionally 2-4 last components)
1320 * - 'D[234]' Same as 'd' but for a struct file
1321 *
1322 * Note: The difference between 'S' and 'F' is that on ia64 and ppc64
1323 * function pointers are really function descriptors, which contain a
1324 * pointer to the real address.
1325 */
1326static noinline_for_stack
1327char *pointer(const char *fmt, char *buf, char *end, void *ptr,
1328              struct printf_spec spec)
1329{
1330        int default_width = 2 * sizeof(void *) + (spec.flags & SPECIAL ? 2 : 0);
1331
1332        if (!ptr && *fmt != 'K') {
1333                /*
1334                 * Print (null) with the same width as a pointer so it makes
1335                 * tabular output look nice.
1336                 */
1337                if (spec.field_width == -1)
1338                        spec.field_width = default_width;
1339                return string(buf, end, "(null)", spec);
1340        }
1341
1342        switch (*fmt) {
1343        case 'F':
1344        case 'f':
1345                ptr = dereference_function_descriptor(ptr);
1346                /* Fallthrough */
1347        case 'S':
1348        case 's':
1349        case 'B':
1350                return symbol_string(buf, end, ptr, spec, fmt);
1351        case 'R':
1352        case 'r':
1353                return resource_string(buf, end, ptr, spec, fmt);
1354        case 'h':
1355                return hex_string(buf, end, ptr, spec, fmt);
1356        case 'M':                       /* Colon separated: 00:01:02:03:04:05 */
1357        case 'm':                       /* Contiguous: 000102030405 */
1358                                        /* [mM]F (FDDI) */
1359                                        /* [mM]R (Reverse order; Bluetooth) */
1360                return mac_address_string(buf, end, ptr, spec, fmt);
1361        case 'I':                       /* Formatted IP supported
1362                                         * 4:   1.2.3.4
1363                                         * 6:   0001:0203:...:0708
1364                                         * 6c:  1::708 or 1::1.2.3.4
1365                                         */
1366        case 'i':                       /* Contiguous:
1367                                         * 4:   001.002.003.004
1368                                         * 6:   000102...0f
1369                                         */
1370                switch (fmt[1]) {
1371                case '6':
1372                        return ip6_addr_string(buf, end, ptr, spec, fmt);
1373                case '4':
1374                        return ip4_addr_string(buf, end, ptr, spec, fmt);
1375                case 'S': {
1376                        const union {
1377                                struct sockaddr         raw;
1378                                struct sockaddr_in      v4;
1379                                struct sockaddr_in6     v6;
1380                        } *sa = ptr;
1381
1382                        switch (sa->raw.sa_family) {
1383                        case AF_INET:
1384                                return ip4_addr_string_sa(buf, end, &sa->v4, spec, fmt);
1385                        case AF_INET6:
1386                                return ip6_addr_string_sa(buf, end, &sa->v6, spec, fmt);
1387                        default:
1388                                return string(buf, end, "(invalid address)", spec);
1389                        }}
1390                }
1391                break;
1392        case 'E':
1393                return escaped_string(buf, end, ptr, spec, fmt);
1394        case 'U':
1395                return uuid_string(buf, end, ptr, spec, fmt);
1396        case 'V':
1397                {
1398                        va_list va;
1399
1400                        va_copy(va, *((struct va_format *)ptr)->va);
1401                        buf += vsnprintf(buf, end > buf ? end - buf : 0,
1402                                         ((struct va_format *)ptr)->fmt, va);
1403                        va_end(va);
1404                        return buf;
1405                }
1406        case 'K':
1407                /*
1408                 * %pK cannot be used in IRQ context because its test
1409                 * for CAP_SYSLOG would be meaningless.
1410                 */
1411                if (kptr_restrict && (in_irq() || in_serving_softirq() ||
1412                                      in_nmi())) {
1413                        if (spec.field_width == -1)
1414                                spec.field_width = default_width;
1415                        return string(buf, end, "pK-error", spec);
1416                }
1417
1418                switch (kptr_restrict) {
1419                case 0:
1420                        /* Always print %pK values */
1421                        break;
1422                case 1: {
1423                        /*
1424                         * Only print the real pointer value if the current
1425                         * process has CAP_SYSLOG and is running with the
1426                         * same credentials it started with. This is because
1427                         * access to files is checked at open() time, but %pK
1428                         * checks permission at read() time. We don't want to
1429                         * leak pointer values if a binary opens a file using
1430                         * %pK and then elevates privileges before reading it.
1431                         */
1432                        const struct cred *cred = current_cred();
1433
1434                        if (!has_capability_noaudit(current, CAP_SYSLOG) ||
1435                            !uid_eq(cred->euid, cred->uid) ||
1436                            !gid_eq(cred->egid, cred->gid))
1437                                ptr = NULL;
1438                        break;
1439                }
1440                case 2:
1441                default:
1442                        /* Always print 0's for %pK */
1443                        ptr = NULL;
1444                        break;
1445                }
1446                break;
1447
1448        case 'N':
1449                switch (fmt[1]) {
1450                case 'F':
1451                        return netdev_feature_string(buf, end, ptr, spec);
1452                }
1453                break;
1454        case 'a':
1455                return address_val(buf, end, ptr, spec, fmt);
1456        case 'd':
1457                return dentry_name(buf, end, ptr, spec, fmt);
1458        case 'D':
1459                return dentry_name(buf, end,
1460                                   ((const struct file *)ptr)->f_path.dentry,
1461                                   spec, fmt);
1462        }
1463        spec.flags |= SMALL;
1464        if (spec.field_width == -1) {
1465                spec.field_width = default_width;
1466                spec.flags |= ZEROPAD;
1467        }
1468        spec.base = 16;
1469
1470        return number(buf, end, (unsigned long) ptr, spec);
1471}
1472
1473/*
1474 * Helper function to decode printf style format.
1475 * Each call decode a token from the format and return the
1476 * number of characters read (or likely the delta where it wants
1477 * to go on the next call).
1478 * The decoded token is returned through the parameters
1479 *
1480 * 'h', 'l', or 'L' for integer fields
1481 * 'z' support added 23/7/1999 S.H.
1482 * 'z' changed to 'Z' --davidm 1/25/99
1483 * 't' added for ptrdiff_t
1484 *
1485 * @fmt: the format string
1486 * @type of the token returned
1487 * @flags: various flags such as +, -, # tokens..
1488 * @field_width: overwritten width
1489 * @base: base of the number (octal, hex, ...)
1490 * @precision: precision of a number
1491 * @qualifier: qualifier of a number (long, size_t, ...)
1492 */
1493static noinline_for_stack
1494int format_decode(const char *fmt, struct printf_spec *spec)
1495{
1496        const char *start = fmt;
1497
1498        /* we finished early by reading the field width */
1499        if (spec->type == FORMAT_TYPE_WIDTH) {
1500                if (spec->field_width < 0) {
1501                        spec->field_width = -spec->field_width;
1502                        spec->flags |= LEFT;
1503                }
1504                spec->type = FORMAT_TYPE_NONE;
1505                goto precision;
1506        }
1507
1508        /* we finished early by reading the precision */
1509        if (spec->type == FORMAT_TYPE_PRECISION) {
1510                if (spec->precision < 0)
1511                        spec->precision = 0;
1512
1513                spec->type = FORMAT_TYPE_NONE;
1514                goto qualifier;
1515        }
1516
1517        /* By default */
1518        spec->type = FORMAT_TYPE_NONE;
1519
1520        for (; *fmt ; ++fmt) {
1521                if (*fmt == '%')
1522                        break;
1523        }
1524
1525        /* Return the current non-format string */
1526        if (fmt != start || !*fmt)
1527                return fmt - start;
1528
1529        /* Process flags */
1530        spec->flags = 0;
1531
1532        while (1) { /* this also skips first '%' */
1533                bool found = true;
1534
1535                ++fmt;
1536
1537                switch (*fmt) {
1538                case '-': spec->flags |= LEFT;    break;
1539                case '+': spec->flags |= PLUS;    break;
1540                case ' ': spec->flags |= SPACE;   break;
1541                case '#': spec->flags |= SPECIAL; break;
1542                case '0': spec->flags |= ZEROPAD; break;
1543                default:  found = false;
1544                }
1545
1546                if (!found)
1547                        break;
1548        }
1549
1550        /* get field width */
1551        spec->field_width = -1;
1552
1553        if (isdigit(*fmt))
1554                spec->field_width = skip_atoi(&fmt);
1555        else if (*fmt == '*') {
1556                /* it's the next argument */
1557                spec->type = FORMAT_TYPE_WIDTH;
1558                return ++fmt - start;
1559        }
1560
1561precision:
1562        /* get the precision */
1563        spec->precision = -1;
1564        if (*fmt == '.') {
1565                ++fmt;
1566                if (isdigit(*fmt)) {
1567                        spec->precision = skip_atoi(&fmt);
1568                        if (spec->precision < 0)
1569                                spec->precision = 0;
1570                } else if (*fmt == '*') {
1571                        /* it's the next argument */
1572                        spec->type = FORMAT_TYPE_PRECISION;
1573                        return ++fmt - start;
1574                }
1575        }
1576
1577qualifier:
1578        /* get the conversion qualifier */
1579        spec->qualifier = -1;
1580        if (*fmt == 'h' || _tolower(*fmt) == 'l' ||
1581            _tolower(*fmt) == 'z' || *fmt == 't') {
1582                spec->qualifier = *fmt++;
1583                if (unlikely(spec->qualifier == *fmt)) {
1584                        if (spec->qualifier == 'l') {
1585                                spec->qualifier = 'L';
1586                                ++fmt;
1587                        } else if (spec->qualifier == 'h') {
1588                                spec->qualifier = 'H';
1589                                ++fmt;
1590                        }
1591                }
1592        }
1593
1594        /* default base */
1595        spec->base = 10;
1596        switch (*fmt) {
1597        case 'c':
1598                spec->type = FORMAT_TYPE_CHAR;
1599                return ++fmt - start;
1600
1601        case 's':
1602                spec->type = FORMAT_TYPE_STR;
1603                return ++fmt - start;
1604
1605        case 'p':
1606                spec->type = FORMAT_TYPE_PTR;
1607                return fmt - start;
1608                /* skip alnum */
1609
1610        case '%':
1611                spec->type = FORMAT_TYPE_PERCENT_CHAR;
1612                return ++fmt - start;
1613
1614        /* integer number formats - set up the flags and "break" */
1615        case 'o':
1616                spec->base = 8;
1617                break;
1618
1619        case 'x':
1620                spec->flags |= SMALL;
1621
1622        case 'X':
1623                spec->base = 16;
1624                break;
1625
1626        case 'd':
1627        case 'i':
1628                spec->flags |= SIGN;
1629        case 'u':
1630                break;
1631
1632        case 'n':
1633                /*
1634                 * Since %n poses a greater security risk than utility, treat
1635                 * it as an invalid format specifier. Warn about its use so
1636                 * that new instances don't get added.
1637                 */
1638                WARN_ONCE(1, "Please remove ignored %%n in '%s'\n", fmt);
1639                /* Fall-through */
1640
1641        default:
1642                spec->type = FORMAT_TYPE_INVALID;
1643                return fmt - start;
1644        }
1645
1646        if (spec->qualifier == 'L')
1647                spec->type = FORMAT_TYPE_LONG_LONG;
1648        else if (spec->qualifier == 'l') {
1649                if (spec->flags & SIGN)
1650                        spec->type = FORMAT_TYPE_LONG;
1651                else
1652                        spec->type = FORMAT_TYPE_ULONG;
1653        } else if (_tolower(spec->qualifier) == 'z') {
1654                spec->type = FORMAT_TYPE_SIZE_T;
1655        } else if (spec->qualifier == 't') {
1656                spec->type = FORMAT_TYPE_PTRDIFF;
1657        } else if (spec->qualifier == 'H') {
1658                if (spec->flags & SIGN)
1659                        spec->type = FORMAT_TYPE_BYTE;
1660                else
1661                        spec->type = FORMAT_TYPE_UBYTE;
1662        } else if (spec->qualifier == 'h') {
1663                if (spec->flags & SIGN)
1664                        spec->type = FORMAT_TYPE_SHORT;
1665                else
1666                        spec->type = FORMAT_TYPE_USHORT;
1667        } else {
1668                if (spec->flags & SIGN)
1669                        spec->type = FORMAT_TYPE_INT;
1670                else
1671                        spec->type = FORMAT_TYPE_UINT;
1672        }
1673
1674        return ++fmt - start;
1675}
1676
1677/**
1678 * vsnprintf - Format a string and place it in a buffer
1679 * @buf: The buffer to place the result into
1680 * @size: The size of the buffer, including the trailing null space
1681 * @fmt: The format string to use
1682 * @args: Arguments for the format string
1683 *
1684 * This function follows C99 vsnprintf, but has some extensions:
1685 * %pS output the name of a text symbol with offset
1686 * %ps output the name of a text symbol without offset
1687 * %pF output the name of a function pointer with its offset
1688 * %pf output the name of a function pointer without its offset
1689 * %pB output the name of a backtrace symbol with its offset
1690 * %pR output the address range in a struct resource with decoded flags
1691 * %pr output the address range in a struct resource with raw flags
1692 * %pM output a 6-byte MAC address with colons
1693 * %pMR output a 6-byte MAC address with colons in reversed order
1694 * %pMF output a 6-byte MAC address with dashes
1695 * %pm output a 6-byte MAC address without colons
1696 * %pmR output a 6-byte MAC address without colons in reversed order
1697 * %pI4 print an IPv4 address without leading zeros
1698 * %pi4 print an IPv4 address with leading zeros
1699 * %pI6 print an IPv6 address with colons
1700 * %pi6 print an IPv6 address without colons
1701 * %pI6c print an IPv6 address as specified by RFC 5952
1702 * %pIS depending on sa_family of 'struct sockaddr *' print IPv4/IPv6 address
1703 * %piS depending on sa_family of 'struct sockaddr *' print IPv4/IPv6 address
1704 * %pU[bBlL] print a UUID/GUID in big or little endian using lower or upper
1705 *   case.
1706 * %*pE[achnops] print an escaped buffer
1707 * %*ph[CDN] a variable-length hex string with a separator (supports up to 64
1708 *           bytes of the input)
1709 * %n is ignored
1710 *
1711 * ** Please update Documentation/printk-formats.txt when making changes **
1712 *
1713 * The return value is the number of characters which would
1714 * be generated for the given input, excluding the trailing
1715 * '\0', as per ISO C99. If you want to have the exact
1716 * number of characters written into @buf as return value
1717 * (not including the trailing '\0'), use vscnprintf(). If the
1718 * return is greater than or equal to @size, the resulting
1719 * string is truncated.
1720 *
1721 * If you're not already dealing with a va_list consider using snprintf().
1722 */
1723int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
1724{
1725        unsigned long long num;
1726        char *str, *end;
1727        struct printf_spec spec = {0};
1728
1729        /* Reject out-of-range values early.  Large positive sizes are
1730           used for unknown buffer sizes. */
1731        if (WARN_ON_ONCE((int) size < 0))
1732                return 0;
1733
1734        str = buf;
1735        end = buf + size;
1736
1737        /* Make sure end is always >= buf */
1738        if (end < buf) {
1739                end = ((void *)-1);
1740                size = end - buf;
1741        }
1742
1743        while (*fmt) {
1744                const char *old_fmt = fmt;
1745                int read = format_decode(fmt, &spec);
1746
1747                fmt += read;
1748
1749                switch (spec.type) {
1750                case FORMAT_TYPE_NONE: {
1751                        int copy = read;
1752                        if (str < end) {
1753                                if (copy > end - str)
1754                                        copy = end - str;
1755                                memcpy(str, old_fmt, copy);
1756                        }
1757                        str += read;
1758                        break;
1759                }
1760
1761                case FORMAT_TYPE_WIDTH:
1762                        spec.field_width = va_arg(args, int);
1763                        break;
1764
1765                case FORMAT_TYPE_PRECISION:
1766                        spec.precision = va_arg(args, int);
1767                        break;
1768
1769                case FORMAT_TYPE_CHAR: {
1770                        char c;
1771
1772                        if (!(spec.flags & LEFT)) {
1773                                while (--spec.field_width > 0) {
1774                                        if (str < end)
1775                                                *str = ' ';
1776                                        ++str;
1777
1778                                }
1779                        }
1780                        c = (unsigned char) va_arg(args, int);
1781                        if (str < end)
1782                                *str = c;
1783                        ++str;
1784                        while (--spec.field_width > 0) {
1785                                if (str < end)
1786                                        *str = ' ';
1787                                ++str;
1788                        }
1789                        break;
1790                }
1791
1792                case FORMAT_TYPE_STR:
1793                        str = string(str, end, va_arg(args, char *), spec);
1794                        break;
1795
1796                case FORMAT_TYPE_PTR:
1797                        str = pointer(fmt+1, str, end, va_arg(args, void *),
1798                                      spec);
1799                        while (isalnum(*fmt))
1800                                fmt++;
1801                        break;
1802
1803                case FORMAT_TYPE_PERCENT_CHAR:
1804                        if (str < end)
1805                                *str = '%';
1806                        ++str;
1807                        break;
1808
1809                case FORMAT_TYPE_INVALID:
1810                        if (str < end)
1811                                *str = '%';
1812                        ++str;
1813                        break;
1814
1815                default:
1816                        switch (spec.type) {
1817                        case FORMAT_TYPE_LONG_LONG:
1818                                num = va_arg(args, long long);
1819                                break;
1820                        case FORMAT_TYPE_ULONG:
1821                                num = va_arg(args, unsigned long);
1822                                break;
1823                        case FORMAT_TYPE_LONG:
1824                                num = va_arg(args, long);
1825                                break;
1826                        case FORMAT_TYPE_SIZE_T:
1827                                if (spec.flags & SIGN)
1828                                        num = va_arg(args, ssize_t);
1829                                else
1830                                        num = va_arg(args, size_t);
1831                                break;
1832                        case FORMAT_TYPE_PTRDIFF:
1833                                num = va_arg(args, ptrdiff_t);
1834                                break;
1835                        case FORMAT_TYPE_UBYTE:
1836                                num = (unsigned char) va_arg(args, int);
1837                                break;
1838                        case FORMAT_TYPE_BYTE:
1839                                num = (signed char) va_arg(args, int);
1840                                break;
1841                        case FORMAT_TYPE_USHORT:
1842                                num = (unsigned short) va_arg(args, int);
1843                                break;
1844                        case FORMAT_TYPE_SHORT:
1845                                num = (short) va_arg(args, int);
1846                                break;
1847                        case FORMAT_TYPE_INT:
1848                                num = (int) va_arg(args, int);
1849                                break;
1850                        default:
1851                                num = va_arg(args, unsigned int);
1852                        }
1853
1854                        str = number(str, end, num, spec);
1855                }
1856        }
1857
1858        if (size > 0) {
1859                if (str < end)
1860                        *str = '\0';
1861                else
1862                        end[-1] = '\0';
1863        }
1864
1865        /* the trailing null byte doesn't count towards the total */
1866        return str-buf;
1867
1868}
1869EXPORT_SYMBOL(vsnprintf);
1870
1871/**
1872 * vscnprintf - Format a string and place it in a buffer
1873 * @buf: The buffer to place the result into
1874 * @size: The size of the buffer, including the trailing null space
1875 * @fmt: The format string to use
1876 * @args: Arguments for the format string
1877 *
1878 * The return value is the number of characters which have been written into
1879 * the @buf not including the trailing '\0'. If @size is == 0 the function
1880 * returns 0.
1881 *
1882 * If you're not already dealing with a va_list consider using scnprintf().
1883 *
1884 * See the vsnprintf() documentation for format string extensions over C99.
1885 */
1886int vscnprintf(char *buf, size_t size, const char *fmt, va_list args)
1887{
1888        int i;
1889
1890        i = vsnprintf(buf, size, fmt, args);
1891
1892        if (likely(i < size))
1893                return i;
1894        if (size != 0)
1895                return size - 1;
1896        return 0;
1897}
1898EXPORT_SYMBOL(vscnprintf);
1899
1900/**
1901 * snprintf - Format a string and place it in a buffer
1902 * @buf: The buffer to place the result into
1903 * @size: The size of the buffer, including the trailing null space
1904 * @fmt: The format string to use
1905 * @...: Arguments for the format string
1906 *
1907 * The return value is the number of characters which would be
1908 * generated for the given input, excluding the trailing null,
1909 * as per ISO C99.  If the return is greater than or equal to
1910 * @size, the resulting string is truncated.
1911 *
1912 * See the vsnprintf() documentation for format string extensions over C99.
1913 */
1914int snprintf(char *buf, size_t size, const char *fmt, ...)
1915{
1916        va_list args;
1917        int i;
1918
1919        va_start(args, fmt);
1920        i = vsnprintf(buf, size, fmt, args);
1921        va_end(args);
1922
1923        return i;
1924}
1925EXPORT_SYMBOL(snprintf);
1926
1927/**
1928 * scnprintf - Format a string and place it in a buffer
1929 * @buf: The buffer to place the result into
1930 * @size: The size of the buffer, including the trailing null space
1931 * @fmt: The format string to use
1932 * @...: Arguments for the format string
1933 *
1934 * The return value is the number of characters written into @buf not including
1935 * the trailing '\0'. If @size is == 0 the function returns 0.
1936 */
1937
1938int scnprintf(char *buf, size_t size, const char *fmt, ...)
1939{
1940        va_list args;
1941        int i;
1942
1943        va_start(args, fmt);
1944        i = vscnprintf(buf, size, fmt, args);
1945        va_end(args);
1946
1947        return i;
1948}
1949EXPORT_SYMBOL(scnprintf);
1950
1951/**
1952 * vsprintf - Format a string and place it in a buffer
1953 * @buf: The buffer to place the result into
1954 * @fmt: The format string to use
1955 * @args: Arguments for the format string
1956 *
1957 * The function returns the number of characters written
1958 * into @buf. Use vsnprintf() or vscnprintf() in order to avoid
1959 * buffer overflows.
1960 *
1961 * If you're not already dealing with a va_list consider using sprintf().
1962 *
1963 * See the vsnprintf() documentation for format string extensions over C99.
1964 */
1965int vsprintf(char *buf, const char *fmt, va_list args)
1966{
1967        return vsnprintf(buf, INT_MAX, fmt, args);
1968}
1969EXPORT_SYMBOL(vsprintf);
1970
1971/**
1972 * sprintf - Format a string and place it in a buffer
1973 * @buf: The buffer to place the result into
1974 * @fmt: The format string to use
1975 * @...: Arguments for the format string
1976 *
1977 * The function returns the number of characters written
1978 * into @buf. Use snprintf() or scnprintf() in order to avoid
1979 * buffer overflows.
1980 *
1981 * See the vsnprintf() documentation for format string extensions over C99.
1982 */
1983int sprintf(char *buf, const char *fmt, ...)
1984{
1985        va_list args;
1986        int i;
1987
1988        va_start(args, fmt);
1989        i = vsnprintf(buf, INT_MAX, fmt, args);
1990        va_end(args);
1991
1992        return i;
1993}
1994EXPORT_SYMBOL(sprintf);
1995
1996#ifdef CONFIG_BINARY_PRINTF
1997/*
1998 * bprintf service:
1999 * vbin_printf() - VA arguments to binary data
2000 * bstr_printf() - Binary data to text string
2001 */
2002
2003/**
2004 * vbin_printf - Parse a format string and place args' binary value in a buffer
2005 * @bin_buf: The buffer to place args' binary value
2006 * @size: The size of the buffer(by words(32bits), not characters)
2007 * @fmt: The format string to use
2008 * @args: Arguments for the format string
2009 *
2010 * The format follows C99 vsnprintf, except %n is ignored, and its argument
2011 * is skipped.
2012 *
2013 * The return value is the number of words(32bits) which would be generated for
2014 * the given input.
2015 *
2016 * NOTE:
2017 * If the return value is greater than @size, the resulting bin_buf is NOT
2018 * valid for bstr_printf().
2019 */
2020int vbin_printf(u32 *bin_buf, size_t size, const char *fmt, va_list args)
2021{
2022        struct printf_spec spec = {0};
2023        char *str, *end;
2024
2025        str = (char *)bin_buf;
2026        end = (char *)(bin_buf + size);
2027
2028#define save_arg(type)                                                  \
2029do {                                                                    \
2030        if (sizeof(type) == 8) {                                        \
2031                unsigned long long value;                               \
2032                str = PTR_ALIGN(str, sizeof(u32));                      \
2033                value = va_arg(args, unsigned long long);               \
2034                if (str + sizeof(type) <= end) {                        \
2035                        *(u32 *)str = *(u32 *)&value;                   \
2036                        *(u32 *)(str + 4) = *((u32 *)&value + 1);       \
2037                }                                                       \
2038        } else {                                                        \
2039                unsigned long value;                                    \
2040                str = PTR_ALIGN(str, sizeof(type));                     \
2041                value = va_arg(args, int);                              \
2042                if (str + sizeof(type) <= end)                          \
2043                        *(typeof(type) *)str = (type)value;             \
2044        }                                                               \
2045        str += sizeof(type);                                            \
2046} while (0)
2047
2048        while (*fmt) {
2049                int read = format_decode(fmt, &spec);
2050
2051                fmt += read;
2052
2053                switch (spec.type) {
2054                case FORMAT_TYPE_NONE:
2055                case FORMAT_TYPE_INVALID:
2056                case FORMAT_TYPE_PERCENT_CHAR:
2057                        break;
2058
2059                case FORMAT_TYPE_WIDTH:
2060                case FORMAT_TYPE_PRECISION:
2061                        save_arg(int);
2062                        break;
2063
2064                case FORMAT_TYPE_CHAR:
2065                        save_arg(char);
2066                        break;
2067
2068                case FORMAT_TYPE_STR: {
2069                        const char *save_str = va_arg(args, char *);
2070                        size_t len;
2071
2072                        if ((unsigned long)save_str > (unsigned long)-PAGE_SIZE
2073                                        || (unsigned long)save_str < PAGE_SIZE)
2074                                save_str = "(null)";
2075                        len = strlen(save_str) + 1;
2076                        if (str + len < end)
2077                                memcpy(str, save_str, len);
2078                        str += len;
2079                        break;
2080                }
2081
2082                case FORMAT_TYPE_PTR:
2083                        save_arg(void *);
2084                        /* skip all alphanumeric pointer suffixes */
2085                        while (isalnum(*fmt))
2086                                fmt++;
2087                        break;
2088
2089                default:
2090                        switch (spec.type) {
2091
2092                        case FORMAT_TYPE_LONG_LONG:
2093                                save_arg(long long);
2094                                break;
2095                        case FORMAT_TYPE_ULONG:
2096                        case FORMAT_TYPE_LONG:
2097                                save_arg(unsigned long);
2098                                break;
2099                        case FORMAT_TYPE_SIZE_T:
2100                                save_arg(size_t);
2101                                break;
2102                        case FORMAT_TYPE_PTRDIFF:
2103                                save_arg(ptrdiff_t);
2104                                break;
2105                        case FORMAT_TYPE_UBYTE:
2106                        case FORMAT_TYPE_BYTE:
2107                                save_arg(char);
2108                                break;
2109                        case FORMAT_TYPE_USHORT:
2110                        case FORMAT_TYPE_SHORT:
2111                                save_arg(short);
2112                                break;
2113                        default:
2114                                save_arg(int);
2115                        }
2116                }
2117        }
2118
2119        return (u32 *)(PTR_ALIGN(str, sizeof(u32))) - bin_buf;
2120#undef save_arg
2121}
2122EXPORT_SYMBOL_GPL(vbin_printf);
2123
2124/**
2125 * bstr_printf - Format a string from binary arguments and place it in a buffer
2126 * @buf: The buffer to place the result into
2127 * @size: The size of the buffer, including the trailing null space
2128 * @fmt: The format string to use
2129 * @bin_buf: Binary arguments for the format string
2130 *
2131 * This function like C99 vsnprintf, but the difference is that vsnprintf gets
2132 * arguments from stack, and bstr_printf gets arguments from @bin_buf which is
2133 * a binary buffer that generated by vbin_printf.
2134 *
2135 * The format follows C99 vsnprintf, but has some extensions:
2136 *  see vsnprintf comment for details.
2137 *
2138 * The return value is the number of characters which would
2139 * be generated for the given input, excluding the trailing
2140 * '\0', as per ISO C99. If you want to have the exact
2141 * number of characters written into @buf as return value
2142 * (not including the trailing '\0'), use vscnprintf(). If the
2143 * return is greater than or equal to @size, the resulting
2144 * string is truncated.
2145 */
2146int bstr_printf(char *buf, size_t size, const char *fmt, const u32 *bin_buf)
2147{
2148        struct printf_spec spec = {0};
2149        char *str, *end;
2150        const char *args = (const char *)bin_buf;
2151
2152        if (WARN_ON_ONCE((int) size < 0))
2153                return 0;
2154
2155        str = buf;
2156        end = buf + size;
2157
2158#define get_arg(type)                                                   \
2159({                                                                      \
2160        typeof(type) value;                                             \
2161        if (sizeof(type) == 8) {                                        \
2162                args = PTR_ALIGN(args, sizeof(u32));                    \
2163                *(u32 *)&value = *(u32 *)args;                          \
2164                *((u32 *)&value + 1) = *(u32 *)(args + 4);              \
2165        } else {                                                        \
2166                args = PTR_ALIGN(args, sizeof(type));                   \
2167                value = *(typeof(type) *)args;                          \
2168        }                                                               \
2169        args += sizeof(type);                                           \
2170        value;                                                          \
2171})
2172
2173        /* Make sure end is always >= buf */
2174        if (end < buf) {
2175                end = ((void *)-1);
2176                size = end - buf;
2177        }
2178
2179        while (*fmt) {
2180                const char *old_fmt = fmt;
2181                int read = format_decode(fmt, &spec);
2182
2183                fmt += read;
2184
2185                switch (spec.type) {
2186                case FORMAT_TYPE_NONE: {
2187                        int copy = read;
2188                        if (str < end) {
2189                                if (copy > end - str)
2190                                        copy = end - str;
2191                                memcpy(str, old_fmt, copy);
2192                        }
2193                        str += read;
2194                        break;
2195                }
2196
2197                case FORMAT_TYPE_WIDTH:
2198                        spec.field_width = get_arg(int);
2199                        break;
2200
2201                case FORMAT_TYPE_PRECISION:
2202                        spec.precision = get_arg(int);
2203                        break;
2204
2205                case FORMAT_TYPE_CHAR: {
2206                        char c;
2207
2208                        if (!(spec.flags & LEFT)) {
2209                                while (--spec.field_width > 0) {
2210                                        if (str < end)
2211                                                *str = ' ';
2212                                        ++str;
2213                                }
2214                        }
2215                        c = (unsigned char) get_arg(char);
2216                        if (str < end)
2217                                *str = c;
2218                        ++str;
2219                        while (--spec.field_width > 0) {
2220                                if (str < end)
2221                                        *str = ' ';
2222                                ++str;
2223                        }
2224                        break;
2225                }
2226
2227                case FORMAT_TYPE_STR: {
2228                        const char *str_arg = args;
2229                        args += strlen(str_arg) + 1;
2230                        str = string(str, end, (char *)str_arg, spec);
2231                        break;
2232                }
2233
2234                case FORMAT_TYPE_PTR:
2235                        str = pointer(fmt+1, str, end, get_arg(void *), spec);
2236                        while (isalnum(*fmt))
2237                                fmt++;
2238                        break;
2239
2240                case FORMAT_TYPE_PERCENT_CHAR:
2241                case FORMAT_TYPE_INVALID:
2242                        if (str < end)
2243                                *str = '%';
2244                        ++str;
2245                        break;
2246
2247                default: {
2248                        unsigned long long num;
2249
2250                        switch (spec.type) {
2251
2252                        case FORMAT_TYPE_LONG_LONG:
2253                                num = get_arg(long long);
2254                                break;
2255                        case FORMAT_TYPE_ULONG:
2256                        case FORMAT_TYPE_LONG:
2257                                num = get_arg(unsigned long);
2258                                break;
2259                        case FORMAT_TYPE_SIZE_T:
2260                                num = get_arg(size_t);
2261                                break;
2262                        case FORMAT_TYPE_PTRDIFF:
2263                                num = get_arg(ptrdiff_t);
2264                                break;
2265                        case FORMAT_TYPE_UBYTE:
2266                                num = get_arg(unsigned char);
2267                                break;
2268                        case FORMAT_TYPE_BYTE:
2269                                num = get_arg(signed char);
2270                                break;
2271                        case FORMAT_TYPE_USHORT:
2272                                num = get_arg(unsigned short);
2273                                break;
2274                        case FORMAT_TYPE_SHORT:
2275                                num = get_arg(short);
2276                                break;
2277                        case FORMAT_TYPE_UINT:
2278                                num = get_arg(unsigned int);
2279                                break;
2280                        default:
2281                                num = get_arg(int);
2282                        }
2283
2284                        str = number(str, end, num, spec);
2285                } /* default: */
2286                } /* switch(spec.type) */
2287        } /* while(*fmt) */
2288
2289        if (size > 0) {
2290                if (str < end)
2291                        *str = '\0';
2292                else
2293                        end[-1] = '\0';
2294        }
2295
2296#undef get_arg
2297
2298        /* the trailing null byte doesn't count towards the total */
2299        return str - buf;
2300}
2301EXPORT_SYMBOL_GPL(bstr_printf);
2302
2303/**
2304 * bprintf - Parse a format string and place args' binary value in a buffer
2305 * @bin_buf: The buffer to place args' binary value
2306 * @size: The size of the buffer(by words(32bits), not characters)
2307 * @fmt: The format string to use
2308 * @...: Arguments for the format string
2309 *
2310 * The function returns the number of words(u32) written
2311 * into @bin_buf.
2312 */
2313int bprintf(u32 *bin_buf, size_t size, const char *fmt, ...)
2314{
2315        va_list args;
2316        int ret;
2317
2318        va_start(args, fmt);
2319        ret = vbin_printf(bin_buf, size, fmt, args);
2320        va_end(args);
2321
2322        return ret;
2323}
2324EXPORT_SYMBOL_GPL(bprintf);
2325
2326#endif /* CONFIG_BINARY_PRINTF */
2327
2328/**
2329 * vsscanf - Unformat a buffer into a list of arguments
2330 * @buf:        input buffer
2331 * @fmt:        format of buffer
2332 * @args:       arguments
2333 */
2334int vsscanf(const char *buf, const char *fmt, va_list args)
2335{
2336        const char *str = buf;
2337        char *next;
2338        char digit;
2339        int num = 0;
2340        u8 qualifier;
2341        unsigned int base;
2342        union {
2343                long long s;
2344                unsigned long long u;
2345        } val;
2346        s16 field_width;
2347        bool is_sign;
2348
2349        while (*fmt) {
2350                /* skip any white space in format */
2351                /* white space in format matchs any amount of
2352                 * white space, including none, in the input.
2353                 */
2354                if (isspace(*fmt)) {
2355                        fmt = skip_spaces(++fmt);
2356                        str = skip_spaces(str);
2357                }
2358
2359                /* anything that is not a conversion must match exactly */
2360                if (*fmt != '%' && *fmt) {
2361                        if (*fmt++ != *str++)
2362                                break;
2363                        continue;
2364                }
2365
2366                if (!*fmt)
2367                        break;
2368                ++fmt;
2369
2370                /* skip this conversion.
2371                 * advance both strings to next white space
2372                 */
2373                if (*fmt == '*') {
2374                        if (!*str)
2375                                break;
2376                        while (!isspace(*fmt) && *fmt != '%' && *fmt)
2377                                fmt++;
2378                        while (!isspace(*str) && *str)
2379                                str++;
2380                        continue;
2381                }
2382
2383                /* get field width */
2384                field_width = -1;
2385                if (isdigit(*fmt)) {
2386                        field_width = skip_atoi(&fmt);
2387                        if (field_width <= 0)
2388                                break;
2389                }
2390
2391                /* get conversion qualifier */
2392                qualifier = -1;
2393                if (*fmt == 'h' || _tolower(*fmt) == 'l' ||
2394                    _tolower(*fmt) == 'z') {
2395                        qualifier = *fmt++;
2396                        if (unlikely(qualifier == *fmt)) {
2397                                if (qualifier == 'h') {
2398                                        qualifier = 'H';
2399                                        fmt++;
2400                                } else if (qualifier == 'l') {
2401                                        qualifier = 'L';
2402                                        fmt++;
2403                                }
2404                        }
2405                }
2406
2407                if (!*fmt)
2408                        break;
2409
2410                if (*fmt == 'n') {
2411                        /* return number of characters read so far */
2412                        *va_arg(args, int *) = str - buf;
2413                        ++fmt;
2414                        continue;
2415                }
2416
2417                if (!*str)
2418                        break;
2419
2420                base = 10;
2421                is_sign = false;
2422
2423                switch (*fmt++) {
2424                case 'c':
2425                {
2426                        char *s = (char *)va_arg(args, char*);
2427                        if (field_width == -1)
2428                                field_width = 1;
2429                        do {
2430                                *s++ = *str++;
2431                        } while (--field_width > 0 && *str);
2432                        num++;
2433                }
2434                continue;
2435                case 's':
2436                {
2437                        char *s = (char *)va_arg(args, char *);
2438                        if (field_width == -1)
2439                                field_width = SHRT_MAX;
2440                        /* first, skip leading white space in buffer */
2441                        str = skip_spaces(str);
2442
2443                        /* now copy until next white space */
2444                        while (*str && !isspace(*str) && field_width--)
2445                                *s++ = *str++;
2446                        *s = '\0';
2447                        num++;
2448                }
2449                continue;
2450                case 'o':
2451                        base = 8;
2452                        break;
2453                case 'x':
2454                case 'X':
2455                        base = 16;
2456                        break;
2457                case 'i':
2458                        base = 0;
2459                case 'd':
2460                        is_sign = true;
2461                case 'u':
2462                        break;
2463                case '%':
2464                        /* looking for '%' in str */
2465                        if (*str++ != '%')
2466                                return num;
2467                        continue;
2468                default:
2469                        /* invalid format; stop here */
2470                        return num;
2471                }
2472
2473                /* have some sort of integer conversion.
2474                 * first, skip white space in buffer.
2475                 */
2476                str = skip_spaces(str);
2477
2478                digit = *str;
2479                if (is_sign && digit == '-')
2480                        digit = *(str + 1);
2481
2482                if (!digit
2483                    || (base == 16 && !isxdigit(digit))
2484                    || (base == 10 && !isdigit(digit))
2485                    || (base == 8 && (!isdigit(digit) || digit > '7'))
2486                    || (base == 0 && !isdigit(digit)))
2487                        break;
2488
2489                if (is_sign)
2490                        val.s = qualifier != 'L' ?
2491                                simple_strtol(str, &next, base) :
2492                                simple_strtoll(str, &next, base);
2493                else
2494                        val.u = qualifier != 'L' ?
2495                                simple_strtoul(str, &next, base) :
2496                                simple_strtoull(str, &next, base);
2497
2498                if (field_width > 0 && next - str > field_width) {
2499                        if (base == 0)
2500                                _parse_integer_fixup_radix(str, &base);
2501                        while (next - str > field_width) {
2502                                if (is_sign)
2503                                        val.s = div_s64(val.s, base);
2504                                else
2505                                        val.u = div_u64(val.u, base);
2506                                --next;
2507                        }
2508                }
2509
2510                switch (qualifier) {
2511                case 'H':       /* that's 'hh' in format */
2512                        if (is_sign)
2513                                *va_arg(args, signed char *) = val.s;
2514                        else
2515                                *va_arg(args, unsigned char *) = val.u;
2516                        break;
2517                case 'h':
2518                        if (is_sign)
2519                                *va_arg(args, short *) = val.s;
2520                        else
2521                                *va_arg(args, unsigned short *) = val.u;
2522                        break;
2523                case 'l':
2524                        if (is_sign)
2525                                *va_arg(args, long *) = val.s;
2526                        else
2527                                *va_arg(args, unsigned long *) = val.u;
2528                        break;
2529                case 'L':
2530                        if (is_sign)
2531                                *va_arg(args, long long *) = val.s;
2532                        else
2533                                *va_arg(args, unsigned long long *) = val.u;
2534                        break;
2535                case 'Z':
2536                case 'z':
2537                        *va_arg(args, size_t *) = val.u;
2538                        break;
2539                default:
2540                        if (is_sign)
2541                                *va_arg(args, int *) = val.s;
2542                        else
2543                                *va_arg(args, unsigned int *) = val.u;
2544                        break;
2545                }
2546                num++;
2547
2548                if (!next)
2549                        break;
2550                str = next;
2551        }
2552
2553        return num;
2554}
2555EXPORT_SYMBOL(vsscanf);
2556
2557/**
2558 * sscanf - Unformat a buffer into a list of arguments
2559 * @buf:        input buffer
2560 * @fmt:        formatting of buffer
2561 * @...:        resulting arguments
2562 */
2563int sscanf(const char *buf, const char *fmt, ...)
2564{
2565        va_list args;
2566        int i;
2567
2568        va_start(args, fmt);
2569        i = vsscanf(buf, fmt, args);
2570        va_end(args);
2571
2572        return i;
2573}
2574EXPORT_SYMBOL(sscanf);
2575
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.