From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-vk1-f169.google.com (mail-vk1-f169.google.com [209.85.221.169]) by mx.groups.io with SMTP id smtpd.web08.14864.1657661600947785411 for ; Tue, 12 Jul 2022 14:33:21 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@gmail.com header.s=20210112 header.b=p7JEtRE1; spf=pass (domain: gmail.com, ip: 209.85.221.169, mailfrom: pedro.falcato@gmail.com) Received: by mail-vk1-f169.google.com with SMTP id m188so4360083vkm.3 for ; Tue, 12 Jul 2022 14:33:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=eVvCeM1cSlP2RMHazOO/Kx3a0HNt4riTX+p2/MNaqcI=; b=p7JEtRE1APEY5FyDFzAkT1i7L3R9jtHW0Sn5uHVc/+6FtUAmGTq9gLzziynr6NEn5D 5qiOkXyfTNiXLb6eBv/WTZYzm8PVzAxSINOng1Vo6r5o8q511oErxA887lTbOsxb12Ew Gc9xi54fdzHIH9jD7Dfm69C6ymuQImrD/SKZdODq6wHwrSjK7H2f3Os1ui1h09HRt9JA xavSIyQ574cX4JvcWBGe4bZCpF4wDQ7Mjt37zlhDBqrKaWesoOZSqaC4RuqzUujlQiWC HXKxHQQ7X3YJs7al/vDAgG55Q0Ffn0HfJJUaOeF1UKJY7/jsu+c5y4zRLV8GndSfxyxS kqMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=eVvCeM1cSlP2RMHazOO/Kx3a0HNt4riTX+p2/MNaqcI=; b=l5UuszPM/0H0MI4cb95WahkQ8/4zFDdpZljLCo8GRJizHZ0WKxts0vVC0hGC8HQuL7 nJ5BsiJIzkJKQK1gUCKmEHYMn/DFz56uAAq3QislFapYU2hZ/bRTvZ7YvBKRUcCTo28n F2DDiJg1+r8hCm+pf3UjXipoqAh6dNDCbpt8w5WFP604NwmdLRQRGS/+Eqf+EqgE7aHT 9ijJsBxpeGSzcQTOqazU0f4LHX6txRHVWUqXw65SigjDWrEBmGZYavqgkmzreLBp6grJ n9lva6yIdBpa0NaWD0l0uXU6FBY7mINhRM68J2BwhVGa2PEJMX0tTe1JrdPGyt6ZLZnA ZIUw== X-Gm-Message-State: AJIora8KOKkAh5DTXVpn+exOuwNu3YxsYZZ2dVOWS06cxgozSHVzu6IY 96niThZ/LnYJJPmNt9gNP3VBHv5nnVWEm9Fd0PTglenUl/INgw== X-Google-Smtp-Source: AGRyM1vK7b8j8cUWzgWvetCNT4jb31ERe4sNYYJAda9kTMrqNZRI8nU1lGTboceofEpHA/s1MLpyomNJEfc30XrdGO4= X-Received: by 2002:a1f:9e92:0:b0:374:cefe:51f5 with SMTP id h140-20020a1f9e92000000b00374cefe51f5mr111939vke.7.1657661599890; Tue, 12 Jul 2022 14:33:19 -0700 (PDT) MIME-Version: 1.0 References: <20220705011622.351454-1-pedro.falcato@gmail.com> In-Reply-To: From: "Pedro Falcato" Date: Tue, 12 Jul 2022 22:33:08 +0100 Message-ID: Subject: Re: [edk2-devel] [PATCH v2] MdePkg/BasePrintLib: Add %z specifier To: edk2-devel-groups-io , "Kinney, Michael D" Cc: "Andrew Fish (afish@apple.com)" , "Gao, Liming" , "Liu, Zhiguang" Content-Type: multipart/alternative; boundary="000000000000d1c2c705e3a26afb" --000000000000d1c2c705e3a26afb Content-Type: text/plain; charset="UTF-8" On Tue, Jul 12, 2022 at 9:46 PM Michael D Kinney wrote: > Hi Pedro, > > > > There is a good brief description of size_t on this page: > > https://en.wikipedia.org/wiki/C_data_types > > > > sizeof() is built into the C compiler, but size_t is defined by the std C > lib being used. It can be as small as 16-bits. > > > > We do not use the std C lib, so size_t is not defined when we do EDK II > builds. This means we do not know how large the value sizeof() returns > is. > Hi Mike, The C standard library and the compiler usually work together and need to agree on how large each type is (uint8_t, uint16_t, uint32_t, uint64_t, size_t), just like EDK2 does for its types. The definition of "implementation" (which encompasses both the compiler and the C standard library) is intentionally vague (as is a good chunk of the C standard) but essentially maps to "whatever makes your program run on a standard C environment". > > > However, your request is to support printing values of type UINTN in the > PrintLib. I agree this feature is not present today. Adding in a new > format specifier would be required. > > > > Using %z may be confusing because size_t defined by a C lib we are not > using and UINTN defined in the UEFI Spec are not the same. > Using %z makes sense because in practice (and almost by definition, although not technically) UINTN will hold the native word size, and so will size_t. UINTN is used all over the place in UEFI to represent lengths of things in memory, and so is size_t in standard C codebases. Even if we go by both standards' definition of size_t and UINTN ( "unsigned integer type of the result of the sizeof operator" vs "Unsigned value of native width" ), since the two types in every platform we will ever support[1] map to the same concept and the same type, I would defend the use of %z for UINTN. > > > Do you have a suggestion for a different specifier that perhaps is not > used in the ANSI C printf() format string? > I believe we have quite a good amount of specifiers that are not reserved but I think those would be better used for really non-standard types instead of UINTN (which is effectively a size_t). > > > If we do want a 100% ANSI C conformant version of a print library, then I > agree this would require a new library class and we would need to use > different API names so the caller knows which format string style to use. > Agreed. [1] In fact, I would dare to say that if there ever was a modern machine that we ported UEFI to, that had addresses/sizeof() > native word size, a lot of code would implicitly break as UINTN takes the role of a size_t in UEFI. As a quick example, all interfaces in boot services and runtime services that deal with memory length/size take a UINTN. This should be clarified in the spec (unless it's written down somewhere and I don't see it). My interpretation of both standards leads me to conclude that both size_t and UINTN are intended to be used to represent addresses and lengths in memory. All the best, Pedro > > There is a long history associated with the format string defined in > PrintLib today. Mostly related to size optimizations of the PrintLib > when FLASH devices were much, much smaller. > > > > Mike > > > *From:* devel@edk2.groups.io *On Behalf Of *Pedro > Falcato > *Sent:* Wednesday, July 6, 2022 3:27 PM > *To:* Kinney, Michael D > *Cc:* devel@edk2.groups.io; Andrew Fish (afish@apple.com) ; > Gao, Liming ; Liu, Zhiguang < > zhiguang.liu@intel.com> > *Subject:* Re: [edk2-devel] [PATCH v2] MdePkg/BasePrintLib: Add %z > specifier > > > > On Wed, Jul 6, 2022 at 7:22 PM Kinney, Michael D < > michael.d.kinney@intel.com> wrote: > > Hi Pedro, > > This is an interesting feature. > > It is backwards compatible since you are adding a format specifier to the > PrintLib class. > > There is a 2nd lib instance that needs to be updated, and that is > DxePrintLibPrint2Protocol in MdeModulePkg. > > I think using ANSI C %z specifier syntax assumes that sizeof(size_t) == > sizeof(UINTN) for all supported compilers/CPU archs. > The ANSI C 99 specification does not state that this is always true. If > may be true in practice for the compiler/CPU archs > currently supported by Tianocore. > > > It would be good to add a STATIC_ASSERT() to check that this is true and > break the build if a compiler+CPU combination > is used where that assumption is false. Not sure if this should go in > Base.h with other STATIC_ASSERT()s for > types. Or if it should go in PrintLib.h where this assumption is being > made. > > > > > Hi Mike, > > How can sizeof(size_t) != sizeof(UINTN)? It seems to be quite a stretch to > interpret the standard in a way that the native word size will not be able > to store "the maximum size of a theoretically possible object of any type". > In any case, getting the size_t type is non-trivial and as far as I can > tell would either depend on a C library or C extension trickery to try to > get the type of sizeof(Type). > > > > I would like to see some more background on the motivation for adding this > feature. > I think the current workaround would be to typecast and integer of type > size_t to UINT64 and use %Ld or > typecase to UINT32 and use %d. > > > > Ok, some background: I essentially starting looking at DebugLib and > PrintLib and I found myself very surprised by a good chunk of decisions. > The API is very similar to standard printf() but it lacks support for a > good portion of specifiers; some specifiers it implements don't have the > C99 standard meaning, like the ones it implements for integers (%x and %lx > for hex, for instance) which were non-obviously overridden to mean print > UINT32 and print UINT64. Because of that, I feel that maybe reworking this > library (creating PrintLib2 or something, since we can't break the existing > uses) would be a good idea to have a "principle of least surprise" > compliant API and would help smoothen the confusion curve between userspace > code and EDK2 firmware. > > > > Since reworking the whole of PrintLib is a non-trivial amount of work, I > settled for this very tiny feature that doesn't break anyone's code and is > very handy to avoid odd workarounds like casting everything to a UINT64 so > you can print it with %lx. Obviously, if there's interest in getting a more > standard environment[1] in EDK2 (and I personally, although possibly > naiively, don't see the downside), going down a PrintLib2 in the long haul > is a good idea. But this patch took me around 10 minutes to write up and is > probably useful in its current form. > > > > Thanks, > > > > Pedro > > > > [1] Why do I want to get a more standardized environment? Well, I simply > believe it smoothens the learning curve between userspace -> kernel -> > bootloader -> firmware. A good chunk of kernels and bootloaders already > have relatively standard C APIs, but firmware, at least in our case, is > still lacking. Also, makes you less prone to mistakes. > > > Thanks, > > Mike > > > > -----Original Message----- > > From: devel@edk2.groups.io On Behalf Of Pedro > Falcato > > Sent: Monday, July 4, 2022 6:16 PM > > To: devel@edk2.groups.io > > Cc: Kinney, Michael D ; Gao, Liming < > gaoliming@byosoft.com.cn>; Liu, Zhiguang > > > > Subject: [edk2-devel] [PATCH v2] MdePkg/BasePrintLib: Add %z specifier > > > > BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3977 > > > > %z is used in standard C99 as the printf specifier for size_t types. > > Add support for it so we can portably print UINTN. > > > > Cc: Michael D Kinney > > Cc: Liming Gao > > Cc: Zhiguang Liu > > Signed-off-by: Pedro Falcato > > --- > > MdePkg/Include/Library/PrintLib.h | 13 ++++++++----- > > MdePkg/Library/BasePrintLib/PrintLibInternal.c | 9 +++++++++ > > MdePkg/Library/BasePrintLib/PrintLibInternal.h | 1 + > > 3 files changed, 18 insertions(+), 5 deletions(-) > > > > diff --git a/MdePkg/Include/Library/PrintLib.h > b/MdePkg/Include/Library/PrintLib.h > > index 8d523cac52..0d67f62d3f 100644 > > --- a/MdePkg/Include/Library/PrintLib.h > > +++ b/MdePkg/Include/Library/PrintLib.h > > @@ -42,6 +42,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent > > - L, l > > - The number being printed is size UINT64. Only valid for types > X, x, and d. > > If this flag is not specified, then the number being printed is > size int. > > + - z > > + - The number being printed is of size UINTN. Only valid for types > X, x and d. > > + If this flag is not specified, then the number being printed is > size int. > > - NOTE: All invalid flags are ignored. > > > > [width]: > > @@ -73,18 +76,18 @@ SPDX-License-Identifier: BSD-2-Clause-Patent > > using this type too by making sure bits 8..15 of the argument > are set to 0. > > - x > > - The argument is an unsigned hexadecimal number. The characters > used are 0..9 and > > - A..F. If the flag 'L' is not specified, then the argument is > assumed > > + A..F. If the flags 'L', 'z' are not specified, then the > argument is assumed > > to be size int. This does not follow ANSI C. > > - X > > - The argument is an unsigned hexadecimal number and the number > is padded with > > - zeros. This is equivalent to a format string of "0x". If the > flag > > - 'L' is not specified, then the argument is assumed to be size > int. > > + zeros. This is equivalent to a format string of "0x". If the > flags > > + 'L', 'z' are not specified, then the argument is assumed to be > size int. > > This does not follow ANSI C. > > - d > > - - The argument is a signed decimal number. If the flag 'L' is > not specified, > > + - The argument is a signed decimal number. If the flags 'L', 'z' > are not specified, > > then the argument is assumed to be size int. > > - u > > - - The argument is a unsigned decimal number. If the flag 'L' is > not specified, > > + - The argument is a unsigned decimal number. If the flags 'L'. > 'z' are not specified, > > then the argument is assumed to be size int. > > - p > > - The argument is a pointer that is a (VOID *), and it is printed > as an > > diff --git a/MdePkg/Library/BasePrintLib/PrintLibInternal.c > b/MdePkg/Library/BasePrintLib/PrintLibInternal.c > > index 42b598a432..1cd99b2213 100644 > > --- a/MdePkg/Library/BasePrintLib/PrintLibInternal.c > > +++ b/MdePkg/Library/BasePrintLib/PrintLibInternal.c > > @@ -720,6 +720,9 @@ BasePrintLibSPrintMarker ( > > case 'l': > > Flags |= LONG_TYPE; > > break; > > + case 'z': > > + Flags |= SIZET_TYPE; > > + break; > > case '*': > > if ((Flags & PRECISION) == 0) { > > Flags |= PAD_TO_WIDTH; > > @@ -833,6 +836,12 @@ BasePrintLibSPrintMarker ( > > } else { > > Value = BASE_ARG (BaseListMarker, int); > > } > > + } else if ((Flags & SIZET_TYPE) != 0) { > > + if (BaseListMarker == NULL) { > > + Value = VA_ARG (VaListMarker, UINTN); > > + } else { > > + Value = BASE_ARG (BaseListMarker, UINTN); > > + } > > } else { > > if (BaseListMarker == NULL) { > > Value = VA_ARG (VaListMarker, INT64); > > diff --git a/MdePkg/Library/BasePrintLib/PrintLibInternal.h > b/MdePkg/Library/BasePrintLib/PrintLibInternal.h > > index 34d591c6fc..9193e6192b 100644 > > --- a/MdePkg/Library/BasePrintLib/PrintLibInternal.h > > +++ b/MdePkg/Library/BasePrintLib/PrintLibInternal.h > > @@ -29,6 +29,7 @@ > > #define ARGUMENT_REVERSED BIT12 > > #define COUNT_ONLY_NO_PRINT BIT13 > > #define UNSIGNED_TYPE BIT14 > > +#define SIZET_TYPE BIT15 > > > > // > > // Record date and time information > > -- > > 2.37.0 > > > > > > > > > > > > > > -- > > Pedro Falcato > > > > -- Pedro Falcato --000000000000d1c2c705e3a26afb Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable


