[U-Boot] [PATCH v2 01/40] vsprintf: Add modifier for phys_addr_t

Simon Glass sjg at chromium.org
Wed Aug 27 01:14:17 CEST 2014


Hi Thierry,

On 26 August 2014 09:33, Thierry Reding <thierry.reding at gmail.com> wrote:
>
> From: Thierry Reding <treding at nvidia.com>
>
> Provide a new modifier to vsprintf() to print phys_addr_t variables to
> avoid having to cast or #ifdef when printing them out. The %pa modifier
> is used for this purpose, so phys_addr_t variables need to be passed by
> reference, like so:
>
>         phys_addr_t start = 0;
>
>         printf("start: %pa\n", &start);
>
> Depending on the size of phys_addr_t this will print out the address
> with 8 or 16 hexadecimal digits following a 0x prefix.

Would it be better to use %#pa to get the 0x prefix so we have the
option? Hex is the default in U-Boot.

>
> Signed-off-by: Thierry Reding <treding at nvidia.com>
> ---
>  lib/vsprintf.c | 16 ++++++++++++++--
>  1 file changed, 14 insertions(+), 2 deletions(-)
>
> diff --git a/lib/vsprintf.c b/lib/vsprintf.c
> index 7ec758e40fc5..044d5551bdd0 100644
> --- a/lib/vsprintf.c
> +++ b/lib/vsprintf.c
> @@ -518,6 +518,8 @@ static char *ip4_addr_string(char *buf, char *end, u8 *addr, int field_width,
>  static char *pointer(const char *fmt, char *buf, char *end, void *ptr,
>                 int field_width, int precision, int flags)
>  {
> +       u64 num = (uintptr_t)ptr;
> +

Will this impact code size much? I suppose it is vsprintf() so it
doesn't matter too much?

>         /*
>          * Being a boot loader, we explicitly allow pointers to
>          * (physical) address null.
> @@ -530,6 +532,17 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr,
>
>  #ifdef CONFIG_CMD_NET
>         switch (*fmt) {
> +       case 'a':
> +               flags |= SPECIAL | ZEROPAD;
> +
> +               switch (fmt[1]) {
> +               case 'p':
> +               default:
> +                       field_width = sizeof(phys_addr_t) * 2 + 2;
> +                       num = *(phys_addr_t *)ptr;
> +                       break;
> +               }
> +               break;
>         case 'm':
>                 flags |= SPECIAL;
>                 /* Fallthrough */
> @@ -555,8 +568,7 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr,
>                 field_width = 2*sizeof(void *);
>                 flags |= ZEROPAD;
>         }
> -       return number(buf, end, (unsigned long)ptr, 16, field_width,
> -                     precision, flags);
> +       return number(buf, end, num, 16, field_width, precision, flags);
>  }
>
>  static int vsnprintf_internal(char *buf, size_t size, const char *fmt,
> --
> 2.0.4
>

Regards,
Simon


More information about the U-Boot mailing list