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 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#57412): https://edk2.groups.io/g/devel/message/57412 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] -=-=-=-=-=-=-=-=-=-=-=-