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

Heinrich Schuchardt heinrich.schuchardt at canonical.com
Sat Mar 26 07:36:38 CET 2022



On 3/25/22 15:58, Ilias Apalodimas wrote:
> 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?

Thanks for reviewing.

The check is in starts_with().

Best regards

Heinrich

> 
>>
>> -       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