[PATCH v3 1/3] efi_loader: nocolor command line attr for initrddump.efi

Ilias Apalodimas ilias.apalodimas at linaro.org
Fri Mar 25 15:58:26 CET 2022


Hi Heinrich,

On Tue, 22 Mar 2022 at 22:58, Heinrich Schuchardt
<heinrich.schuchardt at canonical.com> wrote:
>
> initrddump.efi uses colored output and clear the screen. This is not
> helpful for integration into Python tests. Allow specifying 'nocolor' in
> the load option data to suppress color output and clearing the screen.
>
> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
> ---
> v3:
>         new patch
> ---
>  lib/efi_loader/initrddump.c | 77 ++++++++++++++++++++++++++++++++-----
>  1 file changed, 68 insertions(+), 9 deletions(-)
>
> diff --git a/lib/efi_loader/initrddump.c b/lib/efi_loader/initrddump.c
> index 7de43bcfff..25dbd635e5 100644
> --- a/lib/efi_loader/initrddump.c
> +++ b/lib/efi_loader/initrddump.c
> @@ -4,6 +4,9 @@
>   *
>   * initrddump.efi saves the initial RAM disk provided via the
>   * EFI_LOAD_FILE2_PROTOCOL.
> + *
> + * Specifying 'nocolor' as load option data suppresses colored output and
> + * clearing of the screen.
>   */
>
>  #include <common.h>
> @@ -25,6 +28,7 @@ static const efi_guid_t guid_simple_file_system_protocol =
>                                         EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID;
>  static const efi_guid_t load_file2_guid = EFI_LOAD_FILE2_PROTOCOL_GUID;
>  static efi_handle_t handle;
> +static bool nocolor;
>
>  /*
>   * Device path defined by Linux to identify the handle providing the
> @@ -46,6 +50,17 @@ static const struct efi_initrd_dp initrd_dp = {
>         }
>  };
>
> +/**
> + * color() - set foreground color
> + *
> + * @color:     foreground color
> + */
> +static void color(u8 color)
> +{
> +       if (!nocolor)
> +               cout->set_attribute(cout, color | EFI_BACKGROUND_BLACK);
> +}
> +
>  /**
>   * print() - print string
>   *
> @@ -56,6 +71,17 @@ static void print(u16 *string)
>         cout->output_string(cout, string);
>  }
>
> +/**
> + * cls() - clear screen
> + */
> +static void cls(void)
> +{
> +       if (nocolor)
> +               print(u"\r\n");
> +       else
> +               cout->clear_screen(cout);
> +}
> +
>  /**
>   * error() - print error string
>   *
> @@ -63,9 +89,9 @@ static void print(u16 *string)
>   */
>  static void error(u16 *string)
>  {
> -       cout->set_attribute(cout, EFI_LIGHTRED | EFI_BACKGROUND_BLACK);
> +       color(EFI_LIGHTRED);
>         print(string);
> -       cout->set_attribute(cout, EFI_LIGHTBLUE | EFI_BACKGROUND_BLACK);
> +       color(EFI_LIGHTBLUE);
>  }
>
>  /*
> @@ -215,10 +241,13 @@ static u16 *skip_whitespace(u16 *pos)
>   *
>   * @string:    string to search for keyword
>   * @keyword:   keyword to be searched
> - * Return:     true fi @string starts with the keyword
> + * Return:     true if @string starts with the keyword
>   */
>  static bool starts_with(u16 *string, u16 *keyword)
>  {
> +       if (!string || !keyword)
> +               return false;
> +
>         for (; *keyword; ++string, ++keyword) {
>                 if (*string != *keyword)
>                         return false;
> @@ -400,6 +429,30 @@ out:
>         return ret;
>  }
>
> +/**
> + * get_load_options() - get load options
> + *
> + * Return:     load options or NULL
> + */
> +u16 *get_load_options(void)
> +{
> +       efi_status_t ret;
> +       struct efi_loaded_image *loaded_image;
> +
> +       ret = bs->open_protocol(handle, &loaded_image_guid,
> +                               (void **)&loaded_image, NULL, NULL,
> +                               EFI_OPEN_PROTOCOL_GET_PROTOCOL);
> +       if (ret != EFI_SUCCESS) {
> +               error(u"Loaded image protocol not found\r\n");
> +               return NULL;
> +       }
> +
> +       if (!loaded_image->load_options_size || !loaded_image->load_options)
> +               return NULL;
> +
> +       return loaded_image->load_options;
> +}
> +
>  /**
>   * efi_main() - entry point of the EFI application.
>   *
> @@ -410,18 +463,23 @@ out:
>  efi_status_t EFIAPI efi_main(efi_handle_t image_handle,
>                              struct efi_system_table *systab)
>  {
> +       u16 *load_options;
> +
>         handle = image_handle;
>         systable = systab;
>         cerr = systable->std_err;
>         cout = systable->con_out;
>         cin = systable->con_in;
>         bs = systable->boottime;
> +       load_options = get_load_options();

Don't we need to check for NULL here?

>
> -       cout->set_attribute(cout, EFI_LIGHTBLUE | EFI_BACKGROUND_BLACK);
> -       cout->clear_screen(cout);
> -       cout->set_attribute(cout, EFI_WHITE | EFI_BACKGROUND_BLACK);
> +       if (starts_with(load_options, u"nocolor"))
> +               nocolor = true;
> +
> +       color(EFI_WHITE);
> +       cls();
>         print(u"INITRD Dump\r\n===========\r\n\r\n");
> -       cout->set_attribute(cout, EFI_LIGHTBLUE | EFI_BACKGROUND_BLACK);
> +       color(EFI_LIGHTBLUE);
>
>         for (;;) {
>                 u16 command[BUFFER_SIZE];
> @@ -443,7 +501,8 @@ efi_status_t EFIAPI efi_main(efi_handle_t image_handle,
>                         do_help();
>         }
>
> -       cout->set_attribute(cout, EFI_LIGHTGRAY | EFI_BACKGROUND_BLACK);
> -       cout->clear_screen(cout);
> +       color(EFI_LIGHTGRAY);
> +       cls();
> +
>         return EFI_SUCCESS;
>  }
> --
> 2.34.1
>

Cheers
/Ilias


More information about the U-Boot mailing list