diff --git a/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c b/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c index 5a1c86f2c3..36cde54976 100644 --- a/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c +++ b/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLib.c @@ -22,6 +22,7 @@ #include #include #include +#include "DebugLibDetect.h" // // Define the maximum debug and assert message length that this library supports @@ -61,9 +62,10 @@ DebugPrint ( ASSERT (Format != NULL); // - // Check driver debug mask value and global mask + // Check if the global mask disables this message or the device is inactive // - if ((ErrorLevel & GetDebugPrintErrorLevel ()) == 0) { + if ((ErrorLevel & GetDebugPrintErrorLevel ()) == 0 || + !PlatformDebugLibIoPortFound ()) { return; } @@ -120,9 +122,11 @@ DebugAssert ( FileName, (UINT64)LineNumber, Description); // - // Send the print string to the debug I/O port + // Send the print string to the debug I/O port, if present // - IoWriteFifo8 (PcdGet16 (PcdDebugIoPort), Length, Buffer); + if (PlatformDebugLibIoPortFound ()) { + IoWriteFifo8 (PcdGet16 (PcdDebugIoPort), Length, Buffer); + } // // Generate a Breakpoint, DeadLoop, or NOP based on PCD settings @@ -265,3 +269,19 @@ DebugPrintLevelEnabled ( { return (BOOLEAN) ((ErrorLevel & PcdGet32(PcdFixedDebugPrintErrorLevel)) != 0); } + +/** + Return the result of detecting the debug I/O port device. + + @retval TRUE if the debug I/O port device was detected. + @retval FALSE otherwise + +**/ +BOOLEAN +EFIAPI +PlatformDebugLibIoPortDetect ( + VOID + ) +{ + return IoRead8 (PcdGet16 (PcdDebugIoPort)) == BOCHS_DEBUG_PORT_MAGIC; +} diff --git a/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLibDetect.c b/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLibDetect.c index bad054f286..81c44eece9 100644 --- a/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLibDetect.c +++ b/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLibDetect.c @@ -1,6 +1,6 @@ /** @file - Constructor code for QEMU debug port library. - Non-SEC instance. + Detection code for QEMU debug port. + Non-SEC instance, caches the result of detection. Copyright (c) 2017, Red Hat, Inc.
This program and the accompanying materials @@ -14,9 +14,16 @@ **/ #include +#include "DebugLibDetect.h" + +// +// Set to TRUE if the debug I/O port is enabled +// +STATIC BOOLEAN mDebugIoPortFound = FALSE; /** - This constructor function does not have anything to do. + This constructor function checks if the debug I/O port device is present, + caching the result for later use. @retval RETURN_SUCCESS The constructor always returns RETURN_SUCCESS. @@ -27,5 +34,22 @@ PlatformDebugLibIoPortConstructor ( VOID ) { + mDebugIoPortFound = PlatformDebugLibIoPortDetect(); return RETURN_SUCCESS; } + +/** + Return the cached result of detecting the debug I/O port device. + + @retval TRUE if the debug I/O port device was detected. + @retval FALSE otherwise + +**/ +BOOLEAN +EFIAPI +PlatformDebugLibIoPortFound ( + VOID + ) +{ + return mDebugIoPortFound; +} diff --git a/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLibDetect.h b/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLibDetect.h new file mode 100644 index 0000000000..1f739b55d8 --- /dev/null +++ b/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLibDetect.h @@ -0,0 +1,57 @@ +/** @file + Base Debug library instance for QEMU debug port. + It uses PrintLib to send debug messages to a fixed I/O port. + + Copyright (c) 2017, Red Hat, Inc.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#ifndef __DEBUG_IO_PORT_DETECT_H__ +#define __DEBUG_IO_PORT_DETECT_H__ + +#include + +// +// The constant value that is read from the debug I/O port +// +#define BOCHS_DEBUG_PORT_MAGIC 0xE9 + + +/** + Helper function to return whether the virtual machine has a debug I/O port. + PlatformDebugLibIoPortFound can call this function directly or cache the + result. + + @retval TRUE if the debug I/O port device was detected. + @retval FALSE otherwise + +**/ +BOOLEAN +EFIAPI +PlatformDebugLibIoPortDetect ( + VOID + ); + +/** + Return whether the virtual machine has a debug I/O port. DebugLib.c + calls this function instead of PlatformDebugLibIoPortDetect, to allow + caching if possible. + + @retval TRUE if the debug I/O port device was detected. + @retval FALSE otherwise + +**/ +BOOLEAN +EFIAPI +PlatformDebugLibIoPortFound ( + VOID + ); + +#endif diff --git a/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLibDetectRom.c b/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLibDetectRom.c index 83a118a0f7..b950919675 100644 --- a/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLibDetectRom.c +++ b/OvmfPkg/Library/PlatformDebugLibIoPort/DebugLibDetectRom.c @@ -1,6 +1,6 @@ /** @file - Constructor code for QEMU debug port library. - SEC instance. + Detection code for QEMU debug port. + SEC instance, cannot cache the result of detection. Copyright (c) 2017, Red Hat, Inc.
This program and the accompanying materials @@ -14,6 +14,7 @@ **/ #include +#include "DebugLibDetect.h" /** This constructor function does not have anything to do. @@ -29,3 +30,19 @@ PlatformRomDebugLibIoPortConstructor ( { return RETURN_SUCCESS; } + +/** + Return the result of detecting the debug I/O port device. + + @retval TRUE if the debug I/O port device was detected. + @retval FALSE otherwise + +**/ +BOOLEAN +EFIAPI +PlatformDebugLibIoPortFound ( + VOID + ) +{ + return PlatformDebugLibIoPortDetect (); +}