mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-13 15:03:58 +03:00
tiny-printf: Handle formatting of %p with an extra Kconfig
The formatting with %pa / %pap behaves like %x, which results in an incorrect value being output. To improve this, a new fine-tuning Kconfig SPL_USE_TINY_PRINTF_POINTER_SUPPORT for pointer formatting has been added. If it is enabled, the output of %pa / %pap should be correct, and if it is disabled, the pointer formatting is completely unsupported. In addition to indicate unsupported formatting, '?' will be output. This allows enabling pointer formatting only when needed. For SPL_NET it is selected by default. Then it also supports the formatting with %pm, %pM and %pI4. In summery this level of %p support for tiny printf is possible now: 1) The standard tiny printf won't have support for pointer formatting. So it doesn't print misleading values for %pa, instead '?' will be output: %p => ? %pa => ?a %pap => ?ap 2) If SPL_USE_TINY_PRINTF_POINTER_SUPPORT is enabled or DEBUG is defined tiny printf supports formatting %p and %pa / %pap. 3) If SPL_NET is enabled the support of pointers is extended for %pm, %pM and %pI4. Signed-off-by: Christoph Niedermaier <cniedermaier@dh-electronics.com>
This commit is contained in:
committed by
Tom Rini
parent
0a00637157
commit
1e24e84db4
@@ -141,7 +141,7 @@ static void ip4_addr_string(struct printf_info *info, u8 *addr)
|
||||
|
||||
string(info, ip4_addr);
|
||||
}
|
||||
#endif
|
||||
#endif /* CONFIG_SPL_NET */
|
||||
|
||||
/*
|
||||
* Show a '%p' thing. A kernel extension is that the '%p' is followed
|
||||
@@ -157,18 +157,14 @@ static void ip4_addr_string(struct printf_info *info, u8 *addr)
|
||||
* decimal).
|
||||
*/
|
||||
|
||||
static void __maybe_unused pointer(struct printf_info *info, const char *fmt,
|
||||
void *ptr)
|
||||
#if defined(CONFIG_SPL_USE_TINY_PRINTF_POINTER_SUPPORT) || defined(DEBUG)
|
||||
static void pointer(struct printf_info *info, const char *fmt, void *ptr)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
unsigned long num = (uintptr_t)ptr;
|
||||
unsigned long div;
|
||||
#endif
|
||||
|
||||
switch (*fmt) {
|
||||
#ifdef DEBUG
|
||||
case 'a':
|
||||
|
||||
switch (fmt[1]) {
|
||||
case 'p':
|
||||
default:
|
||||
@@ -176,7 +172,6 @@ static void __maybe_unused pointer(struct printf_info *info, const char *fmt,
|
||||
break;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_SPL_NET
|
||||
case 'm':
|
||||
return mac_address_string(info, ptr, false);
|
||||
@@ -185,16 +180,22 @@ static void __maybe_unused pointer(struct printf_info *info, const char *fmt,
|
||||
case 'I':
|
||||
if (fmt[1] == '4')
|
||||
return ip4_addr_string(info, ptr);
|
||||
#else
|
||||
case 'm':
|
||||
case 'M':
|
||||
case 'I':
|
||||
out(info, '?');
|
||||
return;
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
|
||||
div = 1UL << (sizeof(long) * 8 - 4);
|
||||
for (; div; div /= 0x10)
|
||||
div_out(info, &num, div);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
static int _vprintf(struct printf_info *info, const char *fmt, va_list va)
|
||||
{
|
||||
@@ -269,21 +270,18 @@ static int _vprintf(struct printf_info *info, const char *fmt, va_list va)
|
||||
div_out(info, &num, div);
|
||||
}
|
||||
break;
|
||||
#if defined(CONFIG_SPL_USE_TINY_PRINTF_POINTER_SUPPORT) || defined(DEBUG)
|
||||
case 'p':
|
||||
if (CONFIG_IS_ENABLED(NET) ||
|
||||
CONFIG_IS_ENABLED(NET_LWIP) || _DEBUG) {
|
||||
pointer(info, fmt, va_arg(va, void *));
|
||||
/*
|
||||
* Skip this because it pulls in _ctype which is
|
||||
* 256 bytes, and we don't generally implement
|
||||
* pointer anyway
|
||||
*/
|
||||
while (isalnum(fmt[0]))
|
||||
fmt++;
|
||||
break;
|
||||
}
|
||||
islong = true;
|
||||
fallthrough;
|
||||
pointer(info, fmt, va_arg(va, void *));
|
||||
/*
|
||||
* Skip this because it pulls in _ctype which is
|
||||
* 256 bytes, and we don't generally implement
|
||||
* pointer anyway
|
||||
*/
|
||||
while (isalnum(fmt[0]))
|
||||
fmt++;
|
||||
break;
|
||||
#endif
|
||||
case 'x':
|
||||
case 'X':
|
||||
if (islong) {
|
||||
@@ -310,7 +308,9 @@ static int _vprintf(struct printf_info *info, const char *fmt, va_list va)
|
||||
break;
|
||||
case '%':
|
||||
out(info, '%');
|
||||
break;
|
||||
default:
|
||||
out(info, '?');
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user