diff options
author | Thierry Reding <treding@nvidia.com> | 2014-11-13 04:26:47 +0300 |
---|---|---|
committer | Tom Rini <trini@ti.com> | 2014-11-23 14:49:01 +0300 |
commit | 1eebd14b79024f34925b79cb264242fac1bdc1b9 (patch) | |
tree | d21295fa69298fc1c9116cda4ffc8a26bc2de81f | |
parent | 59e890ef7bf5b80d96802e115255f969491ef645 (diff) | |
download | u-boot-1eebd14b79024f34925b79cb264242fac1bdc1b9.tar.xz |
vsprintf: Add modifier for phys_addr_t
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.
Signed-off-by: Thierry Reding <treding@nvidia.com>
Tested-by: Stephen Warren <swarren@nvidia.com>
Signed-off-by: Simon Glass <sjg@chromium.org>
-rw-r--r-- | lib/vsprintf.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index d84c9f5112..e0f264850f 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -515,6 +515,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; + /* * Being a boot loader, we explicitly allow pointers to * (physical) address null. @@ -527,6 +529,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 */ @@ -552,8 +565,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, |