[PATCH 1/1] efi_loader: printing UEFI revision in helloworld.efi

Simon Glass sjg at chromium.org
Fri Sep 2 01:52:10 CEST 2022


Hi Heinrich,


On Thu, 1 Sept 2022 at 14:44, Heinrich Schuchardt
<heinrich.schuchardt at canonical.com> wrote:
>
> We need to support multiple digits in the parts of the UEFI verision
> number. E.g.
>
>     EFI_SPECIFICATION_VERSION = (123 << 16) | 456
>
> must be printed as
>
>     123.45.6
>
> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
> ---
>  lib/efi_loader/helloworld.c | 66 ++++++++++++++++++++++++++++++-------
>  1 file changed, 54 insertions(+), 12 deletions(-)

Gosh, I'm not sure what to make of this! Could uint2dec() use strtoul()?

Regards,
Simon


>
> diff --git a/lib/efi_loader/helloworld.c b/lib/efi_loader/helloworld.c
> index 10666dc0f2..d565f32745 100644
> --- a/lib/efi_loader/helloworld.c
> +++ b/lib/efi_loader/helloworld.c
> @@ -29,24 +29,66 @@ static struct efi_system_table *systable;
>  static struct efi_boot_services *boottime;
>  static struct efi_simple_text_output_protocol *con_out;
>
> +/*
> + * Print an unsigned 32bit value as decimal number to an u16 string
> + *
> + * @value:     value to be printed
> + * @buf:       pointer to buffer address
> + *             on return position of terminating zero word
> + */
> +static void uint2dec(u32 value, u16 **buf)
> +{
> +       u16 *pos = *buf;
> +       int i;
> +       u16 c;
> +       u64 f;
> +
> +       /*
> +        * Increment by .5 and multiply with
> +        * (2 << 60) / 1,000,000,000 = 0x44B82FA0.9B5A52CC
> +        * to move the first digit to bit 60-63.
> +        */
> +       f = 0x225C17D0;
> +       f += (0x9B5A52DULL * value) >> 28;
> +       f += 0x44B82FA0ULL * value;
> +
> +       for (i = 0; i < 10; ++i) {
> +               /* Write current digit */
> +               c = f >> 60;
> +               if (c || pos != *buf)
> +                       *pos++ = c + '0';
> +               /* Eliminate current digit */
> +               f &= 0xfffffffffffffff;
> +               /* Get next digit */
> +               f *= 0xaULL;
> +       }
> +       if (pos == *buf)
> +               *pos++ = '0';
> +       *pos = 0;
> +       *buf = pos;
> +}
> +
>  /**
>   * print_uefi_revision() - print UEFI revision number
>   */
>  static void print_uefi_revision(void)
>  {
> -       u16 rev[] = u"0.0.0";
> -
> -       rev[0] = (systable->hdr.revision >> 16) + '0';
> -       rev[4] = systable->hdr.revision & 0xffff;
> -       for (; rev[4] >= 10;) {
> -               rev[4] -= 10;
> -               ++rev[2];
> +       u16 rev[13] = {0};
> +       u16 *buf = rev;
> +       u16 digit;
> +
> +       uint2dec(systable->hdr.revision >> 16, &buf);
> +       *buf++ = '.';
> +       uint2dec(systable->hdr.revision & 0xffff, &buf);
> +
> +       /* Minor revision is only to be shown if non-zero */
> +       digit = *--buf;
> +       if (digit == '0') {
> +               *buf = 0;
> +       } else {
> +               *buf++ = '.';
> +               *buf = digit;
>         }
> -       /* Third digit is only to be shown if non-zero */
> -       if (rev[4])
> -               rev[4] += '0';
> -       else
> -               rev[3] = 0;
>
>         con_out->output_string(con_out, u"Running on UEFI ");
>         con_out->output_string(con_out, rev);
> --
> 2.37.2
>


More information about the U-Boot mailing list