=
On Tue, Jul 12, 2022 at 9:46 PM Micha= el D Kinney <michael.d.kin= ney@intel.com> wrote:

Hi Pedro,

=C2=A0

There is a good brief description of size_t on= this page:

https://en.wikipedia= .org/wiki/C_data_types

=C2=A0

sizeof() is built into the C compiler, but siz= e_t is defined by the std C lib being used.=C2=A0 It can be as small as 16-bits.

=C2=A0

We do not use the std C lib, so size_t is not = defined when we do EDK II builds.=C2=A0 This means we do not know how large the value sizeof() returns is.=C2=A0

Hi Mike,
=C2=A0
The C standard library and the compiler usually work together = and need to agree on how large each type is (uint8_t, uint16_t, uint32_t, u= int64_t, size_t), just like EDK2 does for its types. The definition of &quo= t;implementation" (which encompasses both the compiler and the C stand= ard library) is intentionally vague (as is a good chunk of the C standard) = but essentially maps to "whatever makes your program run on a standard= C environment".

=

=C2=A0

However, your request is to support printing v= alues of type UINTN in the PrintLib.=C2=A0 I agree this feature is not present today.=C2=A0 Adding in a new format specifier would be required.

=C2=A0

Using %z may be confusing because size_t defin= ed by a C lib we are not using and UINTN defined in the UEFI Spec are not t= he same.

