From: "Gao, Zhichao" <zhichao.gao@intel.com>
To: Laszlo Ersek <lersek@redhat.com>,
"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: "Wang, Jian J" <jian.j.wang@intel.com>,
"Wu, Hao A" <hao.a.wu@intel.com>, "Ni, Ray" <ray.ni@intel.com>,
"Zeng, Star" <star.zeng@intel.com>,
"Gao, Liming" <liming.gao@intel.com>,
Sean Brogan <sean.brogan@microsoft.com>,
Michael Turner <Michael.Turner@microsoft.com>,
Bret Barkelew <Bret.Barkelew@microsoft.com>
Subject: Re: [edk2-devel] [PATCH V3 2/2] MdeModulePkg/GraphicsConsoleDxe: Initialize the output mode
Date: Tue, 7 May 2019 07:11:28 +0000 [thread overview]
Message-ID: <3CE959C139B4C44DBEA1810E3AA6F9000B7D0AEF@SHSMSX101.ccr.corp.intel.com> (raw)
In-Reply-To: <b1cd8793-f38f-8d13-b56e-3d4b19c163f2@redhat.com>
> -----Original Message-----
> From: Laszlo Ersek [mailto:lersek@redhat.com]
> Sent: Tuesday, May 7, 2019 1:42 AM
> To: devel@edk2.groups.io; Gao, Zhichao <zhichao.gao@intel.com>
> Cc: Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A <hao.a.wu@intel.com>;
> Ni, Ray <ray.ni@intel.com>; Zeng, Star <star.zeng@intel.com>; Gao, Liming
> <liming.gao@intel.com>; Sean Brogan <sean.brogan@microsoft.com>;
> Michael Turner <Michael.Turner@microsoft.com>; Bret Barkelew
> <Bret.Barkelew@microsoft.com>
> Subject: Re: [edk2-devel] [PATCH V3 2/2]
> MdeModulePkg/GraphicsConsoleDxe: Initialize the output mode
>
> On 05/05/19 04:17, Gao, Zhichao wrote:
> > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1412
> >
> > Original logic:
> > Connect the graphics device -> connect it as graphics consoles and
> > initialize its parameters(Mode = -1, invalid) -> connect it as console
> > spliter and add the device to the list(use SetMode to set mode to the
> > user defined mode or the best mode the devices supported if the mode
> > is invalid. *clear the screen at this phase*)
> >
> > Changed logic:
> > Connect the graphics device -> connect it as graphics consoles and
> > initialize its parameters(initialize the mode to the user defined mode
> > or the best mode. *directly set the mode value without using SetMode,
> > that would not clear the screen) -> connect it as console spliter and
> > add the device to the list(use SetMode to set mode to the user defined
> > mode or the best mode the devices supported if the mode is invalid.
> > *now the mode is already set, so it would not clear the screen*).
> >
> > Also remove the section of SetMode for debug version.
> >
> > But there would be no clear screen operation while reconnect the
> > graphics device. Instead, clear the screen when stop the graphics
> > console device.
> >
> > Cc: Jian J Wang <jian.j.wang@intel.com>
> > Cc: Hao Wu <hao.a.wu@intel.com>
> > Cc: Ray Ni <ray.ni@intel.com>
> > Cc: Star Zeng <star.zeng@intel.com>
> > Cc: Liming Gao <liming.gao@intel.com>
> > Cc: Sean Brogan <sean.brogan@microsoft.com>
> > Cc: Michael Turner <Michael.Turner@microsoft.com>
> > Cc: Bret Barkelew <Bret.Barkelew@microsoft.com>
> > Cc: Laszlo Ersek <lersek@redhat.com>
> > Signed-off-by: Zhichao Gao <zhichao.gao@intel.com>
> > ---
> > .../GraphicsConsoleDxe/GraphicsConsole.c | 44 ++++++++++++++-----
> > .../GraphicsConsoleDxe/GraphicsConsoleDxe.inf | 2 +
> > 2 files changed, 36 insertions(+), 10 deletions(-)
>
> This driver is too complex for me to decide whether this patch is correct.
>
> The spec writes:
>
> > If the output device is not in a valid text mode at the time of the
> > EFI_BOOT_SERVICES.HandleProtocol() call, the device is to indicate
> > that its CurrentMode is -1.
>
> (1) Because the patch sets a value different from -1 to CurrentMode, can we
> guarantee that the console will be usable immediately?
I think we can guarantee that the CurrentMode value is valid except the value is 0 or -1. Because the initialize mode section is same with the one in ConSplitterDxe.
>
>
> More comments below:
>
> On 05/05/19 04:17, Gao, Zhichao wrote:
> > diff --git
> >
> a/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole
> .c
> >
> b/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsol
> e.c
> > index 26ea19f300..42386de3f5 100644
> > ---
> >
> a/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole
> .c
> > +++
> b/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsol
> > +++ e.c
> > @@ -1,7 +1,7 @@
> > /** @file
> > This is the main routine for initializing the Graphics Console support
> routines.
> >
> > -Copyright (c) 2006 - 2018, Intel Corporation. All rights
> > reserved.<BR>
> > +Copyright (c) 2006 - 2019, Intel Corporation. All rights
> > +reserved.<BR>
> > SPDX-License-Identifier: BSD-2-Clause-Patent
> >
> > **/
> > @@ -384,6 +384,12 @@ GraphicsConsoleControllerDriverStart (
> > EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode;
> > UINTN SizeOfInfo;
> > EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;
> > + UINTN PreferMode;
> > + UINTN Index;
> > + UINTN Column;
> > + UINTN Row;
> > + UINTN DefaultColumn;
> > + UINTN DefaultRow;
> >
> > ModeNumber = 0;
> >
> > @@ -567,16 +573,32 @@ GraphicsConsoleControllerDriverStart (
> > //
> > Private->SimpleTextOutputMode.MaxMode = (INT32) MaxMode;
> >
> > - DEBUG_CODE_BEGIN ();
> > - Status = GraphicsConsoleConOutSetMode (&Private-
> >SimpleTextOutput, 0);
> > - if (EFI_ERROR (Status)) {
> > - goto Error;
> > - }
> > - Status = GraphicsConsoleConOutOutputString (&Private-
> >SimpleTextOutput, (CHAR16 *)L"Graphics Console Started\n\r");
> > - if (EFI_ERROR (Status)) {
> > - goto Error;
> > + //
> > + // Initialize the Mode of graphics console devices // PreferMode
> > + = 0; DefaultColumn = PcdGet32 (PcdConOutColumn); DefaultRow =
> > + PcdGet32 (PcdConOutRow); Column = 0; Row = 0; for (Index = 0;
> > + Index < MaxMode; Index++) {
> > + if (DefaultColumn != 0 && DefaultRow != 0) {
> > + if ((Private->ModeData[Index].Columns == Column) &&
> > + (Private->ModeData[Index].Rows == Row)) {
> > + PreferMode = Index;
> > + break;
> > + }
> > + } else {
> > + if ((Private->ModeData[Index].Columns > Column) &&
> > + (Private->ModeData[Index].Rows > Row)) {
> > + Column = Private->ModeData[Index].Columns;
> > + Row = Private->ModeData[Index].Rows;
> > + PreferMode = Index;
> > + }
> > }
> > - DEBUG_CODE_END ();
> > + }
> > + Private->SimpleTextOutput.Mode->Mode = (INT32)PreferMode;
>
> (2) The loop above can terminate without assigning Index to PreferMode.
>
> In that case, the assignment right after the loop will set the Mode field to 0,
> when overwriting the initial value (-1).
>
> Is this intentional?
>
> Because, if we can find no matching mode, it seems like we should stick with
> (-1) -- for "current text mode is not valid". In that case, the following passage
> from the spec would apply:
>
> > On connecting to the output device the caller is required to verify
> > the mode of the output device, and if it is not acceptable to set it
> > to something it can use.
>
> Should we perhaps change the type of PreferMode to INT32, and set it
> initially to (-1)?
I think you are right. If no mode is queried, then invalid mode should be returned.
>
>
> More comments:
>
> On 05/05/19 04:17, Gao, Zhichao wrote:
> > + DEBUG ((DEBUG_INFO, "Graphics Console Started, Mode: %x\n\r",
> > + PreferMode));
>
> (3) DEBUG messages should not contain "\r" characters. My understanding is
> that PrintLib adds "\r" automatically.
>
>
> (4) UINTN values (which may be UINT64, dependent on build architecture)
> should not be printed with "%x". UINTN should be converted to UINT64
> explicitly, for printing, and then printed with "%Lx" (or "%Lu").
>
> (If you decide to switch PreferMode to INT32, then %d is the format specifier
> to use, of course.)
Good catch. I will make the Prefermode to INT32 and adjust the debug code.
>
>
> (5) I applied the series, for testing, on top of commit fbb0ec7ea4c0 (current
> master). I tested the patches briefly with OVMF.
>
> With the patches applied, the firmware crashes when I run "reconnect -r", as
> the first command, in the built-in UEFI shell:
>
> > !!!! X64 Exception Type - 0D(#GP - General Protection) CPU Apic ID -
> 00000000 !!!!
> > ExceptionData - 0000000000000000
> > RIP - 000000007EECB8F9, CS - 0000000000000038, RFLAGS -
> > 0000000000010012 RAX - 0000D0EC8148E589, RCX - 000000007EF06FE0, RDX
> > - 000000000904A7A0 RBX - 0000000000000013, RSP - 000000007EEC9110,
> > RBP - 000000007EEC9140 RSI - 000000007EEC92D8, RDI - 000000007EF07010
> > R8 - 0000000000000007, R9 - 000000012E9C46D6, R10 - 0000000400020100
> > R11 - 0000000000000008, R12 - 0000000000000000, R13 -
> > 0000000000000000
> > R14 - 0000000000000000, R15 - 0000000000000000
> > DS - 0000000000000030, ES - 0000000000000030, FS - 0000000000000030
> > GS - 0000000000000030, SS - 0000000000000030
> > CR0 - 0000000080010033, CR2 - 0000000000000000, CR3 -
> > 000000007EC01000
> > CR4 - 0000000000000668, CR8 - 0000000000000000
> > DR0 - 0000000000000000, DR1 - 0000000000000000, DR2 -
> > 0000000000000000
> > DR3 - 0000000000000000, DR6 - 00000000FFFF0FF0, DR7 -
> > 0000000000000400 GDTR - 000000007EBEDA98 0000000000000047, LDTR -
> 0000000000000000
> > IDTR - 000000007E241018 0000000000000FFF, TR - 0000000000000000
> > FXSAVE_STATE - 000000007EEC8D70
> > !!!! Find image based on IP(0x7EECB8F9)
> >
> Build/Ovmf3264/NOOPT_GCC48/X64/MdeModulePkg/Core/Dxe/DxeMain/
> DEBUG/Dxe
> > Core.dll (ImageBase=000000007EECB000, EntryPoint=000000007EED00C3)
> > !!!!
>
> The crash offset is 0x000000007EECB8F9-0x000000007EECB000 = 0x8F9.
>
> The crash occurs in the InternalBaseLibIsListValid() function:
>
> > //
> > // Count the total number of nodes in List.
> > // Exit early if the number of nodes in List >=
> PcdMaximumLinkedListLength
> > //
> > do {
> > Ptr = Ptr->ForwardLink;
> > 8f5: 48 8b 45 f0 mov -0x10(%rbp),%rax
> > 8f9: 48 8b 00 mov (%rax),%rax <------- here
> > 8fc: 48 89 45 f0 mov %rax,-0x10(%rbp)
>
> (RAX = 0xD0EC_8148_E589, which is approximately 208 TB, so obviously
> something corrupted a list).
>
> The crash does not occur ("reconnect -r" works fine) if I build OVMF at
> fbb0ec7ea4c0 (current master).
I have tried that. Something wrong with the ClearScreen function. I will investigate it later.
Thanks,
Zhichao
>
> Thanks,
> Laszlo
>
> >
> > //
> > // Install protocol interfaces for the Graphics Console device.
> > @@ -669,6 +691,8 @@ GraphicsConsoleControllerDriverStop (
> > return EFI_NOT_STARTED;
> > }
> >
> > + SimpleTextOutput->ClearScreen (SimpleTextOutput);
> > +
> > Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS
> > (SimpleTextOutput);
> >
> > Status = gBS->UninstallProtocolInterface ( diff --git
> >
> a/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole
> Dxe
> > .inf
> >
> b/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsol
> eDxe
> > .inf
> > index f7caa65aa9..bcfd306eee 100644
> > ---
> >
> a/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole
> Dxe
> > .inf
> > +++
> b/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsol
> > +++ eDxe.inf
> > @@ -65,6 +65,8 @@
> > [Pcd]
> > gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution ##
> SOMETIMES_CONSUMES
> > gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution ##
> SOMETIMES_CONSUMES
> > + gEfiMdeModulePkgTokenSpaceGuid.PcdConOutRow ##
> SOMETIMES_CONSUMES
> > + gEfiMdeModulePkgTokenSpaceGuid.PcdConOutColumn ##
> SOMETIMES_CONSUMES
> >
> > [UserExtensions.TianoCore."ExtraFiles"]
> > GraphicsConsoleDxeExtra.uni
> >
prev parent reply other threads:[~2019-05-07 7:11 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-05 2:17 [PATCH V3 0/2] MdeModulePkg: Make the screen seamless Gao, Zhichao
2019-05-05 2:17 ` [PATCH V3 1/2] MdeModulePkg/ConSplitterDxe: Optimize the ConSplitterTextOutSetMode Gao, Zhichao
2019-05-05 2:17 ` [PATCH V3 2/2] MdeModulePkg/GraphicsConsoleDxe: Initialize the output mode Gao, Zhichao
2019-05-06 17:42 ` [edk2-devel] " Laszlo Ersek
2019-05-07 7:11 ` Gao, Zhichao [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3CE959C139B4C44DBEA1810E3AA6F9000B7D0AEF@SHSMSX101.ccr.corp.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox