The current implementation of QemuFwCfgLib is: - stateful - implicitly initialized in the library constructor.
OVMF's SEC runs from read-only memory/flash. When the library is linked into a SEC binary (which currently never happens), the "mQemuFwCfgSupported" global variable becomes read-only, making the library non-functional. Extract the stateful, implicitly initialized library implementation into a separate file, making room for a stateless, explicitly queried implementation that's usable in SEC. Restrict the stateful implementation to the current, non-SEC clients. Contributed-under: TianoCore Contribution Agreement 1.0 Reviewed-by: Jordan Justen <[email protected]> Signed-off-by: Laszlo Ersek <[email protected]> --- OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.inf | 6 +- OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.c | 74 ------------------ OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibPeiDxe.c | 92 +++++++++++++++++++++++ 3 files changed, 97 insertions(+), 75 deletions(-) create mode 100644 OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibPeiDxe.c diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.inf b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.inf index e6910c7..2661ac3 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.inf +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.inf @@ -1,5 +1,8 @@ ## @file # +# Stateful, implicitly initialized fw_cfg library. +# +# Copyright (C) 2013, Red Hat, Inc. # Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.<BR> # # This program and the accompanying materials @@ -18,7 +21,7 @@ FILE_GUID = fdd53716-31e1-4acc-9007-8bd5d877c96f MODULE_TYPE = BASE VERSION_STRING = 1.0 - LIBRARY_CLASS = QemuFwCfgLib + LIBRARY_CLASS = QemuFwCfgLib|PEIM DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER CONSTRUCTOR = QemuFwCfgInitialize @@ -30,6 +33,7 @@ [Sources] QemuFwCfgLib.c + QemuFwCfgLibPeiDxe.c [Sources.IA32] Ia32/IoLibExAsm.asm diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.c index f322e9c..e5e1468 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.c +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.c @@ -22,8 +22,6 @@ #include <Library/MemoryAllocationLib.h> #include <Library/UefiBootServicesTableLib.h> -STATIC BOOLEAN mQemuFwCfgSupported = FALSE; - /** Reads an 8-bit I/O port fifo into a block of memory. @@ -79,26 +77,6 @@ IoWriteFifo8 ( /** - Returns a boolean indicating if the firmware configuration interface - is available or not. - - This function may change fw_cfg state. - - @retval TRUE The interface is available - @retval FALSE The interface is not available - -**/ -BOOLEAN -EFIAPI -QemuFwCfgIsAvailable ( - VOID - ) -{ - return InternalQemuFwCfgIsAvailable (); -} - - -/** Selects a firmware configuration item for reading. Following this call, any data read from this item will start from @@ -265,39 +243,6 @@ QemuFwCfgRead64 ( } -RETURN_STATUS -EFIAPI -QemuFwCfgInitialize ( - VOID - ) -{ - UINT32 Signature; - UINT32 Revision; - - // - // Enable the access routines while probing to see if it is supported. - // - mQemuFwCfgSupported = TRUE; - - QemuFwCfgSelectItem (QemuFwCfgItemSignature); - Signature = QemuFwCfgRead32 (); - DEBUG ((EFI_D_INFO, "FW CFG Signature: 0x%x\n", Signature)); - QemuFwCfgSelectItem (QemuFwCfgItemInterfaceVersion); - Revision = QemuFwCfgRead32 (); - DEBUG ((EFI_D_INFO, "FW CFG Revision: 0x%x\n", Revision)); - if ((Signature != SIGNATURE_32 ('Q', 'E', 'M', 'U')) || - (Revision < 1) - ) { - DEBUG ((EFI_D_INFO, "QemuFwCfg interface not supported.\n")); - mQemuFwCfgSupported = FALSE; - return RETURN_SUCCESS; - } - - DEBUG ((EFI_D_INFO, "QemuFwCfg interface is supported.\n")); - return RETURN_SUCCESS; -} - - /** Find the configuration item corresponding to the firmware configuration file. @@ -377,22 +322,3 @@ QemuFwCfgS3Disabled ( QemuFwCfgReadBytes (sizeof SystemStates, SystemStates); return !(SystemStates[3] & BIT7); } - - -/** - Returns a boolean indicating if the firmware configuration interface is - available for library-internal purposes. - - This function never changes fw_cfg state. - - @retval TRUE The interface is available internally. - @retval FALSE The interface is not available internally. -**/ -BOOLEAN -EFIAPI -InternalQemuFwCfgIsAvailable ( - VOID - ) -{ - return mQemuFwCfgSupported; -} diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibPeiDxe.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibPeiDxe.c new file mode 100644 index 0000000..f693cff --- /dev/null +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibPeiDxe.c @@ -0,0 +1,92 @@ +/** @file + + Stateful and implicitly initialized fw_cfg library implementation. + + Copyright (C) 2013, Red Hat, Inc. + Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR> + + 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. +**/ + +#include <Library/DebugLib.h> +#include <Library/QemuFwCfgLib.h> + +STATIC BOOLEAN mQemuFwCfgSupported = FALSE; + + +/** + Returns a boolean indicating if the firmware configuration interface + is available or not. + + This function may change fw_cfg state. + + @retval TRUE The interface is available + @retval FALSE The interface is not available + +**/ +BOOLEAN +EFIAPI +QemuFwCfgIsAvailable ( + VOID + ) +{ + return InternalQemuFwCfgIsAvailable (); +} + + +RETURN_STATUS +EFIAPI +QemuFwCfgInitialize ( + VOID + ) +{ + UINT32 Signature; + UINT32 Revision; + + // + // Enable the access routines while probing to see if it is supported. + // + mQemuFwCfgSupported = TRUE; + + QemuFwCfgSelectItem (QemuFwCfgItemSignature); + Signature = QemuFwCfgRead32 (); + DEBUG ((EFI_D_INFO, "FW CFG Signature: 0x%x\n", Signature)); + QemuFwCfgSelectItem (QemuFwCfgItemInterfaceVersion); + Revision = QemuFwCfgRead32 (); + DEBUG ((EFI_D_INFO, "FW CFG Revision: 0x%x\n", Revision)); + if ((Signature != SIGNATURE_32 ('Q', 'E', 'M', 'U')) || + (Revision < 1) + ) { + DEBUG ((EFI_D_INFO, "QemuFwCfg interface not supported.\n")); + mQemuFwCfgSupported = FALSE; + return RETURN_SUCCESS; + } + + DEBUG ((EFI_D_INFO, "QemuFwCfg interface is supported.\n")); + return RETURN_SUCCESS; +} + + +/** + Returns a boolean indicating if the firmware configuration interface is + available for library-internal purposes. + + This function never changes fw_cfg state. + + @retval TRUE The interface is available internally. + @retval FALSE The interface is not available internally. +**/ +BOOLEAN +EFIAPI +InternalQemuFwCfgIsAvailable ( + VOID + ) +{ + return mQemuFwCfgSupported; +} -- 1.8.3.1 ------------------------------------------------------------------------------ Rapidly troubleshoot problems before they affect your business. Most IT organizations don't have a clear picture of how application performance affects their revenue. With AppDynamics, you get 100% visibility into your Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro! http://pubads.g.doubleclick.net/gampad/clk?id=84349831&iu=/4140/ostg.clktrk _______________________________________________ edk2-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/edk2-devel