=C2=A0
Using %z = makes sense because in practice (and almost by definition, although not tec= hnically) UINTN will hold the native word size, and so will size_t. UINTN i= s used all over the place in UEFI to represent lengths of things in memory,= and so is size_t in standard C codebases. Even if we go by both standards&= #39; definition of size_t and UINTN ( "unsigned integer type of the re= sult of the sizeof operator" vs "Unsigned value of native width&q= uot; ), since the two types in every platform we will ever support[1] map t= o the same concept and the same type, I would defend the use of %z for UINT= N.

=C2=A0

Do you have a suggestion for a different speci= fier that perhaps is not used in the ANSI C printf() format string?<= /p>

I believe we have quite a good amount of s= pecifiers that are not reserved but I think those would be better used for = really non-standard types instead of UINTN (which is effectively a size_t).= =C2=A0

=C2=A0

If we do want a 100% ANSI C conformant version= of a print library, then I agree this would require a new library class an= d we would need to use different API names so the caller knows which format string style to use.

=
Agreed.

[1] In fact, I would dare to say that= if there ever was a modern machine that we ported UEFI to, that had addresses/sizeof() > native word=20 size, a lot of code would implicitly break as UINTN takes the role of a=20 size_t in UEFI. As a quick example, all interfaces in boot services and=20 runtime services that deal with memory length/size take a UINTN. This=20 should be clarified in the spec (unless it's written down somewhere and= I don't see it). My interpretation of both standards leads me to conclud= e that both size_t and UINTN are intended to be used to represent addresses= and lengths in memory.

