Message ID | 20170809231441.22691-5-robdclark@gmail.com |
---|---|
State | Superseded |
Delegated to: | Tom Rini |
Headers | show |
On 08/10/2017 01:14 AM, Rob Clark wrote: > This works (roughly) the same way as linux's, but we currently always > print lower-case (ie. we just keep %pUB and %pUL for compat with linux), > mostly just because that is what uuid_bin_to_str() supports. > > %pUb: 01020304-0506-0708-090a-0b0c0d0e0f10 > %pUl: 04030201-0605-0807-090a-0b0c0d0e0f10 > > It will be used by a later efi_loader paths for efi variables and for > device-path-to-text protocol, and also quite useful for debug prints > of protocol GUIDs. > > Signed-off-by: Rob Clark <robdclark@gmail.com> > --- > examples/api/Makefile | 1 + > include/config_fallbacks.h | 1 + > lib/vsprintf.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-- > 3 files changed, 46 insertions(+), 2 deletions(-) > > diff --git a/examples/api/Makefile b/examples/api/Makefile > index 87c15d0f68..899527267d 100644 > --- a/examples/api/Makefile > +++ b/examples/api/Makefile > @@ -35,6 +35,7 @@ EXT_COBJ-y += lib/string.o > EXT_COBJ-y += lib/time.o > EXT_COBJ-y += lib/vsprintf.o > EXT_COBJ-y += lib/charset.o > +EXT_COBJ-$(CONFIG_LIB_UUID) += lib/uuid.o > EXT_SOBJ-$(CONFIG_PPC) += arch/powerpc/lib/ppcstring.o > ifeq ($(ARCH),arm) > EXT_SOBJ-$(CONFIG_USE_ARCH_MEMSET) += arch/arm/lib/memset.o > diff --git a/include/config_fallbacks.h b/include/config_fallbacks.h > index 961a83d758..56b9de09f2 100644 > --- a/include/config_fallbacks.h > +++ b/include/config_fallbacks.h > @@ -57,6 +57,7 @@ > > #if (CONFIG_IS_ENABLED(PARTITION_UUIDS) || \ > CONFIG_IS_ENABLED(EFI_PARTITION) || \ > + CONFIG_IS_ENABLED(EFI_LOADER) || \ > defined(CONFIG_RANDOM_UUID) || \ > defined(CONFIG_CMD_UUID) || \ > defined(CONFIG_BOOTP_PXE)) && \ > diff --git a/lib/vsprintf.c b/lib/vsprintf.c > index 0678b49b01..71a995dee0 100644 > --- a/lib/vsprintf.c > +++ b/lib/vsprintf.c > @@ -18,6 +18,7 @@ > > #include <common.h> > #include <charset.h> > +#include <uuid.h> > > #include <div64.h> > #define noinline __attribute__((noinline)) > @@ -366,6 +367,40 @@ static char *ip4_addr_string(char *buf, char *end, u8 *addr, int field_width, > } > #endif > > +#ifdef CONFIG_LIB_UUID > +/* > + * This works (roughly) the same way as linux's, but we currently always > + * print lower-case (ie. we just keep %pUB and %pUL for compat with linux), > + * mostly just because that is what uuid_bin_to_str() supports. > + * > + * %pUb: 01020304-0506-0708-090a-0b0c0d0e0f10 > + * %pUl: 04030201-0605-0807-090a-0b0c0d0e0f10 > + */ > +static char *uuid_string(char *buf, char *end, u8 *addr, int field_width, > + int precision, int flags, const char *fmt) > +{ > + char uuid[UUID_STR_LEN + 1]; > + int str_format = UUID_STR_FORMAT_STD; > + > + switch (*(++fmt)) { > + case 'L': > + case 'l': > + str_format = UUID_STR_FORMAT_GUID; > + break; > + case 'B': > + case 'b': > + /* this is the default */ > + break; > + default: > + break; > + } > + > + uuid_bin_to_str(addr, uuid, str_format); > + > + return string(buf, end, uuid, field_width, precision, flags); > +} > +#endif > + > /* > * Show a '%p' thing. A kernel extension is that the '%p' is followed > * by an extra set of alphanumeric characters that are extended format > @@ -399,8 +434,8 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr, > flags); > #endif > > -#ifdef CONFIG_CMD_NET > switch (*fmt) { > +#ifdef CONFIG_CMD_NET > case 'a': > flags |= SPECIAL | ZEROPAD; > > @@ -430,8 +465,15 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr, > precision, flags); > flags &= ~SPECIAL; > break; > - } > #endif > +#ifdef CONFIG_LIB_UUID > + case 'U': > + return uuid_string(buf, end, ptr, field_width, precision, > + flags, fmt); > +#endif > + default: > + break; > + } > flags |= SMALL; > if (field_width == -1) { > field_width = 2*sizeof(void *); > Successfully tested printing using %pUl with a patch under development on arm64. Tested-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
diff --git a/examples/api/Makefile b/examples/api/Makefile index 87c15d0f68..899527267d 100644 --- a/examples/api/Makefile +++ b/examples/api/Makefile @@ -35,6 +35,7 @@ EXT_COBJ-y += lib/string.o EXT_COBJ-y += lib/time.o EXT_COBJ-y += lib/vsprintf.o EXT_COBJ-y += lib/charset.o +EXT_COBJ-$(CONFIG_LIB_UUID) += lib/uuid.o EXT_SOBJ-$(CONFIG_PPC) += arch/powerpc/lib/ppcstring.o ifeq ($(ARCH),arm) EXT_SOBJ-$(CONFIG_USE_ARCH_MEMSET) += arch/arm/lib/memset.o diff --git a/include/config_fallbacks.h b/include/config_fallbacks.h index 961a83d758..56b9de09f2 100644 --- a/include/config_fallbacks.h +++ b/include/config_fallbacks.h @@ -57,6 +57,7 @@ #if (CONFIG_IS_ENABLED(PARTITION_UUIDS) || \ CONFIG_IS_ENABLED(EFI_PARTITION) || \ + CONFIG_IS_ENABLED(EFI_LOADER) || \ defined(CONFIG_RANDOM_UUID) || \ defined(CONFIG_CMD_UUID) || \ defined(CONFIG_BOOTP_PXE)) && \ diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 0678b49b01..71a995dee0 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -18,6 +18,7 @@ #include <common.h> #include <charset.h> +#include <uuid.h> #include <div64.h> #define noinline __attribute__((noinline)) @@ -366,6 +367,40 @@ static char *ip4_addr_string(char *buf, char *end, u8 *addr, int field_width, } #endif +#ifdef CONFIG_LIB_UUID +/* + * This works (roughly) the same way as linux's, but we currently always + * print lower-case (ie. we just keep %pUB and %pUL for compat with linux), + * mostly just because that is what uuid_bin_to_str() supports. + * + * %pUb: 01020304-0506-0708-090a-0b0c0d0e0f10 + * %pUl: 04030201-0605-0807-090a-0b0c0d0e0f10 + */ +static char *uuid_string(char *buf, char *end, u8 *addr, int field_width, + int precision, int flags, const char *fmt) +{ + char uuid[UUID_STR_LEN + 1]; + int str_format = UUID_STR_FORMAT_STD; + + switch (*(++fmt)) { + case 'L': + case 'l': + str_format = UUID_STR_FORMAT_GUID; + break; + case 'B': + case 'b': + /* this is the default */ + break; + default: + break; + } + + uuid_bin_to_str(addr, uuid, str_format); + + return string(buf, end, uuid, field_width, precision, flags); +} +#endif + /* * Show a '%p' thing. A kernel extension is that the '%p' is followed * by an extra set of alphanumeric characters that are extended format @@ -399,8 +434,8 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr, flags); #endif -#ifdef CONFIG_CMD_NET switch (*fmt) { +#ifdef CONFIG_CMD_NET case 'a': flags |= SPECIAL | ZEROPAD; @@ -430,8 +465,15 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr, precision, flags); flags &= ~SPECIAL; break; - } #endif +#ifdef CONFIG_LIB_UUID + case 'U': + return uuid_string(buf, end, ptr, field_width, precision, + flags, fmt); +#endif + default: + break; + } flags |= SMALL; if (field_width == -1) { field_width = 2*sizeof(void *);
This works (roughly) the same way as linux's, but we currently always print lower-case (ie. we just keep %pUB and %pUL for compat with linux), mostly just because that is what uuid_bin_to_str() supports. %pUb: 01020304-0506-0708-090a-0b0c0d0e0f10 %pUl: 04030201-0605-0807-090a-0b0c0d0e0f10 It will be used by a later efi_loader paths for efi variables and for device-path-to-text protocol, and also quite useful for debug prints of protocol GUIDs. Signed-off-by: Rob Clark <robdclark@gmail.com> --- examples/api/Makefile | 1 + include/config_fallbacks.h | 1 + lib/vsprintf.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 46 insertions(+), 2 deletions(-)