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

Reply via email to