All the best,
Pedro

=C2=A0

There is a long history associated with the fo= rmat string defined in PrintLib today.=C2=A0 Mostly related to size optimizations of the PrintLib when FLASH devi= ces were much, much smaller.

=C2=A0

Mike

<= blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-l= eft:1px solid rgb(204,204,204);padding-left:1ex">

=C2=A0

From: devel@edk2.groups.io <devel@edk2.groups.io= > On Behalf Of Pedro Falcato
Sent: Wednesday, July 6, 2022 3:27 PM
To: Kinney, Michael D <michael.d.kinney@intel.com>
Cc: devel@= edk2.groups.io; Andrew Fish (afish@apple.com) <afish@apple.com>; Gao, Liming <gaoliming@byosoft.com.cn>= ; Liu, Zhiguang <zhiguang.liu@intel.com>
Subject: Re: [edk2-devel] [PATCH v2] MdePkg/BasePrintLib: Add %z spe= cifier

=C2=A0

On Wed, Jul 6, 2022 at 7:22 PM Kinney, Michael D <= ;michael.d.= kinney@intel.com> wrote:

Hi Pedro,

This is an interesting feature.

It is backwards compatible since you are adding a format specifier to the P= rintLib class.

There is a 2nd lib instance that needs to be updated, and that is DxePrintL= ibPrint2Protocol in MdeModulePkg.

I think using ANSI C %z specifier syntax assumes that sizeof(size_t) =3D=3D= sizeof(UINTN) for all supported compilers/CPU archs.
The ANSI C 99 specification does not state that this is always true.=C2=A0 = If may be true in practice for the compiler/CPU archs
currently supported by Tianocore.


It would be good to add a STATIC_ASSERT() to check that this is true and br= eak the build if a compiler+CPU combination
is used where that assumption is false.=C2=A0 Not sure if this should go in= Base.h with other STATIC_ASSERT()s for
types.=C2=A0 Or if it should go in PrintLib.h where this assumption is bein= g made.
=C2=A0

=C2=A0

Hi Mike,

How can sizeof(size_t) !=3D sizeof(UINTN)? It seems = to be quite a stretch to interpret the standard in a way that the native wo= rd size will not be able to store "the maximum size of a theoretically= possible object of any type". In any case, getting the size_t type is non-trivial and as far as I can tell would eith= er depend on a C library or C extension trickery to try to get the type of = sizeof(Type).

=C2=A0

I would like to see some more background on the moti= vation for adding this feature.
I think the current workaround would be to typecast and integer of type siz= e_t to UINT64 and use %Ld or
typecase to UINT32 and use %d.

=C2=A0

Ok, some background: I essentially starting looking = at DebugLib and PrintLib and I found myself very surprised by a good chunk = of decisions. The API is very similar to standard printf() but it lacks sup= port for a good portion of specifiers; some specifiers it implements don't have the C99 standard meaning, lik= e the ones it implements for integers (%x and %lx for hex, for instance) wh= ich were non-obviously overridden to mean print UINT32 and print UINT64. Be= cause of that, I feel that maybe reworking this library (creating PrintLib2 or something, since we can't break th= e existing uses) would be a good idea to have a "principle of least su= rprise" compliant API and would help smoothen the confusion curve betw= een userspace code and EDK2 firmware.

