
Hi Thierry,
On 26 August 2014 09:33, Thierry Reding thierry.reding@gmail.com wrote:
From: Thierry Reding treding@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@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