summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaszlo Ersek <lersek@redhat.com>2018-08-03 01:29:13 +0200
committerLaszlo Ersek <lersek@redhat.com>2018-08-06 20:56:12 +0200
commit91a5b13650752a54cf766791aa369495c3426485 (patch)
tree22ab2f0f69fce0fde0f84359ad1cbe29786e4f7e
parentd3bc33731f5b039bf3df76e50cbb1f60ce697e9b (diff)
downloadedk2-91a5b13650752a54cf766791aa369495c3426485.tar.gz
edk2-91a5b13650752a54cf766791aa369495c3426485.tar.bz2
edk2-91a5b13650752a54cf766791aa369495c3426485.zip
OvmfPkg/PlatformDebugLibIoPort: fix port detection for use in the DXE Core
The DXE Core is one of those modules that call ProcessLibraryConstructorList() manually. Before DxeMain() [MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c] calls ProcessLibraryConstructorList(), and through it, our PlatformDebugLibIoPortConstructor() function, DxeMain() invokes the DEBUG() macro multiple times. That macro lands in our PlatformDebugLibIoPortFound() function -- which currently relies on the "mDebugIoPortFound" global variable that has (not yet) been set by the constructor. As a result, early debug messages from the DXE Core are lost. Move the device detection into PlatformDebugLibIoPortFound(), also caching the fact (not just the result) of the device detection. (We could introduce a separate DebugLib instance just for the DXE Core, but the above approach works for all modules that currently consume the PlatformDebugLibIoPort instance (which means "everything but SEC").) This restores messages such as: > CoreInitializeMemoryServices: > BaseAddress - 0x7AF21000 Length - 0x3CDE000 MinimalMemorySizeNeeded - 0x10F4000 Keep the empty constructor function -- OVMF's DebugLib instances have always had constructors; we had better not upset constructor dependency ordering by making our instance(s) constructor-less. Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> Cc: Brijesh Singh <brijesh.singh@amd.com> Cc: Jordan Justen <jordan.l.justen@intel.com> Fixes: c09d9571300a089c35f5df2773b70edc25050d0d Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Laszlo Ersek <lersek@redhat.com> Reviewed-by: Jordan Justen <jordan.l.justen@intel.com> Tested-by: Brijesh Singh <brijesh.singh@amd.com> [lersek@redhat.com: sanitize blank lines around "mDebugIoPortChecked"]
-rw-r--r--OvmfPkg/Library/PlatformDebugLibIoPort/DebugLibDetect.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLibDetect.c b/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLibDetect.c
index 81c44eece9..e24cc834c2 100644
--- a/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLibDetect.c
+++ b/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLibDetect.c
@@ -17,13 +17,25 @@
#include "DebugLibDetect.h"
//
+// Set to TRUE if the debug I/O port has been checked
+//
+STATIC BOOLEAN mDebugIoPortChecked = FALSE;
+
+//
// Set to TRUE if the debug I/O port is enabled
//
STATIC BOOLEAN mDebugIoPortFound = FALSE;
/**
- This constructor function checks if the debug I/O port device is present,
- caching the result for later use.
+ This constructor function must not do anything.
+
+ Some modules consuming this library instance, such as the DXE Core, invoke
+ the DEBUG() macro before they explicitly call
+ ProcessLibraryConstructorList(). Therefore the auto-generated call from
+ ProcessLibraryConstructorList() to this constructor function may be preceded
+ by some calls to PlatformDebugLibIoPortFound() below. Hence
+ PlatformDebugLibIoPortFound() must not rely on anything this constructor
+ could set up.
@retval RETURN_SUCCESS The constructor always returns RETURN_SUCCESS.
@@ -34,12 +46,12 @@ PlatformDebugLibIoPortConstructor (
VOID
)
{
- mDebugIoPortFound = PlatformDebugLibIoPortDetect();
return RETURN_SUCCESS;
}
/**
- Return the cached result of detecting the debug I/O port device.
+ At the first call, check if the debug I/O port device is present, and cache
+ the result for later use. At subsequent calls, return the cached result.
@retval TRUE if the debug I/O port device was detected.
@retval FALSE otherwise
@@ -51,5 +63,9 @@ PlatformDebugLibIoPortFound (
VOID
)
{
+ if (!mDebugIoPortChecked) {
+ mDebugIoPortFound = PlatformDebugLibIoPortDetect ();
+ mDebugIoPortChecked = TRUE;
+ }
return mDebugIoPortFound;
}