[U-Boot] [PATCH v3 1/1] vsprintf.c: add EFI device path printing

For debugging efi_loader we need the capability to print EFI device paths. With this patch we can write:
debug("device path: %pD", dp);
A possible output would be
device path: /MemoryMapped(0x0,0x3ff93a82,0x3ff93a82)
This enhancement is not available when building without EFI support and neither in the SPL nor in the API example.
Cc: Wolfgang Denk wd@denx.de Cc: Simon Glass sjg@chromium.org Suggested-by: Rob Clark robdclark@gmail.com Signed-off-by: Heinrich Schuchardt xypron.glpk@gmx.de --- I propose Alex picks up this patch for the EFI tree.
v3: Return -ENOMEM if out of memory. Avoid missing dependency error when building the SPL of the API example. v2: Panic if out of memory. Wolfgang suggested not to silently ignore an out of memory situation. --- examples/api/Makefile | 3 +++ lib/vsprintf.c | 47 +++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 44 insertions(+), 6 deletions(-)
diff --git a/examples/api/Makefile b/examples/api/Makefile index 899527267d4..9068727b98b 100644 --- a/examples/api/Makefile +++ b/examples/api/Makefile @@ -4,6 +4,9 @@ # SPDX-License-Identifier: GPL-2.0+ #
+# Provide symbol API_BUILD to signal that the API example is being built. +KBUILD_CPPFLAGS += -DAPI_BUILD + ifeq ($(ARCH),powerpc) LOAD_ADDR = 0x40000 endif diff --git a/lib/vsprintf.c b/lib/vsprintf.c index dd572d2868a..5447a2cc740 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -11,16 +11,17 @@ * from hush: simple_itoa() was lifted from boa-0.93.15 */
-#include <stdarg.h> -#include <linux/types.h> -#include <linux/string.h> -#include <linux/ctype.h> - #include <common.h> #include <charset.h> +#include <efi_loader.h> +#include <div64.h> #include <uuid.h> +#include <stdarg.h> +#include <linux/ctype.h> +#include <linux/err.h> +#include <linux/types.h> +#include <linux/string.h>
-#include <div64.h> #define noinline __attribute__((noinline))
/* we use this so that we can do without the ctype library */ @@ -292,6 +293,26 @@ static char *string16(char *buf, char *end, u16 *s, int field_width, return buf; }
+#if defined(CONFIG_EFI_LOADER) && \ + !defined(CONFIG_SPL_BUILD) && !defined(API_BUILD) +static char *device_path_string(char *buf, char *end, void *dp, int field_width, + int precision, int flags) +{ + u16 *str; + + if (!dp) + return "<NULL>"; + + str = efi_dp_str((struct efi_device_path *)dp); + if (!str) + return ERR_PTR(-ENOMEM); + + buf = string16(buf, end, str, field_width, precision, flags); + efi_free_pool(str); + return buf; +} +#endif + #ifdef CONFIG_CMD_NET static const char hex_asc[] = "0123456789abcdef"; #define hex_asc_lo(x) hex_asc[((x) & 0x0f)] @@ -435,6 +456,12 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr, #endif
switch (*fmt) { +#if defined(CONFIG_EFI_LOADER) && \ + !defined(CONFIG_SPL_BUILD) && !defined(API_BUILD) + case 'D': + return device_path_string(buf, end, ptr, field_width, + precision, flags); +#endif #ifdef CONFIG_CMD_NET case 'a': flags |= SPECIAL | ZEROPAD; @@ -604,6 +631,8 @@ repeat: str = pointer(fmt + 1, str, end, va_arg(args, void *), field_width, precision, flags); + if (IS_ERR(str)) + return PTR_ERR(str); /* Skip all alphanumeric pointer suffixes */ while (isalnum(fmt[1])) fmt++; @@ -768,6 +797,9 @@ int printf(const char *fmt, ...) i = vscnprintf(printbuffer, sizeof(printbuffer), fmt, args); va_end(args);
+ /* Handle error */ + if (i <= 0) + return i; /* Print the string */ puts(printbuffer); return i; @@ -784,6 +816,9 @@ int vprintf(const char *fmt, va_list args) */ i = vscnprintf(printbuffer, sizeof(printbuffer), fmt, args);
+ /* Handle error */ + if (i <= 0) + return i; /* Print the string */ puts(printbuffer); return i;

On 26 December 2017 at 03:07, Heinrich Schuchardt xypron.glpk@gmx.de wrote:
For debugging efi_loader we need the capability to print EFI device paths. With this patch we can write:
debug("device path: %pD", dp);
A possible output would be
device path: /MemoryMapped(0x0,0x3ff93a82,0x3ff93a82)
This enhancement is not available when building without EFI support and neither in the SPL nor in the API example.
Cc: Wolfgang Denk wd@denx.de Cc: Simon Glass sjg@chromium.org Suggested-by: Rob Clark robdclark@gmail.com Signed-off-by: Heinrich Schuchardt xypron.glpk@gmx.de
I propose Alex picks up this patch for the EFI tree.
v3: Return -ENOMEM if out of memory. Avoid missing dependency error when building the SPL of the API example. v2: Panic if out of memory. Wolfgang suggested not to silently ignore an out of memory situation.
examples/api/Makefile | 3 +++ lib/vsprintf.c | 47 +++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 44 insertions(+), 6 deletions(-)
Can you please add a test for this? It could go in the print unit tests, perhaps?
Regards, Simon

On 01/08/2018 04:52 AM, Simon Glass wrote:
On 26 December 2017 at 03:07, Heinrich Schuchardt xypron.glpk@gmx.de wrote:
For debugging efi_loader we need the capability to print EFI device paths. With this patch we can write:
debug("device path: %pD", dp);
A possible output would be
device path: /MemoryMapped(0x0,0x3ff93a82,0x3ff93a82)
This enhancement is not available when building without EFI support and neither in the SPL nor in the API example.
Cc: Wolfgang Denk wd@denx.de Cc: Simon Glass sjg@chromium.org Suggested-by: Rob Clark robdclark@gmail.com Signed-off-by: Heinrich Schuchardt xypron.glpk@gmx.de
I propose Alex picks up this patch for the EFI tree.
v3: Return -ENOMEM if out of memory. Avoid missing dependency error when building the SPL of the API example. v2: Panic if out of memory. Wolfgang suggested not to silently ignore an out of memory situation.
examples/api/Makefile | 3 +++ lib/vsprintf.c | 47 +++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 44 insertions(+), 6 deletions(-)
Can you please add a test for this? It could go in the print unit tests, perhaps?
Regards, Simon
test/print_ut.c is only compiled with CONFIG_SANDBOX.
It seems your patches to enable EFI_LOADER in the sandbox did not make it into v2018.01. Are you still working on these? Do you have a repo with a working copy?
Best regards
Heinrich

HI Heinrich,
On 8 January 2018 at 08:09, Heinrich Schuchardt xypron.glpk@gmx.de wrote:
On 01/08/2018 04:52 AM, Simon Glass wrote:
On 26 December 2017 at 03:07, Heinrich Schuchardt xypron.glpk@gmx.de wrote:
For debugging efi_loader we need the capability to print EFI device paths. With this patch we can write:
debug("device path: %pD", dp);
A possible output would be
device path: /MemoryMapped(0x0,0x3ff93a82,0x3ff93a82)
This enhancement is not available when building without EFI support and neither in the SPL nor in the API example.
Cc: Wolfgang Denk wd@denx.de Cc: Simon Glass sjg@chromium.org Suggested-by: Rob Clark robdclark@gmail.com Signed-off-by: Heinrich Schuchardt xypron.glpk@gmx.de
I propose Alex picks up this patch for the EFI tree.
v3: Return -ENOMEM if out of memory. Avoid missing dependency error when building the SPL of the API example. v2: Panic if out of memory. Wolfgang suggested not to silently ignore an out of memory situation.
examples/api/Makefile | 3 +++ lib/vsprintf.c | 47 +++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 44 insertions(+), 6 deletions(-)
Can you please add a test for this? It could go in the print unit tests, perhaps?
Regards, Simon
test/print_ut.c is only compiled with CONFIG_SANDBOX.
It seems your patches to enable EFI_LOADER in the sandbox did not make it into v2018.01. Are you still working on these? Do you have a repo with a working copy?
I was really not sure where to take it. It seemed that most of them were ready to apply. I didn't check who they were assigned to.
Tree is u-boot-dm/efi-working
I can certainly pick it up again, but I do need to understand what is holding it up.
Regards, Simon

On 01/08/2018 11:11 PM, Simon Glass wrote:
HI Heinrich,
On 8 January 2018 at 08:09, Heinrich Schuchardt xypron.glpk@gmx.de wrote:
On 01/08/2018 04:52 AM, Simon Glass wrote:
On 26 December 2017 at 03:07, Heinrich Schuchardt xypron.glpk@gmx.de wrote:
For debugging efi_loader we need the capability to print EFI device paths. With this patch we can write:
debug("device path: %pD", dp);
A possible output would be
device path: /MemoryMapped(0x0,0x3ff93a82,0x3ff93a82)
This enhancement is not available when building without EFI support and neither in the SPL nor in the API example.
Cc: Wolfgang Denk wd@denx.de Cc: Simon Glass sjg@chromium.org Suggested-by: Rob Clark robdclark@gmail.com Signed-off-by: Heinrich Schuchardt xypron.glpk@gmx.de
I propose Alex picks up this patch for the EFI tree.
v3: Return -ENOMEM if out of memory. Avoid missing dependency error when building the SPL of the API example. v2: Panic if out of memory. Wolfgang suggested not to silently ignore an out of memory situation.
examples/api/Makefile | 3 +++ lib/vsprintf.c | 47 +++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 44 insertions(+), 6 deletions(-)
Can you please add a test for this? It could go in the print unit tests, perhaps?
Regards, Simon
test/print_ut.c is only compiled with CONFIG_SANDBOX.
It seems your patches to enable EFI_LOADER in the sandbox did not make it into v2018.01. Are you still working on these? Do you have a repo with a working copy?
I was really not sure where to take it. It seemed that most of them were ready to apply. I didn't check who they were assigned to.
Tree is u-boot-dm/efi-working
I can certainly pick it up again, but I do need to understand what is holding it up.
Regards, Simon
The patch series https://patchwork.ozlabs.org/project/uboot/list/?series=16686 is assigned to Alex.
There are some unanswered review comments.
Best regards
Heinrich
participants (2)
-
Heinrich Schuchardt
-
Simon Glass