On Wed, Apr 15, 2020 at 04:04:35PM +0200, Laszlo Ersek wrote:
> On 04/14/20 20:01, Rebecca Cran wrote:
> > I was trying to build OvmfPkg/XenPkg -a X64 -t GCC5 -b DEBUG
> > -DDEBUG_ON_SERIAL_PORT=TRUE, but the build fails. Both plain DEBUG and
> > RELEASE builds without trying to put the debug output on the serial
> > port work.
> >
> >
> > [bcran@smic ~/src/tmp/edk2]$ build -p OvmfPkg/OvmfXen.dsc -a X64 -t
> > GCC5 -b DEBUG -DDEBUG_ON_SERIAL_PORT=TRUE
> > Build environment: FreeBSD-13.0-CURRENT-amd64-64bit-ELF
> > Build start time: 11:59:24, Apr.14 2020
> >
> > WORKSPACE        = /home/bcran/src/tmp/edk2
> > EDK_TOOLS_PATH   = /home/bcran/src/tmp/edk2/BaseTools
> > CONF_PATH        = /home/bcran/src/tmp/edk2/Conf
> > PYTHON_COMMAND   = /usr/local/bin/python3
> >
> >
> > Processing meta-data .
> > Architecture(s)  = X64
> > Build target     = DEBUG
> > Toolchain        = GCC5
> >
> > Active Platform          = /home/bcran/src/tmp/edk2/OvmfPkg/OvmfXen.dsc
> > .
> >
> > build.py...
> > /home/bcran/src/tmp/edk2/OvmfPkg/OvmfXen.dsc(...): error F002: Library
> > [/home/bcran/src/tmp/edk2/MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf]
> > with constructors has a cycle
> >                 consumed by
> > /home/bcran/src/tmp/edk2/MdePkg/Library/UefiLib/UefiLib.inf
> >         consumed by
> > /home/bcran/src/tmp/edk2/MdePkg/Library/UefiDevicePathLibDevicePathProtocol/UefiDevicePathLibDevicePathProtocol.inf
> 
>  From commit 05480e2fd4ff ("OvmfPkg/PlatformBootManagerLib: Use a Xen
> console for ConOut/ConIn", 2019-08-21), we have:
> 
> > diff --git a/OvmfPkg/OvmfXen.dsc b/OvmfPkg/OvmfXen.dsc
> > index 54ac910d8eed..e719a168f81e 100644
> > --- a/OvmfPkg/OvmfXen.dsc
> > +++ b/OvmfPkg/OvmfXen.dsc
> > @@ -586,6 +586,10 @@ [Components]
> >    OvmfPkg/XenIoPciDxe/XenIoPciDxe.inf
> >    OvmfPkg/XenBusDxe/XenBusDxe.inf
> >    OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.inf
> > +  MdeModulePkg/Universal/SerialDxe/SerialDxe.inf {
> > +    <LibraryClasses>
> > +      
> > SerialPortLib|OvmfPkg/Library/XenConsoleSerialPortLib/XenConsoleSerialPortLib.inf
> > +  }
> >    MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
> >    
> > MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf
> >    MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf
> 
> If you run the "build" command with the "-v" option added, the last part
> (just preceding the error message above) is:
> 
> > Library instances of module 
> > [MdeModulePkg/Universal/SerialDxe/SerialDxe.inf] [X64]:
> >         UefiDriverEntryPoint : 
> > MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf
> >         UefiBootServicesTableLib : 
> > MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf
> >         DebugLib : 
> > MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
> >         PcdLib : MdePkg/Library/DxePcdLib/DxePcdLib.inf
> >         SerialPortLib : 
> > OvmfPkg/Library/XenConsoleSerialPortLib/XenConsoleSerialPortLib.inf
> >         BaseLib : MdePkg/Library/BaseLib/BaseLib.inf
> >         XenHypercallLib : 
> > OvmfPkg/Library/XenHypercallLib/XenHypercallLib.inf
> >         HobLib : MdePkg/Library/DxeHobLib/DxeHobLib.inf
> >         BaseMemoryLib : 
> > MdePkg/Library/BaseMemoryLibRepStr/BaseMemoryLibRepStr.inf
> >         UefiLib : MdePkg/Library/UefiLib/UefiLib.inf
> >         PrintLib : MdePkg/Library/BasePrintLib/BasePrintLib.inf
> >         MemoryAllocationLib : 
> > MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
> >         DevicePathLib : 
> > MdePkg/Library/UefiDevicePathLibDevicePathProtocol/UefiDevicePathLibDevicePathProtocol.inf
> >         UefiRuntimeServicesTableLib : 
> > MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf
> >         DebugPrintErrorLevelLib : 
> > MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib.inf
> 
> The dependency loop is formed by:
> 
>   DebugLib        : BaseDebugLibSerialPort ->
>   SerialPortLib   : XenConsoleSerialPortLib ->
>   XenHypercallLib : XenHypercallLib ->
>   DebugLib
> 
> where all the library instances BaseDebugLibSerialPort,
> XenConsoleSerialPortLib, XenHypercallLib have constructors.
> 
> Note that XenConsoleSerialPortLib *itself* is careful to avoid a
> DebugLib dependency; from "XenConsoleSerialPortLib.c":
> 
> > //
> > // We can't use DebugLib due to a constructor dependency cycle between 
> > DebugLib
> > // and ourselves.
> > //
> > #define ASSERT(Expression)      \
> >   do {                          \
> >     if (!(Expression)) {        \
> >       CpuDeadLoop ();           \
> >     }                           \
> >   } while (FALSE)
> 
> However, XenConsoleSerialPortLib still inherits a DebugLib dependency
> through XenHypercallLib -- but only on IA32/X64, not on ARM/AARCH64! See
> "XenHypercallLib.inf":
> 
> > [LibraryClasses.IA32, LibraryClasses.X64]
> >   BaseLib
> >   HobLib
> >   DebugLib
> 
> There is no issue without specifying DEBUG_ON_SERIAL_PORT, because
> OvmfXen resolves DebugLib to PlatformDebugLibIoPort then, which does not
> depend on SerialPortLib (thus the cycle is severed).
> 
> 
> Now, I think there may not be a simple solution for this, because, as
> the message on commit 05480e2fd4ff says, "On a Xen PVH guest, none of
> the existing serial or console interface works".
> 
> So even if we eliminated the constructor cycle for this module -- i.e.,
> SerialDxe -- somehow [1], the larger DEBUG_ON_SERIAL_PORT feature might
> not be feasible for *some* module types in OvmfXen. Because,
> XenConsoleSerialPortLib ultimately depends on hypercalls, and I'm unsure
> if those could be used as early as in SEC / PEI.
> 
> [1] For breaking up just this one constructor cycle, I guess we could
>     remove the DebugLib dependency from XenHypercallLib even on
>     IA32/X64.
> 
> In other words, I'm not sure if you could send any DEBUG messages *at
> all* to the Xen serial port as early as in SEC or PEI. Meaning that even
> if DEBUG_ON_SERIAL_PORT didn't break the build, it still wouldn't
> (comprehensively) do what its name says.
> 
> I figure you attempted the DEBUG_ON_SERIAL_PORT build because without it
> you get no debug output at all (due to the default
> PlatformDebugLibIoPort resolution, which produces no logs on Xen).
> 
> For a start, I would recommend removing DEBUG_ON_SERIAL_PORT altogether
> from OvmfXen (to decrease confusion and to eliminate the build
> breakage), and then filing a feature request in the TianoCore bugzilla
> for "some" kind of debug logging in OvmfXen, if the latter is possible.

Thanks Laszlo for the investigation. I usually use DebugLib to debug
OVMF under Xen, I just need to enable the debug port of QEMU. And for
when QEMU isn't available (when running Xen PVH guest), I have a local
patch that I haven't send upstream yet. It's a hacked version of
PlatformDebugLibIoPort which sends logs to Xen's debug port, and doesn't
check if the port is open.

I'll prepare a patch to remove DEBUG_ON_SERIAL_PORT support from OvmfXen
and send my other patch.

Thanks,

-- 
Anthony PERARD

-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#57627): https://edk2.groups.io/g/devel/message/57627
Mute This Topic: https://groups.io/mt/73015916/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to