[PATCH] efi_loader: Improve console screen clearing and reset
Jan Kiszka
jan.kiszka at siemens.com
Thu Apr 28 15:56:54 CEST 2022
On 28.04.22 13:52, Heinrich Schuchardt wrote:
> On 4/25/22 11:23, Jan Kiszka wrote:
>> From: Jan Kiszka <jan.kiszka at siemens.com>
>>
>> Ensure that the default colors are set when clearing the screen so that
>> the background is properly filled and succeeding colored outputs will
>> have no differently colored trail.
>>
>> Before clearing, ensure that no previous output of firmware or UEFI
>> programs will overwritten on serial devices or other streaming consoles.
>> This helps generating complete boot logs.
>>
>> Signed-off-by: Jan Kiszka <jan.kiszka at siemens.com>
>> ---
>> lib/efi_loader/efi_console.c | 16 +++++++++++++---
>> 1 file changed, 13 insertions(+), 3 deletions(-)
>>
>> diff --git a/lib/efi_loader/efi_console.c b/lib/efi_loader/efi_console.c
>> index ba68a150172..0270b20bafe 100644
>> --- a/lib/efi_loader/efi_console.c
>> +++ b/lib/efi_loader/efi_console.c
>> @@ -463,8 +463,18 @@ static efi_status_t EFIAPI efi_cout_set_attribute(
>> static efi_status_t EFIAPI efi_cout_clear_screen(
>> struct efi_simple_text_output_protocol *this)
>> {
>> + unsigned int row;
>> +
>> EFI_ENTRY("%p", this);
>>
>> + /* Avoid overwriting previous outputs on streaming consoles */
>
> Thank you for addressing the inconvenience of the partially deleted
> scrollback buffer.
>
> Don't assume that the cursor is in the last line. You first have to move
> it there:
>
> printf(ESC "%d;1H", efi_cout_modes[efi_con_mode.mode].rows);
Not necessarily - we may just inject more lines than needed. But we
could also avoid that, true.
>
>> + for (row = 1; row < efi_cout_modes[efi_con_mode.mode].rows; row++)
>> + printf("\n");
>
> We may have both video output and serial output. The proposed logic may
> not work out correctly if the video screen size differs from the screen
> size of the serial console.
OK, but video is not a streaming output with scroll-back buffer, is it?
All we need to ensure is that the geometry used here is that of the
largest streaming output - and rather scroll more than needed to avoid
overwriting. Other outputs should not notice the difference.
>
> Your solution does not cover the cls command.
Not sure I can follow here yet - which cls are you referring to?
>
> It will not work with the proposed UEFI boot menu
> (https://patchwork.ozlabs.org/project/uboot/list/?series=297320).
>
How will it fail? Guess I need to try this out.
> A complete solution would have to reside in _serial_puts(). But I doubt
> that we want to enlarge the code size there.
What is the logic right now when there are multiple outputs attached?
>
> Therefore I am a bit skeptical about the suggested change.
>
>> +
>> + /* Set default colors if not done yet */
>> + if (efi_con_mode.attribute == 0)
>> + efi_cout_set_attribute(this, 0x07);
>
> The UEFI specification has this sentence: "The ClearScreen() function
> clears the output device(s) display to the currently selected background
> color."
>
> So we should not switch colors here.
We don't do that. We only do that if none was selected so far.
>
> The currently selected background when starting the first UEFI
> application depends on CONFIG_SYS_WHITE_ON_BLACK.
On ClearScreen, we switch to 0x07 unconditionally (white on black) so far.
>
>> +
>> /*
>> * The Linux console wants both a clear and a home command. The
>> video
>> * uclass does not support <ESC>[H without coordinates, yet.
>> @@ -522,11 +532,11 @@ static efi_status_t EFIAPI efi_cout_reset(
>> {
>> EFI_ENTRY("%p, %d", this, extended_verification);
>>
>> + /* Trigger reset to default colors */
>> + efi_con_mode.attribute = 0;
>> +
>> /* Clear screen */
>> EFI_CALL(efi_cout_clear_screen(this));
>> - /* Set default colors */
>> - efi_con_mode.attribute = 0x07;
>
> This value should depend on CONFIG_SYS_WHITE_ON_BLACK:
>
> Also efi_cout_set_attribute(efi_con_out, 0) should consider
> CONFIG_SYS_WHITE_ON_BLACK.
>
> The best thing to do is fixing efi_cout_set_attribute() and invoking
>
> EFI_CALL(efi_cout_set_attributed(efi_con_out, 0));
>
> But this is a subject for a separate patch.
Indeed, I was just preserving existing behavior (or issues).
Jan
--
Siemens AG, Technology
Competence Center Embedded Linux
More information about the U-Boot
mailing list