=C2=A0

Since reworking the whole of PrintLib is a non-trivi= al amount of work, I settled for this very tiny feature that doesn't br= eak anyone's code and is very handy to avoid odd workarounds like casti= ng everything to a UINT64 so you can print it with %lx. Obviously, if there's interest in getting a more standard= environment[1] in EDK2 (and I personally, although possibly naiively, don&= #39;t see the downside), going down a PrintLib2 in the long haul is a good = idea. But this patch took me around 10 minutes to write up and is probably useful in its current form.

=C2=A0

Thanks,

=C2=A0

Pedro

=C2=A0

[1] Why do I want to get a more standardized environ= ment? Well, I simply believe it smoothens the learning curve between usersp= ace -> kernel -> bootloader -> firmware. A good chunk of kernels a= nd bootloaders already have relatively standard C APIs, but firmware, at least in our case, is still lacking. Also, makes = you less prone to mistakes.


Thanks,

Mike


> -----Original Message-----
> From: devel@= edk2.groups.io <devel@edk2.groups.io> On Behalf Of Pedro Falcato
> Sent: Monday, July 4, 2022 6:16 PM
> To: devel@ed= k2.groups.io
> Cc: Kinney, Michael D <michael.d.kinney@intel.com>; Gao, Liming <gaoliming@byosof= t.com.cn>; Liu, Zhiguang
> <zhigua= ng.liu@intel.com>
> Subject: [edk2-devel] [PATCH v2] MdePkg/BasePrintLib: Add %z specifier=
>
> BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3977
>
> %z is used in standard C99 as the printf specifier for size_t types. > Add support for it so we can portably print UINTN.
>
> Cc: Michael D Kinney <michael.d.kinney@intel.com>
> Cc: Liming Gao <gaoliming@byosoft.com.cn>
> Cc: Zhiguang Liu <zhiguang.liu@intel.com>
> Signed-off-by: Pedro Falcato <pedro.falcato@gmail.com>
> ---
>=C2=A0 MdePkg/Include/Library/PrintLib.h=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 | 13 ++++++++-----
>=C2=A0 MdePkg/Library/BasePrintLib/PrintLibInternal.c |=C2=A0 9 +++++++= ++
>=C2=A0 MdePkg/Library/BasePrintLib/PrintLibInternal.h |=C2=A0 1 +
>=C2=A0 3 files changed, 18 insertions(+), 5 deletions(-)
>
> diff --git a/MdePkg/Include/Library/PrintLib.h b/MdePkg/Include/Librar= y/PrintLib.h
> index 8d523cac52..0d67f62d3f 100644
> --- a/MdePkg/Include/Library/PrintLib.h
> +++ b/MdePkg/Include/Library/PrintLib.h
> @@ -42,6 +42,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
>=C2=A0 =C2=A0 =C2=A0 - L, l
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 - The number being printed is size UINT64.= =C2=A0 Only valid for types X, x, and d.
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 If this flag is not specified, then = the number being printed is size int.
> +=C2=A0 =C2=A0 - z
> +=C2=A0 =C2=A0 =C2=A0 - The number being printed is of size UINTN. Onl= y valid for types X, x and d.
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 If this flag is not specified, then the n= umber being printed is size int.
>=C2=A0 =C2=A0 =C2=A0 - NOTE: All invalid flags are ignored.
>
>=C2=A0 =C2=A0 [width]:
> @@ -73,18 +76,18 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 using this type too by making sure b= its 8..15 of the argument are set to 0.
>=C2=A0 =C2=A0 =C2=A0 - x
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 - The argument is an unsigned hexadecimal n= umber.=C2=A0 The characters used are 0..9 and
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 A..F.=C2=A0 If the flag 'L' is no= t specified, then the argument is assumed
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 A..F.=C2=A0 If the flags 'L', = 9;z' are not specified, then the argument is assumed
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 to be size int.=C2=A0 This does not = follow ANSI C.
>=C2=A0 =C2=A0 =C2=A0 - X
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 - The argument is an unsigned hexadecimal n= umber and the number is padded with
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 zeros.=C2=A0 This is equivalent to a form= at string of "0x". If the flag
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 'L' is not specified, then the ar= gument is assumed to be size int.
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 zeros.=C2=A0 This is equivalent to a form= at string of "0x". If the flags
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 'L', 'z' are not specifie= d, then the argument is assumed to be size int.
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 This does not follow ANSI C.
>=C2=A0 =C2=A0 =C2=A0 - d
> -=C2=A0 =C2=A0 =C2=A0 - The argument is a signed decimal number.=C2=A0= If the flag 'L' is not specified,
> +=C2=A0 =C2=A0 =C2=A0 - The argument is a signed decimal number.=C2=A0= If the flags 'L', 'z' are not specified,
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 then the argument is assumed to be s= ize int.
>=C2=A0 =C2=A0 =C2=A0 - u
> -=C2=A0 =C2=A0 =C2=A0 - The argument is a unsigned decimal number.=C2= =A0 If the flag 'L' is not specified,
> +=C2=A0 =C2=A0 =C2=A0 - The argument is a unsigned decimal number.=C2= =A0 If the flags 'L'. 'z' are not specified,
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 then the argument is assumed to be s= ize int.
>=C2=A0 =C2=A0 =C2=A0 - p
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 - The argument is a pointer that is a (VOID= *), and it is printed as an
> diff --git a/MdePkg/Library/BasePrintLib/PrintLibInternal.c b/MdePkg/L= ibrary/BasePrintLib/PrintLibInternal.c
> index 42b598a432..1cd99b2213 100644
> --- a/MdePkg/Library/BasePrintLib/PrintLibInternal.c
> +++ b/MdePkg/Library/BasePrintLib/PrintLibInternal.c
> @@ -720,6 +720,9 @@ BasePrintLibSPrintMarker (
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 'l':
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Flags |=3D LONG= _TYPE;
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break;
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 'z':
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Flags |=3D SIZET_TYP= E;
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break;
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case '*':
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if ((Flags &= ; PRECISION) =3D=3D 0) {
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Flags |= =3D PAD_TO_WIDTH;
> @@ -833,6 +836,12 @@ BasePrintLibSPrintMarker (
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 } else {
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Value = =3D BASE_ARG (BaseListMarker, int);
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 } else if ((Flags & SIZ= ET_TYPE) !=3D 0) {
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (BaseListMarker = =3D=3D NULL) {
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Value =3D VA_= ARG (VaListMarker, UINTN);
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 } else {
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Value =3D BAS= E_ARG (BaseListMarker, UINTN);
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 } else {
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (BaseListMar= ker =3D=3D NULL) {
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Value = =3D VA_ARG (VaListMarker, INT64);
> diff --git a/MdePkg/Library/BasePrintLib/PrintLibInternal.h b/MdePkg/L= ibrary/BasePrintLib/PrintLibInternal.h
> index 34d591c6fc..9193e6192b 100644
> --- a/MdePkg/Library/BasePrintLib/PrintLibInternal.h
> +++ b/MdePkg/Library/BasePrintLib/PrintLibInternal.h
> @@ -29,6 +29,7 @@
>=C2=A0 #define ARGUMENT_REVERSED=C2=A0 =C2=A0 BIT12
>=C2=A0 #define COUNT_ONLY_NO_PRINT=C2=A0 BIT13
>=C2=A0 #define UNSIGNED_TYPE=C2=A0 =C2=A0 =C2=A0 =C2=A0 BIT14
> +#define SIZET_TYPE=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0BIT15
>
>=C2=A0 //
>=C2=A0 // Record date and time information
> --
> 2.37.0
>
>
>
>
>



--

Pedro Falcato

=20



--
Pedro Falcato
--000000000000d1c2c705e3a26afb--