Add IntelFsp2Pkg and IntelFsp2WrapperPkg.
authorJiewen Yao <jiewen.yao@intel.com>
Fri, 13 May 2016 05:00:53 +0000 (13:00 +0800)
committerJiewen Yao <jiewen.yao@intel.com>
Fri, 13 May 2016 05:00:53 +0000 (13:00 +0800)
Add FSP2.0 support.
This series of patch is to support FSP2.0 specification at
https://firmware.intel.com/sites/default/files/FSP_EAS_v2.0_Draft%20External.pdf

Some major updates include:
1) One FSP binary is separated to multiple components:
FSP-T, FSP-M, FSP-S, and optional FSP-O.
Each component has its own configuration data region.
2) All FSP-APIs use same UPD format - FSP_UPD_HEADER.
3) Add EnumInitPhaseEndOfFirmware notifyphase.
4) FSP1.1/FSP1.0 compatibility is NOT maintained.
5) We also add rename Fsp* to FspWrapper* in IntelFsp2WrapperPkg,
to indicate that it is for FspWrapper only.

IntelFspPkg and IntelFspWrapperPkg will be deprecated.
The new Intel platform will follow FSP2.0 and use IntelFsp2Pkg
and IntelFsp2WrapperPkg.
The old platform can still use IntelFspPkg and IntelFspWrapperPkg
for compatibility consideration.

Cc: Giri P Mudusuru <giri.p.mudusuru@intel.com>
Cc: Maurice Ma <maurice.ma@intel.com>
Cc: Ravi P Rangarajan <ravi.p.rangarajan@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jiewen Yao <jiewen.yao@intel.com>
Reviewed-by: Giri P Mudusuru <giri.p.mudusuru@intel.com>
Reviewed-by: Maurice Ma <maurice.ma@intel.com>
Reviewed-by: Ravi P Rangarajan <ravi.p.rangarajan@intel.com>
118 files changed:
IntelFsp2Pkg/Contributions.txt [new file with mode: 0644]
IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.c [new file with mode: 0644]
IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.h [new file with mode: 0644]
IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.inf [new file with mode: 0644]
IntelFsp2Pkg/FspSecCore/FspSecCoreM.inf [new file with mode: 0644]
IntelFsp2Pkg/FspSecCore/FspSecCoreS.inf [new file with mode: 0644]
IntelFsp2Pkg/FspSecCore/FspSecCoreT.inf [new file with mode: 0644]
IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryCommon.nasm [new file with mode: 0644]
IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryM.nasm [new file with mode: 0644]
IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryS.nasm [new file with mode: 0644]
IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryT.nasm [new file with mode: 0644]
IntelFsp2Pkg/FspSecCore/Ia32/FspHelper.nasm [new file with mode: 0644]
IntelFsp2Pkg/FspSecCore/Ia32/InitializeFpu.nasm [new file with mode: 0644]
IntelFsp2Pkg/FspSecCore/Ia32/MicrocodeLoadNasm.inc [new file with mode: 0644]
IntelFsp2Pkg/FspSecCore/Ia32/SaveRestoreSseNasm.inc [new file with mode: 0644]
IntelFsp2Pkg/FspSecCore/Ia32/Stack.nasm [new file with mode: 0644]
IntelFsp2Pkg/FspSecCore/SecFsp.c [new file with mode: 0644]
IntelFsp2Pkg/FspSecCore/SecFsp.h [new file with mode: 0644]
IntelFsp2Pkg/FspSecCore/SecFspApiChk.c [new file with mode: 0644]
IntelFsp2Pkg/FspSecCore/SecMain.c [new file with mode: 0644]
IntelFsp2Pkg/FspSecCore/SecMain.h [new file with mode: 0644]
IntelFsp2Pkg/FspSecCore/Vtf0/Bin/ResetVec.ia32.raw [new file with mode: 0644]
IntelFsp2Pkg/FspSecCore/Vtf0/Build.py [new file with mode: 0644]
IntelFsp2Pkg/FspSecCore/Vtf0/Ia16/ResetVec.asm16 [new file with mode: 0644]
IntelFsp2Pkg/FspSecCore/Vtf0/ResetVectorCode.asm [new file with mode: 0644]
IntelFsp2Pkg/FspSecCore/Vtf0/Tools/FixupForRawSection.py [new file with mode: 0644]
IntelFsp2Pkg/Include/FspDataTable.h [new file with mode: 0644]
IntelFsp2Pkg/Include/FspEas.h [new file with mode: 0644]
IntelFsp2Pkg/Include/FspEas/FspApi.h [new file with mode: 0644]
IntelFsp2Pkg/Include/FspGlobalData.h [new file with mode: 0644]
IntelFsp2Pkg/Include/FspMeasurePointId.h [new file with mode: 0644]
IntelFsp2Pkg/Include/FspStatusCode.h [new file with mode: 0644]
IntelFsp2Pkg/Include/Guid/FspHeaderFile.h [new file with mode: 0644]
IntelFsp2Pkg/Include/Guid/GuidHobFspEas.h [new file with mode: 0644]
IntelFsp2Pkg/Include/Library/CacheAsRamLib.h [new file with mode: 0644]
IntelFsp2Pkg/Include/Library/CacheLib.h [new file with mode: 0644]
IntelFsp2Pkg/Include/Library/DebugDeviceLib.h [new file with mode: 0644]
IntelFsp2Pkg/Include/Library/FspCommonLib.h [new file with mode: 0644]
IntelFsp2Pkg/Include/Library/FspPlatformLib.h [new file with mode: 0644]
IntelFsp2Pkg/Include/Library/FspSecPlatformLib.h [new file with mode: 0644]
IntelFsp2Pkg/Include/Library/FspSwitchStackLib.h [new file with mode: 0644]
IntelFsp2Pkg/IntelFsp2Pkg.dec [new file with mode: 0644]
IntelFsp2Pkg/IntelFsp2Pkg.dsc [new file with mode: 0644]
IntelFsp2Pkg/Library/BaseCacheAsRamLibNull/BaseCacheAsRamLibNull.inf [new file with mode: 0644]
IntelFsp2Pkg/Library/BaseCacheAsRamLibNull/DisableCacheAsRamNull.c [new file with mode: 0644]
IntelFsp2Pkg/Library/BaseCacheLib/BaseCacheLib.inf [new file with mode: 0644]
IntelFsp2Pkg/Library/BaseCacheLib/CacheLib.c [new file with mode: 0644]
IntelFsp2Pkg/Library/BaseCacheLib/CacheLibInternal.h [new file with mode: 0644]
IntelFsp2Pkg/Library/BaseDebugDeviceLibNull/BaseDebugDeviceLibNull.inf [new file with mode: 0644]
IntelFsp2Pkg/Library/BaseDebugDeviceLibNull/DebugDeviceLibNull.c [new file with mode: 0644]
IntelFsp2Pkg/Library/BaseFspCommonLib/BaseFspCommonLib.inf [new file with mode: 0644]
IntelFsp2Pkg/Library/BaseFspCommonLib/FspCommonLib.c [new file with mode: 0644]
IntelFsp2Pkg/Library/BaseFspDebugLibSerialPort/BaseFspDebugLibSerialPort.inf [new file with mode: 0644]
IntelFsp2Pkg/Library/BaseFspDebugLibSerialPort/DebugLib.c [new file with mode: 0644]
IntelFsp2Pkg/Library/BaseFspDebugLibSerialPort/Ia32/FspDebug.asm [new file with mode: 0644]
IntelFsp2Pkg/Library/BaseFspDebugLibSerialPort/Ia32/FspDebug.s [new file with mode: 0644]
IntelFsp2Pkg/Library/BaseFspPlatformLib/BaseFspPlatformLib.inf [new file with mode: 0644]
IntelFsp2Pkg/Library/BaseFspPlatformLib/FspPlatformMemory.c [new file with mode: 0644]
IntelFsp2Pkg/Library/BaseFspPlatformLib/FspPlatformNotify.c [new file with mode: 0644]
IntelFsp2Pkg/Library/BaseFspSwitchStackLib/BaseFspSwitchStackLib.inf [new file with mode: 0644]
IntelFsp2Pkg/Library/BaseFspSwitchStackLib/FspSwitchStackLib.c [new file with mode: 0644]
IntelFsp2Pkg/Library/BaseFspSwitchStackLib/Ia32/Stack.asm [new file with mode: 0644]
IntelFsp2Pkg/Library/BaseFspSwitchStackLib/Ia32/Stack.s [new file with mode: 0644]
IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/Ia32/Flat32.asm [new file with mode: 0644]
IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/Ia32/Flat32.s [new file with mode: 0644]
IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/Ia32/SecCarInit.asm [new file with mode: 0644]
IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/Ia32/SecCarInit.s [new file with mode: 0644]
IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/PlatformSecLibNull.c [new file with mode: 0644]
IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/SecFspSecPlatformLibNull.inf [new file with mode: 0644]
IntelFsp2Pkg/Tools/GenCfgOpt.py [new file with mode: 0644]
IntelFsp2Pkg/Tools/PatchFv.py [new file with mode: 0644]
IntelFsp2Pkg/Tools/SplitFspBin.py [new file with mode: 0644]
IntelFsp2Pkg/Tools/UserManuals/GenCfgOptUserManual.docx [new file with mode: 0644]
IntelFsp2Pkg/Tools/UserManuals/PatchFvUserManual.docx [new file with mode: 0644]
IntelFsp2WrapperPkg/Contributions.txt [new file with mode: 0644]
IntelFsp2WrapperPkg/FspWrapperNotifyDxe/FspWrapperNotifyDxe.c [new file with mode: 0644]
IntelFsp2WrapperPkg/FspWrapperNotifyDxe/FspWrapperNotifyDxe.inf [new file with mode: 0644]
IntelFsp2WrapperPkg/FspWrapperNotifyDxe/LoadBelow4G.c [new file with mode: 0644]
IntelFsp2WrapperPkg/FspmWrapperPeim/FspmWrapperPeim.c [new file with mode: 0644]
IntelFsp2WrapperPkg/FspmWrapperPeim/FspmWrapperPeim.inf [new file with mode: 0644]
IntelFsp2WrapperPkg/FspsWrapperPeim/FspsWrapperPeim.c [new file with mode: 0644]
IntelFsp2WrapperPkg/FspsWrapperPeim/FspsWrapperPeim.inf [new file with mode: 0644]
IntelFsp2WrapperPkg/Include/Library/FspWrapperApiLib.h [new file with mode: 0644]
IntelFsp2WrapperPkg/Include/Library/FspWrapperApiTestLib.h [new file with mode: 0644]
IntelFsp2WrapperPkg/Include/Library/FspWrapperHobProcessLib.h [new file with mode: 0644]
IntelFsp2WrapperPkg/Include/Library/FspWrapperPlatformLib.h [new file with mode: 0644]
IntelFsp2WrapperPkg/Include/Ppi/FspSiliconInitDone.h [new file with mode: 0644]
IntelFsp2WrapperPkg/Include/Ppi/TopOfTemporaryRam.h [new file with mode: 0644]
IntelFsp2WrapperPkg/IntelFsp2WrapperPkg.dec [new file with mode: 0644]
IntelFsp2WrapperPkg/IntelFsp2WrapperPkg.dsc [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/BaseFspWrapperApiLib/BaseFspWrapperApiLib.inf [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/BaseFspWrapperApiLib/FspWrapperApiLib.c [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/BaseFspWrapperApiLib/IA32/DispatchExecute.c [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/BaseFspWrapperApiLib/X64/DispatchExecute.c [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/BaseFspWrapperApiLib/X64/Thunk64To32.S [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/BaseFspWrapperApiLib/X64/Thunk64To32.asm [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/BaseFspWrapperApiTestLibNull/BaseFspWrapperApiTestLibNull.inf [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/BaseFspWrapperApiTestLibNull/FspWrapperApiTestNull.c [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/BaseFspWrapperPlatformLibSample/BaseFspWrapperPlatformLibSample.inf [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/BaseFspWrapperPlatformLibSample/FspWrapperPlatformLibSample.c [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/PeiFspWrapperApiTestLib/FspWrapperApiTest.c [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/PeiFspWrapperApiTestLib/PeiFspWrapperApiTestLib.inf [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/PeiFspWrapperHobProcessLibSample/FspWrapperHobProcessLibSample.c [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/PeiFspWrapperHobProcessLibSample/PeiFspWrapperHobProcessLibSample.inf [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/SecFspWrapperPlatformSecLibSample/FspWrapperPlatformSecLibSample.c [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/SecFspWrapperPlatformSecLibSample/Ia32/Fsp.h [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/SecFspWrapperPlatformSecLibSample/Ia32/PeiCoreEntry.S [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/SecFspWrapperPlatformSecLibSample/Ia32/PeiCoreEntry.asm [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/SecFspWrapperPlatformSecLibSample/Ia32/SecEntry.S [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/SecFspWrapperPlatformSecLibSample/Ia32/SecEntry.asm [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/SecFspWrapperPlatformSecLibSample/Ia32/Stack.S [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/SecFspWrapperPlatformSecLibSample/Ia32/Stack.asm [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/SecFspWrapperPlatformSecLibSample/PlatformInit.c [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/SecFspWrapperPlatformSecLibSample/SecFspWrapperPlatformSecLibSample.inf [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/SecFspWrapperPlatformSecLibSample/SecGetPerformance.c [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/SecFspWrapperPlatformSecLibSample/SecPlatformInformation.c [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/SecFspWrapperPlatformSecLibSample/SecRamInitData.c [new file with mode: 0644]
IntelFsp2WrapperPkg/Library/SecFspWrapperPlatformSecLibSample/SecTempRamDone.c [new file with mode: 0644]

diff --git a/IntelFsp2Pkg/Contributions.txt b/IntelFsp2Pkg/Contributions.txt
new file mode 100644 (file)
index 0000000..f87cbd7
--- /dev/null
@@ -0,0 +1,218 @@
+\r
+======================\r
+= Code Contributions =\r
+======================\r
+\r
+To make a contribution to a TianoCore project, follow these steps.\r
+1. Create a change description in the format specified below to\r
+   use in the source control commit log.\r
+2. Your commit message must include your "Signed-off-by" signature,\r
+   and "Contributed-under" message.\r
+3. Your "Contributed-under" message explicitly states that the\r
+   contribution is made under the terms of the specified\r
+   contribution agreement.  Your "Contributed-under" message\r
+   must include the name of contribution agreement and version.\r
+   For example: Contributed-under: TianoCore Contribution Agreement 1.0\r
+   The "TianoCore Contribution Agreement" is included below in\r
+   this document.\r
+4. Submit your code to the TianoCore project using the process\r
+   that the project documents on its web page.  If the process is\r
+   not documented, then submit the code on development email list\r
+   for the project.\r
+5. It is preferred that contributions are submitted using the same\r
+   copyright license as the base project. When that is not possible,\r
+   then contributions using the following licenses can be accepted:\r
+   * BSD (2-clause): http://opensource.org/licenses/BSD-2-Clause\r
+   * BSD (3-clause): http://opensource.org/licenses/BSD-3-Clause\r
+   * MIT: http://opensource.org/licenses/MIT\r
+   * Python-2.0: http://opensource.org/licenses/Python-2.0\r
+   * Zlib: http://opensource.org/licenses/Zlib\r
+\r
+   Contributions of code put into the public domain can also be\r
+   accepted.\r
+\r
+   Contributions using other licenses might be accepted, but further\r
+   review will be required.\r
+\r
+=====================================================\r
+= Change Description / Commit Message / Patch Email =\r
+=====================================================\r
+\r
+Your change description should use the standard format for a\r
+commit message, and must include your "Signed-off-by" signature\r
+and the "Contributed-under" message.\r
+\r
+== Sample Change Description / Commit Message =\r
+\r
+=== Start of sample patch email message ===\r
+\r
+From: Contributor Name <contributor@example.com>\r
+Subject: [PATCH] CodeModule: Brief-single-line-summary\r
+\r
+Full-commit-message\r
+\r
+Contributed-under: TianoCore Contribution Agreement 1.0\r
+Signed-off-by: Contributor Name <contributor@example.com>\r
+---\r
+\r
+An extra message for the patch email which will not be considered part\r
+of the commit message can be added here.\r
+\r
+Patch content inline or attached\r
+\r
+=== End of sample patch email message ===\r
+\r
+=== Notes for sample patch email ===\r
+\r
+* The first line of commit message is taken from the email's subject\r
+  line following [PATCH]. The remaining portion of the commit message\r
+  is the email's content until the '---' line.\r
+* git format-patch is one way to create this format\r
+\r
+=== Definitions for sample patch email ===\r
+\r
+* "CodeModule" is a short idenfier for the affected code.  For\r
+  example MdePkg, or MdeModulePkg UsbBusDxe.\r
+* "Brief-single-line-summary" is a short summary of the change.\r
+* The entire first line should be less than ~70 characters.\r
+* "Full-commit-message" a verbose multiple line comment describing\r
+  the change.  Each line should be less than ~70 characters.\r
+* "Contributed-under" explicitely states that the contribution is\r
+  made under the terms of the contribtion agreement.  This\r
+  agreement is included below in this document.\r
+* "Signed-off-by" is the contributor's signature identifying them\r
+  by their real/legal name and their email address.\r
+\r
+========================================\r
+= TianoCore Contribution Agreement 1.0 =\r
+========================================\r
+\r
+INTEL CORPORATION ("INTEL") MAKES AVAILABLE SOFTWARE, DOCUMENTATION,\r
+INFORMATION AND/OR OTHER MATERIALS FOR USE IN THE TIANOCORE OPEN SOURCE\r
+PROJECT (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE\r
+TERMS AND CONDITIONS OF THIS AGREEMENT BETWEEN YOU AND INTEL AND/OR THE\r
+TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR\r
+REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE\r
+CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS\r
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\r
+BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS\r
+AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE\r
+AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT\r
+USE THE CONTENT.\r
+\r
+Unless otherwise indicated, all Content made available on the TianoCore\r
+site is provided to you under the terms and conditions of the BSD\r
+License ("BSD"). A copy of the BSD License is available at\r
+http://opensource.org/licenses/bsd-license.php\r
+or when applicable, in the associated License.txt file.\r
+\r
+Certain other content may be made available under other licenses as\r
+indicated in or with such Content. (For example, in a License.txt file.)\r
+\r
+You accept and agree to the following terms and conditions for Your\r
+present and future Contributions submitted to TianoCore site. Except\r
+for the license granted to Intel hereunder, You reserve all right,\r
+title, and interest in and to Your Contributions.\r
+\r
+== SECTION 1: Definitions ==\r
+* "You" or "Contributor" shall mean the copyright owner or legal\r
+  entity authorized by the copyright owner that is making a\r
+  Contribution hereunder. All other entities that control, are\r
+  controlled by, or are under common control with that entity are\r
+  considered to be a single Contributor. For the purposes of this\r
+  definition, "control" means (i) the power, direct or indirect, to\r
+  cause the direction or management of such entity, whether by\r
+  contract or otherwise, or (ii) ownership of fifty percent (50%)\r
+  or more of the outstanding shares, or (iii) beneficial ownership\r
+  of such entity.\r
+* "Contribution" shall mean any original work of authorship,\r
+  including any modifications or additions to an existing work,\r
+  that is intentionally submitted by You to the TinaoCore site for\r
+  inclusion in, or documentation of, any of the Content. For the\r
+  purposes of this definition, "submitted" means any form of\r
+  electronic, verbal, or written communication sent to the\r
+  TianoCore site or its representatives, including but not limited\r
+  to communication on electronic mailing lists, source code\r
+  control systems, and issue tracking systems that are managed by,\r
+  or on behalf of, the TianoCore site for the purpose of\r
+  discussing and improving the Content, but excluding\r
+  communication that is conspicuously marked or otherwise\r
+  designated in writing by You as "Not a Contribution."\r
+\r
+== SECTION 2: License for Contributions ==\r
+* Contributor hereby agrees that redistribution and use of the\r
+  Contribution in source and binary forms, with or without\r
+  modification, are permitted provided that the following\r
+  conditions are met:\r
+** Redistributions of source code must retain the Contributor's\r
+   copyright notice, this list of conditions and the following\r
+   disclaimer.\r
+** Redistributions in binary form must reproduce the Contributor's\r
+   copyright notice, this list of conditions and the following\r
+   disclaimer in the documentation and/or other materials provided\r
+   with the distribution.\r
+* Disclaimer. None of the names of Contributor, Intel, or the names\r
+  of their respective contributors may be used to endorse or\r
+  promote products derived from this software without specific\r
+  prior written permission.\r
+* Contributor grants a license (with the right to sublicense) under\r
+  claims of Contributor's patents that Contributor can license that\r
+  are infringed by the Contribution (as delivered by Contributor) to\r
+  make, use, distribute, sell, offer for sale, and import the\r
+  Contribution and derivative works thereof solely to the minimum\r
+  extent necessary for licensee to exercise the granted copyright\r
+  license; this patent license applies solely to those portions of\r
+  the Contribution that are unmodified. No hardware per se is\r
+  licensed.\r
+* EXCEPT AS EXPRESSLY SET FORTH IN SECTION 3 BELOW, THE\r
+  CONTRIBUTION IS PROVIDED BY THE CONTRIBUTOR "AS IS" AND ANY\r
+  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\r
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\r
+  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\r
+  CONTRIBUTOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\r
+  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r
+  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\r
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE\r
+  CONTRIBUTION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\r
+  DAMAGE.\r
+\r
+== SECTION 3: Representations ==\r
+* You represent that You are legally entitled to grant the above\r
+  license. If your employer(s) has rights to intellectual property\r
+  that You create that includes Your Contributions, You represent\r
+  that You have received permission to make Contributions on behalf\r
+  of that employer, that Your employer has waived such rights for\r
+  Your Contributions.\r
+* You represent that each of Your Contributions is Your original\r
+  creation (see Section 4 for submissions on behalf of others).\r
+  You represent that Your Contribution submissions include complete\r
+  details of any third-party license or other restriction\r
+  (including, but not limited to, related patents and trademarks)\r
+  of which You are personally aware and which are associated with\r
+  any part of Your Contributions.\r
+\r
+== SECTION 4: Third Party Contributions ==\r
+* Should You wish to submit work that is not Your original creation,\r
+  You may submit it to TianoCore site separately from any\r
+  Contribution, identifying the complete details of its source\r
+  and of any license or other restriction (including, but not\r
+  limited to, related patents, trademarks, and license agreements)\r
+  of which You are personally aware, and conspicuously marking the\r
+  work as "Submitted on behalf of a third-party: [named here]".\r
+\r
+== SECTION 5: Miscellaneous ==\r
+* Applicable Laws. Any claims arising under or relating to this\r
+  Agreement shall be governed by the internal substantive laws of\r
+  the State of Delaware or federal courts located in Delaware,\r
+  without regard to principles of conflict of laws.\r
+* Language. This Agreement is in the English language only, which\r
+  language shall be controlling in all respects, and all versions\r
+  of this Agreement in any other language shall be for accommodation\r
+  only and shall not be binding. All communications and notices made\r
+  or given pursuant to this Agreement, and all documentation and\r
+  support to be provided, unless otherwise noted, shall be in the\r
+  English language.\r
+\r
diff --git a/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.c b/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.c
new file mode 100644 (file)
index 0000000..6acdeb3
--- /dev/null
@@ -0,0 +1,142 @@
+/** @file\r
+  Source file for FSP notify phase PEI module\r
+\r
+  Copyright (c) 2016, Intel Corporation. All rights reserved.\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+**/\r
+\r
+#include "FspNotifyPhasePeim.h"\r
+\r
+/**\r
+\r
+   This function waits for FSP notify.\r
+    \r
+   @param This          Entry point for DXE IPL PPI.\r
+   @param PeiServices   General purpose services available to every PEIM.\r
+   @param HobList       Address to the Pei HOB list.\r
+   \r
+   @return EFI_SUCCESS              This function never returns.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+WaitForNotify (\r
+  IN CONST EFI_DXE_IPL_PPI *This,\r
+  IN EFI_PEI_SERVICES      **PeiServices,\r
+  IN EFI_PEI_HOB_POINTERS  HobList\r
+  );\r
+\r
+CONST EFI_DXE_IPL_PPI mDxeIplPpi = {\r
+  WaitForNotify\r
+};\r
+\r
+CONST EFI_PEI_PPI_DESCRIPTOR mInstallDxeIplPpi = {\r
+  EFI_PEI_PPI_DESCRIPTOR_PPI,\r
+  &gEfiDxeIplPpiGuid,\r
+  (VOID *) &mDxeIplPpi\r
+};\r
+\r
+CONST EFI_PEI_PPI_DESCRIPTOR gEndOfPeiSignalPpi = {\r
+  (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
+  &gEfiEndOfPeiSignalPpiGuid,\r
+  NULL\r
+};\r
+\r
+/**\r
+\r
+   This function waits for FSP notify.\r
+    \r
+   @param This          Entry point for DXE IPL PPI.\r
+   @param PeiServices   General purpose services available to every PEIM.\r
+   @param HobList       Address to the Pei HOB list.\r
+   \r
+   @return EFI_SUCCESS              This function never returns.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+WaitForNotify (\r
+  IN CONST EFI_DXE_IPL_PPI *This,\r
+  IN EFI_PEI_SERVICES      **PeiServices,\r
+  IN EFI_PEI_HOB_POINTERS  HobList\r
+  )\r
+{\r
+  EFI_STATUS   Status;\r
+\r
+  DEBUG ((DEBUG_INFO | DEBUG_INIT, "FSP HOB is located at 0x%08X\n", HobList));\r
+\r
+  //\r
+  // End of PEI phase signal\r
+  //\r
+  Status = PeiServicesInstallPpi (&gEndOfPeiSignalPpi);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  //\r
+  // Give control back to BootLoader after FspSiliconInit\r
+  //\r
+  DEBUG ((DEBUG_INFO | DEBUG_INIT, "FSP is waiting for NOTIFY\n"));\r
+  FspSiliconInitDone ();\r
+\r
+  //\r
+  // BootLoader called FSP again through NotifyPhase\r
+  //\r
+  FspWaitForNotify ();\r
+\r
+  //\r
+  // Should not come here\r
+  //\r
+  while (TRUE) {\r
+    DEBUG ((DEBUG_ERROR, "No FSP API should be called after FSP is DONE!\n"));\r
+    SetFspApiReturnStatus (EFI_UNSUPPORTED);\r
+    Pei2LoaderSwitchStack ();\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  FSP notify phase PEI module entry point\r
+\r
+  @param[in]  FileHandle           Not used.\r
+  @param[in]  PeiServices          General purpose services available to every PEIM.\r
+\r
+  @retval     EFI_SUCCESS          The function completes successfully\r
+  @retval     EFI_OUT_OF_RESOURCES Insufficient resources to create database\r
+**/\r
+EFI_STATUS\r
+FspNotifyPhasePeimEntryPoint (\r
+  IN       EFI_PEI_FILE_HANDLE    FileHandle,\r
+  IN CONST EFI_PEI_SERVICES       **PeiServices\r
+  )\r
+{\r
+  EFI_STATUS                      Status;\r
+  VOID                            *OldDxeIplPpi;\r
+  EFI_PEI_PPI_DESCRIPTOR          *OldDescriptor;\r
+\r
+  DEBUG ((DEBUG_INFO | DEBUG_INIT, "The entry of FspNotificationPeim\n"));\r
+\r
+  //\r
+  // Locate old DXE IPL PPI\r
+  //\r
+  Status = PeiServicesLocatePpi (\r
+            &gEfiDxeIplPpiGuid,\r
+            0,\r
+            &OldDescriptor,\r
+            &OldDxeIplPpi\r
+            );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  //\r
+  // Re-install the DXE IPL PPI to wait for notify\r
+  //\r
+  Status = PeiServicesReInstallPpi (OldDescriptor, &mInstallDxeIplPpi);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
diff --git a/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.h b/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.h
new file mode 100644 (file)
index 0000000..6e2ae59
--- /dev/null
@@ -0,0 +1,23 @@
+/** @file\r
+  Header file for FSP notify phase PEI module\r
+\r
+  Copyright (c) 2016 Intel Corporation. All rights reserved.\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+**/\r
+\r
+#ifndef _FSP_NOTIFY_PHASE_PEIM_H_\r
+#define _FSP_NOTIFY_PHASE_PEIM_H_\r
+\r
+#include <Library/PeiServicesLib.h>\r
+#include <Ppi/DxeIpl.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/FspPlatformLib.h>\r
+#include <Library/FspCommonLib.h>\r
+#include <Library/FspSwitchStackLib.h>\r
+#endif\r
diff --git a/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.inf b/IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.inf
new file mode 100644 (file)
index 0000000..75f7ae5
--- /dev/null
@@ -0,0 +1,49 @@
+## @file\r
+# Component information file for the FSP notify phase PEI module.\r
+#\r
+#@copyright\r
+#  Copyright (c) 2016 Intel Corporation. All rights reserved.\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution.  The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php.\r
+#\r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+##\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = FspNotifyPhasePeim\r
+  FILE_GUID                      = 29CBB005-C972-49F3-960F-292E2202CECD\r
+  MODULE_TYPE                    = PEIM\r
+  VERSION_STRING                 = 1.0\r
+  ENTRY_POINT                    = FspNotifyPhasePeimEntryPoint\r
+\r
+[Sources]\r
+  FspNotifyPhasePeim.h\r
+  FspNotifyPhasePeim.c\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  IntelFsp2Pkg/IntelFsp2Pkg.dec\r
+\r
+[LibraryClasses]\r
+  PeimEntryPoint\r
+  DebugLib\r
+  FspPlatformLib\r
+  FspCommonLib\r
+  FspSwitchStackLib\r
+\r
+[Ppis]\r
+  gEfiDxeIplPpiGuid                       ## PRODUCES\r
+  gEfiEndOfPeiSignalPpiGuid               ## PRODUCES\r
+\r
+[Protocols]\r
+  gEfiPciEnumerationCompleteProtocolGuid  ## PRODUCES\r
+\r
+[Guids]\r
+  gEfiEventReadyToBootGuid                ## PRODUCES ## Event\r
+\r
+[Depex]\r
+  gEfiDxeIplPpiGuid\r
diff --git a/IntelFsp2Pkg/FspSecCore/FspSecCoreM.inf b/IntelFsp2Pkg/FspSecCore/FspSecCoreM.inf
new file mode 100644 (file)
index 0000000..611fab2
--- /dev/null
@@ -0,0 +1,74 @@
+## @file\r
+#  Sec Core for FSP\r
+#\r
+#  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
+#\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution. The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php.\r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+##\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = FspSecCoreM\r
+  FILE_GUID                      = C2F9AE46-3437-4FEF-9CB1-9A568B282FEE\r
+  MODULE_TYPE                    = SEC\r
+  VERSION_STRING                 = 1.0\r
+\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+#  VALID_ARCHITECTURES           = IA32\r
+#\r
+\r
+[Sources]\r
+  SecMain.c\r
+  SecMain.h\r
+  SecFsp.c\r
+  SecFsp.h\r
+  SecFspApiChk.c\r
+\r
+[Sources.IA32]\r
+  Ia32/Stack.nasm\r
+  Ia32/InitializeFpu.nasm\r
+  Ia32/FspApiEntryM.nasm\r
+  Ia32/FspApiEntryCommon.nasm\r
+  Ia32/FspHelper.nasm\r
+\r
+[Binaries.Ia32]\r
+  RAW|Vtf0/Bin/ResetVec.ia32.raw |GCC\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  MdeModulePkg/MdeModulePkg.dec  \r
+  IntelFsp2Pkg/IntelFsp2Pkg.dec\r
+\r
+[LibraryClasses]\r
+  BaseMemoryLib\r
+  DebugLib\r
+  BaseLib\r
+  PciCf8Lib\r
+  SerialPortLib\r
+  FspSwitchStackLib\r
+  FspCommonLib\r
+  FspSecPlatformLib\r
+\r
+[Pcd]\r
+  gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress           ## UNDEFINED\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdGlobalDataPointerAddress      ## CONSUMES\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdTemporaryRamBase              ## CONSUMES\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdTemporaryRamSize              ## CONSUMES\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspTemporaryRamSize           ## CONSUMES\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspHeapSizePercentage         ## CONSUMES\r
+\r
+[FixedPcd]\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspMaxPatchEntry              ## CONSUMES\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspMaxPerfEntry               ## CONSUMES\r
+\r
+[Ppis]\r
+  gEfiTemporaryRamSupportPpiGuid                              ## PRODUCES\r
+\r
diff --git a/IntelFsp2Pkg/FspSecCore/FspSecCoreS.inf b/IntelFsp2Pkg/FspSecCore/FspSecCoreS.inf
new file mode 100644 (file)
index 0000000..8e1bb4a
--- /dev/null
@@ -0,0 +1,68 @@
+## @file\r
+#  Sec Core for FSP\r
+#\r
+#  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
+#\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution. The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php.\r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+##\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = FspSecCoreS\r
+  FILE_GUID                      = 53AB1ACD-EDB1-4E3A-A2C7-978D721D179D\r
+  MODULE_TYPE                    = SEC\r
+  VERSION_STRING                 = 1.0\r
+\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+#  VALID_ARCHITECTURES           = IA32\r
+#\r
+\r
+[Sources]\r
+  SecFspApiChk.c\r
+\r
+[Sources.IA32]\r
+  Ia32/Stack.nasm\r
+  Ia32/FspApiEntryS.nasm\r
+  Ia32/FspApiEntryCommon.nasm\r
+  Ia32/FspHelper.nasm\r
+\r
+[Binaries.Ia32]\r
+  RAW|Vtf0/Bin/ResetVec.ia32.raw |GCC\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  MdeModulePkg/MdeModulePkg.dec  \r
+  IntelFsp2Pkg/IntelFsp2Pkg.dec\r
+\r
+[LibraryClasses]\r
+  BaseMemoryLib\r
+  DebugLib\r
+  BaseLib\r
+  PciCf8Lib\r
+  SerialPortLib\r
+  FspSwitchStackLib\r
+  FspCommonLib\r
+  FspSecPlatformLib\r
+\r
+[Pcd]\r
+  gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress           ## UNDEFINED\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdGlobalDataPointerAddress      ## CONSUMES\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdTemporaryRamBase              ## CONSUMES\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdTemporaryRamSize              ## CONSUMES\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspTemporaryRamSize           ## CONSUMES\r
+\r
+[FixedPcd]\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspMaxPatchEntry              ## CONSUMES\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspMaxPerfEntry               ## CONSUMES\r
+\r
+[Ppis]\r
+  gEfiTemporaryRamSupportPpiGuid                              ## PRODUCES\r
+\r
diff --git a/IntelFsp2Pkg/FspSecCore/FspSecCoreT.inf b/IntelFsp2Pkg/FspSecCore/FspSecCoreT.inf
new file mode 100644 (file)
index 0000000..cf6a191
--- /dev/null
@@ -0,0 +1,66 @@
+## @file\r
+#  Sec Core for FSP\r
+#\r
+#  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
+#\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution. The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php.\r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+##\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = FspSecCoreT\r
+  FILE_GUID                      = 5B94E419-C795-414D-A0D4-B80A877BE5FE\r
+  MODULE_TYPE                    = SEC\r
+  VERSION_STRING                 = 1.0\r
+\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+#  VALID_ARCHITECTURES           = IA32\r
+#\r
+\r
+[Sources]\r
+\r
+\r
+[Sources.IA32]\r
+  Ia32/Stack.nasm\r
+  Ia32/InitializeFpu.nasm\r
+  Ia32/FspApiEntryT.nasm\r
+  Ia32/FspHelper.nasm\r
+\r
+[Binaries.Ia32]\r
+  RAW|Vtf0/Bin/ResetVec.ia32.raw |GCC\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  MdeModulePkg/MdeModulePkg.dec\r
+  IntelFsp2Pkg/IntelFsp2Pkg.dec\r
+\r
+[LibraryClasses]\r
+  BaseMemoryLib\r
+  DebugLib\r
+  BaseLib\r
+  PciCf8Lib\r
+  SerialPortLib\r
+  FspSwitchStackLib\r
+  FspCommonLib\r
+  FspSecPlatformLib\r
+\r
+[Pcd]\r
+  gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress           ## UNDEFINED\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdTemporaryRamBase              ## CONSUMES\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdTemporaryRamSize              ## CONSUMES\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspReservedBufferSize         ## CONSUMES\r
+\r
+[FixedPcd]\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspMaxPatchEntry              ## CONSUMES\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspMaxPerfEntry               ## CONSUMES\r
+\r
+[Ppis]\r
+  gEfiTemporaryRamSupportPpiGuid                              ## PRODUCES\r
diff --git a/IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryCommon.nasm b/IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryCommon.nasm
new file mode 100644 (file)
index 0000000..c48a956
--- /dev/null
@@ -0,0 +1,76 @@
+;; @file\r
+;  Provide FSP API entry points.\r
+;\r
+; Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
+; This program and the accompanying materials\r
+; are licensed and made available under the terms and conditions of the BSD License\r
+; which accompanies this distribution.  The full text of the license may be found at\r
+; http://opensource.org/licenses/bsd-license.php.\r
+;\r
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+;;\r
+\r
+    SECTION .text\r
+\r
+;\r
+; Following functions will be provided in C\r
+;\r
+extern ASM_PFX(Loader2PeiSwitchStack)\r
+extern ASM_PFX(FspApiCallingCheck)\r
+\r
+;\r
+; Following functions will be provided in ASM\r
+;\r
+extern ASM_PFX(FspApiCommonContinue)\r
+extern ASM_PFX(AsmGetFspInfoHeader)\r
+\r
+;----------------------------------------------------------------------------\r
+; FspApiCommon API\r
+;\r
+; This is the FSP API common entry point to resume the FSP execution\r
+;\r
+;----------------------------------------------------------------------------\r
+global ASM_PFX(FspApiCommon)\r
+ASM_PFX(FspApiCommon):\r
+  ;\r
+  ; EAX holds the API index\r
+  ;\r
+\r
+  ;\r
+  ; Stack must be ready\r
+  ;\r
+  push   eax\r
+  add    esp, 4\r
+  cmp    eax, dword  [esp - 4]\r
+  jz     FspApiCommon1\r
+  mov    eax, 080000003h\r
+  jmp    exit\r
+\r
+FspApiCommon1:\r
+  ;\r
+  ; Verify the calling condition\r
+  ;\r
+  pushad\r
+  push   DWORD [esp + (4 * 8 + 4)]  ; push ApiParam\r
+  push   eax                ; push ApiIdx\r
+  call   ASM_PFX(FspApiCallingCheck)\r
+  add    esp, 8\r
+  cmp    eax, 0\r
+  jz     FspApiCommon2\r
+  mov    dword  [esp + (4 * 7)], eax\r
+  popad\r
+exit:\r
+  ret\r
+\r
+FspApiCommon2:\r
+  popad\r
+  cmp    eax, 3   ; FspMemoryInit API\r
+  jz     FspApiCommon3\r
+\r
+  call   ASM_PFX(AsmGetFspInfoHeader)\r
+  jmp    ASM_PFX(Loader2PeiSwitchStack)\r
+\r
+FspApiCommon3:\r
+  jmp    ASM_PFX(FspApiCommonContinue)\r
+\r
diff --git a/IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryM.nasm b/IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryM.nasm
new file mode 100644 (file)
index 0000000..9744e16
--- /dev/null
@@ -0,0 +1,202 @@
+;; @file\r
+;  Provide FSP API entry points.\r
+;\r
+; Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
+; This program and the accompanying materials\r
+; are licensed and made available under the terms and conditions of the BSD License\r
+; which accompanies this distribution.  The full text of the license may be found at\r
+; http://opensource.org/licenses/bsd-license.php.\r
+;\r
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+;;\r
+\r
+    SECTION .text\r
+\r
+;\r
+; Following are fixed PCDs\r
+;\r
+extern   ASM_PFX(PcdGet32(PcdTemporaryRamBase))\r
+extern   ASM_PFX(PcdGet32(PcdTemporaryRamSize))\r
+extern   ASM_PFX(PcdGet32(PcdFspTemporaryRamSize))\r
+\r
+struc FSPM_UPD_COMMON\r
+    ; FSP_UPD_HEADER {\r
+    .FspUpdHeader:            resd    8\r
+    ; }\r
+    ; FSPM_ARCH_UPD {\r
+    .Revision:                resb    1\r
+    .Reserved:                resb    3\r
+    .NvsBufferPtr:            resd    1\r
+    .StackBase:               resd    1\r
+    .StackSize:               resd    1\r
+    .BootLoaderTolumSize:     resd    1\r
+    .BootMode:                resd    1\r
+    .Reserved1:               resb    8\r
+    ; }\r
+    .size:\r
+endstruc\r
+\r
+;\r
+; Following functions will be provided in C\r
+;\r
+extern ASM_PFX(SecStartup)\r
+extern ASM_PFX(FspApiCommon)\r
+\r
+;\r
+; Following functions will be provided in PlatformSecLib\r
+;\r
+extern ASM_PFX(AsmGetFspBaseAddress)\r
+extern ASM_PFX(AsmGetFspInfoHeader)\r
+\r
+API_PARAM1_OFFSET            EQU   34h  ; ApiParam1 [ sub esp,8 + pushad + pushfd + push eax + call]\r
+FSP_HEADER_IMGBASE_OFFSET    EQU   1Ch\r
+FSP_HEADER_CFGREG_OFFSET     EQU   24h\r
+\r
+;----------------------------------------------------------------------------\r
+; FspMemoryInit API\r
+;\r
+; This FSP API is called after TempRamInit and initializes the memory.\r
+;\r
+;----------------------------------------------------------------------------\r
+global ASM_PFX(FspMemoryInitApi)\r
+ASM_PFX(FspMemoryInitApi):\r
+  mov    eax,  3 ; FSP_API_INDEX.FspMemoryInitApiIndex\r
+  jmp    ASM_PFX(FspApiCommon)\r
+\r
+;----------------------------------------------------------------------------\r
+; TempRamExitApi API\r
+;\r
+; This API tears down temporary RAM\r
+;\r
+;----------------------------------------------------------------------------\r
+global ASM_PFX(TempRamExitApi)\r
+ASM_PFX(TempRamExitApi):\r
+  mov    eax,  4 ; FSP_API_INDEX.TempRamExitApiIndex\r
+  jmp    ASM_PFX(FspApiCommon)\r
+\r
+;----------------------------------------------------------------------------\r
+; FspApiCommonContinue API\r
+;\r
+; This is the FSP API common entry point to resume the FSP execution\r
+;\r
+;----------------------------------------------------------------------------\r
+global ASM_PFX(FspApiCommonContinue)\r
+ASM_PFX(FspApiCommonContinue):\r
+  ;\r
+  ; EAX holds the API index\r
+  ;\r
+\r
+  ;\r
+  ; FspMemoryInit API setup the initial stack frame\r
+  ;\r
+\r
+  ;\r
+  ; Place holder to store the FspInfoHeader pointer\r
+  ;\r
+  push   eax\r
+\r
+  ;\r
+  ; Update the FspInfoHeader pointer\r
+  ;\r
+  push   eax\r
+  call   ASM_PFX(AsmGetFspInfoHeader)\r
+  mov    [esp + 4], eax\r
+  pop    eax\r
+\r
+  ;\r
+  ; Create a Task Frame in the stack for the Boot Loader\r
+  ;\r
+  pushfd     ; 2 pushf for 4 byte alignment\r
+  cli\r
+  pushad\r
+\r
+  ; Reserve 8 bytes for IDT save/restore\r
+  sub     esp, 8\r
+  sidt    [esp]\r
+\r
+\r
+  ;  Get Stackbase and StackSize from FSPM_UPD Param \r
+  mov    edx, [esp + API_PARAM1_OFFSET] \r
+  cmp    edx, 0\r
+  jnz    FspStackSetup  \r
+\r
+  ; Get UPD default values if FspmUpdDataPtr (ApiParam1) is null\r
+  push   eax\r
+  call   ASM_PFX(AsmGetFspInfoHeader)\r
+  mov    edx, [eax + FSP_HEADER_IMGBASE_OFFSET]\r
+  add    edx, [eax + FSP_HEADER_CFGREG_OFFSET]\r
+  pop    eax\r
+  \r
+  FspStackSetup:\r
+  mov    edi, [edx + FSPM_UPD_COMMON.StackBase]\r
+  mov    ecx, [edx + FSPM_UPD_COMMON.StackSize]\r
+  add    edi, ecx\r
+  ;\r
+  ; Setup new FSP stack\r
+  ;\r
+  xchg    edi, esp                                ; Exchange edi and esp, edi will be assigned to the current esp pointer and esp will be Stack base + Stack size\r
+  mov     ebx, esp                                ; Put Stack base + Stack size in ebx\r
+\r
+  ;\r
+  ; Pass the API Idx to SecStartup\r
+  ;\r
+  push    eax\r
+\r
+  ;\r
+  ; Pass the BootLoader stack to SecStartup\r
+  ;\r
+  push    edi\r
+\r
+  ;\r
+  ; Pass entry point of the PEI core\r
+  ;\r
+  call    ASM_PFX(AsmGetFspBaseAddress)\r
+  mov     edi, eax\r
+  call    ASM_PFX(AsmGetPeiCoreOffset)\r
+  add     edi, eax\r
+  push    edi\r
+\r
+  ;\r
+  ; Pass BFV into the PEI Core\r
+  ; It uses relative address to calucate the actual boot FV base\r
+  ; For FSP implementation with single FV, PcdFspBootFirmwareVolumeBase and\r
+  ; PcdFspAreaBaseAddress are the same. For FSP with mulitple FVs,\r
+  ; they are different. The code below can handle both cases.\r
+  ;\r
+  call    ASM_PFX(AsmGetFspBaseAddress)\r
+  push    eax\r
+\r
+  ;\r
+  ; Pass stack base and size into the PEI Core\r
+  ;\r
+  sub     ebx, ecx            ; Stack base + Stack size - Stack size\r
+  push    ebx\r
+  push    ecx\r
+\r
+  ;\r
+  ; Pass Control into the PEI Core\r
+  ;\r
+  call    ASM_PFX(SecStartup)\r
+  add     esp, 4\r
+exit:\r
+  ret\r
+\r
+global ASM_PFX(FspPeiCoreEntryOff)\r
+ASM_PFX(FspPeiCoreEntryOff):\r
+   ;\r
+   ; This value will be pached by the build script\r
+   ;\r
+   DD    0x12345678\r
+\r
+global ASM_PFX(AsmGetPeiCoreOffset)\r
+ASM_PFX(AsmGetPeiCoreOffset):\r
+   mov   eax, dword [ASM_PFX(FspPeiCoreEntryOff)]\r
+   ret\r
+\r
+;----------------------------------------------------------------------------\r
+; Module Entrypoint API\r
+;----------------------------------------------------------------------------\r
+global ASM_PFX(_ModuleEntryPoint)\r
+ASM_PFX(_ModuleEntryPoint):\r
+  jmp $\r
diff --git a/IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryS.nasm b/IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryS.nasm
new file mode 100644 (file)
index 0000000..cdc1149
--- /dev/null
@@ -0,0 +1,62 @@
+;; @file\r
+;  Provide FSP API entry points.\r
+;\r
+; Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
+; This program and the accompanying materials\r
+; are licensed and made available under the terms and conditions of the BSD License\r
+; which accompanies this distribution.  The full text of the license may be found at\r
+; http://opensource.org/licenses/bsd-license.php.\r
+;\r
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+;;\r
+\r
+    SECTION .text\r
+\r
+;\r
+; Following functions will be provided in C\r
+;\r
+extern ASM_PFX(FspApiCommon)\r
+\r
+;----------------------------------------------------------------------------\r
+; NotifyPhase API\r
+;\r
+; This FSP API will notify the FSP about the different phases in the boot\r
+; process\r
+;\r
+;----------------------------------------------------------------------------\r
+global ASM_PFX(NotifyPhaseApi)\r
+ASM_PFX(NotifyPhaseApi):\r
+  mov    eax,  2 ; FSP_API_INDEX.NotifyPhaseApiIndex\r
+  jmp    ASM_PFX(FspApiCommon)\r
+\r
+;----------------------------------------------------------------------------\r
+; FspSiliconInit API\r
+;\r
+; This FSP API initializes the CPU and the chipset including the IO\r
+; controllers in the chipset to enable normal operation of these devices.\r
+;\r
+;----------------------------------------------------------------------------\r
+global ASM_PFX(FspSiliconInitApi)\r
+ASM_PFX(FspSiliconInitApi):\r
+  mov    eax,  5 ; FSP_API_INDEX.FspSiliconInitApiIndex\r
+  jmp    ASM_PFX(FspApiCommon)\r
+\r
+;----------------------------------------------------------------------------\r
+; FspApiCommonContinue API\r
+;\r
+; This is the FSP API common entry point to resume the FSP execution\r
+;\r
+;----------------------------------------------------------------------------\r
+global ASM_PFX(FspApiCommonContinue)\r
+ASM_PFX(FspApiCommonContinue):\r
+  jmp    $\r
+  ret\r
+\r
+;----------------------------------------------------------------------------\r
+; Module Entrypoint API\r
+;----------------------------------------------------------------------------\r
+global ASM_PFX(_ModuleEntryPoint)\r
+ASM_PFX(_ModuleEntryPoint):\r
+  jmp $\r
+\r
diff --git a/IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryT.nasm b/IntelFsp2Pkg/FspSecCore/Ia32/FspApiEntryT.nasm
new file mode 100644 (file)
index 0000000..55ee85a
--- /dev/null
@@ -0,0 +1,469 @@
+;; @file\r
+;  Provide FSP API entry points.\r
+;\r
+; Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
+; This program and the accompanying materials\r
+; are licensed and made available under the terms and conditions of the BSD License\r
+; which accompanies this distribution.  The full text of the license may be found at\r
+; http://opensource.org/licenses/bsd-license.php.\r
+;\r
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+;;\r
+\r
+    SECTION .text\r
+\r
+%include    "SaveRestoreSseNasm.inc"\r
+%include    "MicrocodeLoadNasm.inc"\r
+\r
+;\r
+; Following are fixed PCDs\r
+;\r
+extern   ASM_PFX(PcdGet32 (PcdTemporaryRamBase))\r
+extern   ASM_PFX(PcdGet32 (PcdTemporaryRamSize))\r
+extern   ASM_PFX(PcdGet32 (PcdFspReservedBufferSize))\r
+\r
+;\r
+; Following functions will be provided in PlatformSecLib\r
+;\r
+extern ASM_PFX(AsmGetFspBaseAddress)\r
+extern ASM_PFX(AsmGetFspInfoHeader)\r
+;extern ASM_PFX(LoadMicrocode)    ; @todo: needs a weak implementation\r
+extern ASM_PFX(SecPlatformInit)   ; @todo: needs a weak implementation\r
+extern ASM_PFX(SecCarInit)\r
+\r
+;\r
+; Define the data length that we saved on the stack top\r
+;\r
+DATA_LEN_OF_PER0         EQU   18h\r
+DATA_LEN_OF_MCUD         EQU   18h\r
+DATA_LEN_AT_STACK_TOP    EQU   (DATA_LEN_OF_PER0 + DATA_LEN_OF_MCUD + 4)\r
+\r
+;\r
+; @todo: These structures are moved from MicrocodeLoadNasm.inc to avoid\r
+;        build error. This needs to be fixed later on.\r
+;\r
+struc MicrocodeHdr\r
+    .MicrocodeHdrVersion:      resd    1\r
+    .MicrocodeHdrRevision:     resd    1\r
+    .MicrocodeHdrDate:         resd    1\r
+    .MicrocodeHdrProcessor:    resd    1\r
+    .MicrocodeHdrChecksum:     resd    1\r
+    .MicrocodeHdrLoader:       resd    1\r
+    .MicrocodeHdrFlags:        resd    1\r
+    .MicrocodeHdrDataSize:     resd    1\r
+    .MicrocodeHdrTotalSize:    resd    1\r
+    .MicrocodeHdrRsvd:         resd    3\r
+    .size:\r
+endstruc\r
+\r
+struc ExtSigHdr\r
+    .ExtSigHdrCount:          resd    1\r
+    .ExtSigHdrChecksum:       resd    1\r
+    .ExtSigHdrRsvd:           resd    3\r
+    .size:\r
+endstruc\r
+\r
+struc ExtSig\r
+    .ExtSigProcessor:         resd    1\r
+    .ExtSigFlags:             resd    1\r
+    .ExtSigChecksum:          resd    1\r
+    .size:\r
+endstruc\r
+\r
+struc LoadMicrocodeParams\r
+    ; FSP_UPD_HEADER {\r
+    .FspUpdHeader:            resd    8\r
+    ; }\r
+    ; FSPT_CORE_UPD {\r
+    .MicrocodeCodeAddr:       resd    1\r
+    .MicrocodeCodeSize:       resd    1\r
+    .CodeRegionBase:          resd    1\r
+    .CodeRegionSize:          resd    1\r
+    ; }\r
+    .size:\r
+endstruc\r
+\r
+\r
+;\r
+; Define SSE macros\r
+;\r
+;\r
+;args 1: ReturnAddress  2:MmxRegister\r
+;\r
+%macro LOAD_MMX_EXT 2\r
+  mov     esi, %1\r
+  movd    %2, esi              ; save ReturnAddress into MMX\r
+%endmacro\r
+\r
+;\r
+;args 1: RoutineLabel  2:MmxRegister\r
+;\r
+%macro CALL_MMX_EXT  2\r
+  mov     esi, %%ReturnAddress\r
+  movd    %2, esi              ; save ReturnAddress into MMX\r
+  jmp     %1\r
+%%ReturnAddress:\r
+%endmacro\r
+\r
+;\r
+;arg 1:MmxRegister\r
+;\r
+%macro RET_ESI_EXT   1\r
+  movd    esi, %1              ; move ReturnAddress from MMX to ESI\r
+  jmp     esi\r
+%endmacro\r
+\r
+;\r
+;arg 1:RoutineLabel\r
+;\r
+%macro CALL_MMX   1\r
+         CALL_MMX_EXT  %1, mm7\r
+%endmacro\r
+\r
+%macro RET_ESI 0\r
+         RET_ESI_EXT   mm7\r
+%endmacro\r
+\r
+;\r
+; @todo: The strong/weak implementation does not work.\r
+;        This needs to be reviewed later.\r
+;\r
+;------------------------------------------------------------------------------\r
+;\r
+;;global ASM_PFX(SecPlatformInitDefault)\r
+;ASM_PFX(SecPlatformInitDefault):\r
+;   ; Inputs:\r
+;   ;   mm7 -> Return address\r
+;   ; Outputs:\r
+;   ;   eax -> 0 - Successful, Non-zero - Failed.\r
+;   ; Register Usage:\r
+;   ;   eax is cleared and ebp is used for return address.\r
+;   ;   All others reserved.\r
+;\r
+;   ; Save return address to EBP\r
+;   movd  ebp, mm7\r
+;\r
+;   xor   eax, eax\r
+;Exit1:\r
+;   jmp   ebp\r
+\r
+;------------------------------------------------------------------------------\r
+global ASM_PFX(LoadMicrocodeDefault)\r
+ASM_PFX(LoadMicrocodeDefault):\r
+   ; Inputs:\r
+   ;   esp -> LoadMicrocodeParams pointer\r
+   ; Register Usage:\r
+   ;   esp  Preserved\r
+   ;   All others destroyed\r
+   ; Assumptions:\r
+   ;   No memory available, stack is hard-coded and used for return address\r
+   ;   Executed by SBSP and NBSP\r
+   ;   Beginning of microcode update region starts on paragraph boundary\r
+\r
+   ;\r
+   ;\r
+   ; Save return address to EBP\r
+   movd   ebp, mm7\r
+\r
+   cmp    esp, 0\r
+   jz     ParamError\r
+   mov    eax, dword [esp + 4]    ; Parameter pointer\r
+   cmp    eax, 0\r
+   jz     ParamError\r
+   mov    esp, eax\r
+   \r
+   mov    esi, dword [esp + LoadMicrocodeParams.MicrocodeCodeAddr]\r
+   cmp    esi, 0\r
+   jnz    CheckMainHeader\r
+\r
+ParamError:\r
+   mov    eax, 080000002h\r
+   jmp    Exit2\r
+\r
+CheckMainHeader:\r
+   ; Get processor signature and platform ID from the installed processor\r
+   ; and save into registers for later use\r
+   ; ebx = processor signature\r
+   ; edx = platform ID\r
+   mov   eax, 1\r
+   cpuid\r
+   mov   ebx, eax\r
+   mov   ecx, MSR_IA32_PLATFORM_ID\r
+   rdmsr\r
+   mov   ecx, edx\r
+   shr   ecx, 50-32                          ; shift (50d-32d=18d=0x12) bits\r
+   and   ecx, 7h                             ; platform id at bit[52..50]\r
+   mov   edx, 1\r
+   shl   edx, cl\r
+\r
+   ; Current register usage\r
+   ; esp -> stack with parameters\r
+   ; esi -> microcode update to check\r
+   ; ebx = processor signature\r
+   ; edx = platform ID\r
+\r
+   ; Check for valid microcode header\r
+   ; Minimal test checking for header version and loader version as 1\r
+   mov   eax, dword 1\r
+   cmp   dword [esi + MicrocodeHdr.MicrocodeHdrVersion], eax\r
+   jne   AdvanceFixedSize\r
+   cmp   dword [esi + MicrocodeHdr.MicrocodeHdrLoader], eax\r
+   jne   AdvanceFixedSize\r
+\r
+   ; Check if signature and plaform ID match\r
+   cmp   ebx, dword [esi + MicrocodeHdr.MicrocodeHdrProcessor]\r
+   jne   LoadMicrocodeDefault1\r
+   test  edx, dword [esi + MicrocodeHdr.MicrocodeHdrFlags ]\r
+   jnz   LoadCheck  ; Jif signature and platform ID match\r
+\r
+LoadMicrocodeDefault1:\r
+   ; Check if extended header exists\r
+   ; First check if MicrocodeHdrTotalSize and MicrocodeHdrDataSize are valid\r
+   xor   eax, eax\r
+   cmp   dword [esi + MicrocodeHdr.MicrocodeHdrTotalSize], eax\r
+   je    NextMicrocode\r
+   cmp   dword [esi + MicrocodeHdr.MicrocodeHdrDataSize], eax\r
+   je    NextMicrocode\r
+\r
+   ; Then verify total size - sizeof header > data size\r
+   mov   ecx, dword [esi + MicrocodeHdr.MicrocodeHdrTotalSize]\r
+   sub   ecx, MicrocodeHdr.size\r
+   cmp   ecx, dword [esi + MicrocodeHdr.MicrocodeHdrDataSize]\r
+   jng   NextMicrocode    ; Jif extended header does not exist\r
+\r
+   ; Set edi -> extended header\r
+   mov   edi, esi\r
+   add   edi, MicrocodeHdr.size\r
+   add   edi, dword [esi + MicrocodeHdr.MicrocodeHdrDataSize]\r
+\r
+   ; Get count of extended structures\r
+   mov   ecx, dword [edi + ExtSigHdr.ExtSigHdrCount]\r
+\r
+   ; Move pointer to first signature structure\r
+   add   edi, ExtSigHdr.size\r
+\r
+CheckExtSig:\r
+   ; Check if extended signature and platform ID match\r
+   cmp   dword [edi + ExtSig.ExtSigProcessor], ebx\r
+   jne   LoadMicrocodeDefault2\r
+   test  dword [edi + ExtSig.ExtSigFlags], edx\r
+   jnz   LoadCheck      ; Jif signature and platform ID match\r
+LoadMicrocodeDefault2:\r
+   ; Check if any more extended signatures exist\r
+   add   edi, ExtSig.size\r
+   loop  CheckExtSig\r
+\r
+NextMicrocode:\r
+   ; Advance just after end of this microcode\r
+   xor   eax, eax\r
+   cmp   dword [esi + MicrocodeHdr.MicrocodeHdrTotalSize], eax\r
+   je    LoadMicrocodeDefault3\r
+   add   esi, dword [esi + MicrocodeHdr.MicrocodeHdrTotalSize]\r
+   jmp   CheckAddress\r
+LoadMicrocodeDefault3:\r
+   add   esi, dword  2048\r
+   jmp   CheckAddress\r
+\r
+AdvanceFixedSize:\r
+   ; Advance by 4X dwords\r
+   add   esi, dword  1024\r
+\r
+CheckAddress:\r
+   ; Is valid Microcode start point ?\r
+   cmp   dword [esi + MicrocodeHdr.MicrocodeHdrVersion], 0ffffffffh\r
+   jz    Done\r
+\r
+   ; Is automatic size detection ?\r
+   mov   eax, dword [esp + LoadMicrocodeParams.MicrocodeCodeSize]\r
+   cmp   eax, 0ffffffffh\r
+   jz    LoadMicrocodeDefault4\r
+\r
+   ; Address >= microcode region address + microcode region size?\r
+   add   eax, dword [esp + LoadMicrocodeParams.MicrocodeCodeAddr]\r
+   cmp   esi, eax\r
+   jae   Done        ;Jif address is outside of microcode region\r
+   jmp   CheckMainHeader\r
+\r
+LoadMicrocodeDefault4:\r
+LoadCheck:\r
+   ; Get the revision of the current microcode update loaded\r
+   mov   ecx, MSR_IA32_BIOS_SIGN_ID\r
+   xor   eax, eax               ; Clear EAX\r
+   xor   edx, edx               ; Clear EDX\r
+   wrmsr                        ; Load 0 to MSR at 8Bh\r
+\r
+   mov   eax, 1\r
+   cpuid\r
+   mov   ecx, MSR_IA32_BIOS_SIGN_ID\r
+   rdmsr                         ; Get current microcode signature\r
+\r
+   ; Verify this microcode update is not already loaded\r
+   cmp   dword [esi + MicrocodeHdr.MicrocodeHdrRevision], edx\r
+   je    Continue\r
+\r
+LoadMicrocode:\r
+   ; EAX contains the linear address of the start of the Update Data\r
+   ; EDX contains zero\r
+   ; ECX contains 79h (IA32_BIOS_UPDT_TRIG)\r
+   ; Start microcode load with wrmsr\r
+   mov   eax, esi\r
+   add   eax, MicrocodeHdr.size\r
+   xor   edx, edx\r
+   mov   ecx, MSR_IA32_BIOS_UPDT_TRIG\r
+   wrmsr\r
+   mov   eax, 1\r
+   cpuid\r
+\r
+Continue:\r
+   jmp   NextMicrocode\r
+\r
+Done:\r
+   mov   eax, 1\r
+   cpuid\r
+   mov   ecx, MSR_IA32_BIOS_SIGN_ID\r
+   rdmsr                         ; Get current microcode signature\r
+   xor   eax, eax\r
+   cmp   edx, 0\r
+   jnz   Exit2\r
+   mov   eax, 08000000Eh\r
+\r
+Exit2:\r
+   jmp   ebp\r
+\r
+\r
+global ASM_PFX(EstablishStackFsp)\r
+ASM_PFX(EstablishStackFsp):\r
+  ;\r
+  ; Save parameter pointer in edx\r
+  ;\r
+  mov       edx, dword [esp + 4]\r
+\r
+  ;\r
+  ; Enable FSP STACK\r
+  ;\r
+  mov       esp, DWORD [ASM_PFX(PcdGet32 (PcdTemporaryRamBase))]\r
+  add       esp, DWORD [ASM_PFX(PcdGet32 (PcdTemporaryRamSize))]\r
+\r
+  push      DATA_LEN_OF_MCUD     ; Size of the data region\r
+  push      4455434Dh            ; Signature of the  data region 'MCUD'\r
+  push      dword [edx + 2Ch]    ; Code size       sizeof(FSPT_UPD_COMMON) + 12\r
+  push      dword [edx + 28h]    ; Code base       sizeof(FSPT_UPD_COMMON) + 8\r
+  push      dword [edx + 24h]    ; Microcode size  sizeof(FSPT_UPD_COMMON) + 4\r
+  push      dword [edx + 20h]    ; Microcode base  sizeof(FSPT_UPD_COMMON) + 0\r
+\r
+  ;\r
+  ; Save API entry/exit timestamp into stack\r
+  ;\r
+  push      DATA_LEN_OF_PER0     ; Size of the data region\r
+  push      30524550h            ; Signature of the  data region 'PER0'\r
+  rdtsc\r
+  push      edx\r
+  push      eax\r
+  LOAD_EDX\r
+  push      edx\r
+  LOAD_EAX\r
+  push      eax\r
+\r
+  ;\r
+  ; Terminator for the data on stack\r
+  ;\r
+  push      0\r
+\r
+  ;\r
+  ; Set ECX/EDX to the BootLoader temporary memory range\r
+  ;\r
+  mov       ecx,  [ASM_PFX(PcdGet32 (PcdTemporaryRamBase))]\r
+  mov       edx, ecx\r
+  add       edx,  [ASM_PFX(PcdGet32 (PcdTemporaryRamSize))]\r
+  sub       edx,  [ASM_PFX(PcdGet32 (PcdFspReservedBufferSize))]\r
+\r
+  cmp       ecx, edx        ;If PcdFspReservedBufferSize >= PcdTemporaryRamSize, then error.\r
+  jb        EstablishStackFspSuccess\r
+  mov       eax, 80000003h  ;EFI_UNSUPPORTED\r
+  jmp       EstablishStackFspExit\r
+EstablishStackFspSuccess:\r
+  xor       eax, eax\r
+\r
+EstablishStackFspExit:\r
+  RET_ESI\r
+\r
+;----------------------------------------------------------------------------\r
+; TempRamInit API\r
+;\r
+; This FSP API will load the microcode update, enable code caching for the\r
+; region specified by the boot loader and also setup a temporary stack to be\r
+; used till main memory is initialized.\r
+;\r
+;----------------------------------------------------------------------------\r
+global ASM_PFX(TempRamInitApi)\r
+ASM_PFX(TempRamInitApi):\r
+  ;\r
+  ; Ensure SSE is enabled\r
+  ;\r
+  ENABLE_SSE\r
+\r
+  ;\r
+  ; Save EBP, EBX, ESI, EDI & ESP in XMM7 & XMM6\r
+  ;\r
+  SAVE_REGS\r
+\r
+  ;\r
+  ; Save timestamp into XMM6\r
+  ;\r
+  rdtsc\r
+  SAVE_EAX\r
+  SAVE_EDX\r
+\r
+  ;\r
+  ; Check Parameter\r
+  ;\r
+  mov       eax, dword [esp + 4]\r
+  cmp       eax, 0\r
+  mov       eax, 80000002h\r
+  jz        TempRamInitExit\r
+\r
+  ;\r
+  ; Sec Platform Init\r
+  ;\r
+  CALL_MMX  ASM_PFX(SecPlatformInit)\r
+  cmp       eax, 0\r
+  jnz       TempRamInitExit\r
+\r
+  ; Load microcode\r
+  LOAD_ESP\r
+  CALL_MMX  ASM_PFX(LoadMicrocodeDefault)\r
+  SXMMN     xmm6, 3, eax            ;Save microcode return status in ECX-SLOT 3 in xmm6.\r
+  ;@note If return value eax is not 0, microcode did not load, but continue and attempt to boot.\r
+\r
+  ; Call Sec CAR Init\r
+  LOAD_ESP\r
+  CALL_MMX  ASM_PFX(SecCarInit)\r
+  cmp       eax, 0\r
+  jnz       TempRamInitExit\r
+\r
+  LOAD_ESP\r
+  CALL_MMX  ASM_PFX(EstablishStackFsp)\r
+  cmp       eax, 0\r
+  jnz       TempRamInitExit\r
+\r
+  LXMMN      xmm6, eax, 3  ;Restore microcode status if no CAR init error from ECX-SLOT 3 in xmm6.\r
+\r
+TempRamInitExit:\r
+   mov      bl, al                  ; save al data in bl\r
+   mov      al, 07Fh                ; API exit postcode 7f\r
+   out      080h, al\r
+   mov      al, bl                  ; restore al data from bl\r
+\r
+  ;\r
+  ; Load EBP, EBX, ESI, EDI & ESP from XMM7 & XMM6\r
+  ;\r
+  LOAD_REGS\r
+  ret\r
+\r
+;----------------------------------------------------------------------------\r
+; Module Entrypoint API\r
+;----------------------------------------------------------------------------\r
+global ASM_PFX(_ModuleEntryPoint)\r
+ASM_PFX(_ModuleEntryPoint):\r
+  jmp $\r
diff --git a/IntelFsp2Pkg/FspSecCore/Ia32/FspHelper.nasm b/IntelFsp2Pkg/FspSecCore/Ia32/FspHelper.nasm
new file mode 100644 (file)
index 0000000..00e953b
--- /dev/null
@@ -0,0 +1,35 @@
+;; @file\r
+;  Provide FSP helper function.\r
+;\r
+; Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>\r
+; This program and the accompanying materials\r
+; are licensed and made available under the terms and conditions of the BSD License\r
+; which accompanies this distribution.  The full text of the license may be found at\r
+; http://opensource.org/licenses/bsd-license.php.\r
+;\r
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+;;\r
+\r
+    SECTION .text\r
+\r
+global ASM_PFX(FspInfoHeaderRelativeOff)\r
+ASM_PFX(FspInfoHeaderRelativeOff):\r
+   ;\r
+   ; This value will be pached by the build script\r
+   ;\r
+   DD    0x12345678\r
+\r
+global ASM_PFX(AsmGetFspBaseAddress)\r
+ASM_PFX(AsmGetFspBaseAddress):\r
+   mov   eax, ASM_PFX(AsmGetFspInfoHeader)\r
+   sub   eax, dword [ASM_PFX(FspInfoHeaderRelativeOff)]\r
+   add   eax, 0x1C\r
+   mov   eax, dword [eax]\r
+   ret\r
+\r
+global ASM_PFX(AsmGetFspInfoHeader)\r
+ASM_PFX(AsmGetFspInfoHeader):\r
+   mov   eax, ASM_PFX(AsmGetFspInfoHeader)\r
+   sub   eax, dword [ASM_PFX(FspInfoHeaderRelativeOff)]\r
+   ret\r
diff --git a/IntelFsp2Pkg/FspSecCore/Ia32/InitializeFpu.nasm b/IntelFsp2Pkg/FspSecCore/Ia32/InitializeFpu.nasm
new file mode 100644 (file)
index 0000000..cc87e89
--- /dev/null
@@ -0,0 +1,78 @@
+;------------------------------------------------------------------------------\r
+;\r
+; Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
+; This program and the accompanying materials\r
+; are licensed and made available under the terms and conditions of the BSD License\r
+; which accompanies this distribution.  The full text of the license may be found at\r
+; http://opensource.org/licenses/bsd-license.php.\r
+;\r
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+;\r
+; Abstract:\r
+;\r
+;------------------------------------------------------------------------------\r
+\r
+\r
+SECTION .data\r
+;\r
+; Float control word initial value:\r
+; all exceptions masked, double-precision, round-to-nearest\r
+;\r
+ASM_PFX(mFpuControlWord):\r
+    dw    0x027F\r
+;\r
+; Multimedia-extensions control word:\r
+; all exceptions masked, round-to-nearest, flush to zero for masked underflow\r
+;\r
+ASM_PFX(mMmxControlWord):\r
+     dd     0x01F80\r
+\r
+SECTION .text\r
+\r
+;\r
+; Initializes floating point units for requirement of UEFI specification.\r
+;\r
+; This function initializes floating-point control word to 0x027F (all exceptions\r
+; masked,double-precision, round-to-nearest) and multimedia-extensions control word\r
+; (if supported) to 0x1F80 (all exceptions masked, round-to-nearest, flush to zero\r
+; for masked underflow).\r
+;\r
+\r
+global ASM_PFX(InitializeFloatingPointUnits)\r
+ASM_PFX(InitializeFloatingPointUnits):\r
+\r
+\r
+    push    ebx\r
+\r
+    ;\r
+    ; Initialize floating point units\r
+    ;\r
+    finit\r
+    fldcw    [ASM_PFX(mFpuControlWord)]\r
+\r
+    ;\r
+    ; Use CpuId instructuion (CPUID.01H:EDX.SSE[bit 25] = 1) to test\r
+    ; whether the processor supports SSE instruction.\r
+    ;\r
+    mov     eax, 1\r
+    cpuid\r
+    bt      edx, 25\r
+    jnc     Done\r
+\r
+    ;\r
+    ; Set OSFXSR bit 9 in CR4\r
+    ;\r
+    mov     eax, cr4\r
+    or      eax, BIT9\r
+    mov     cr4, eax\r
+\r
+    ;\r
+    ; The processor should support SSE instruction and we can use\r
+    ; ldmxcsr instruction\r
+    ;\r
+    ldmxcsr [ASM_PFX(mMmxControlWord)]\r
+Done:\r
+    pop     ebx\r
+\r
+    ret\r
diff --git a/IntelFsp2Pkg/FspSecCore/Ia32/MicrocodeLoadNasm.inc b/IntelFsp2Pkg/FspSecCore/Ia32/MicrocodeLoadNasm.inc
new file mode 100644 (file)
index 0000000..1663a85
--- /dev/null
@@ -0,0 +1,16 @@
+;; @file\r
+;\r
+;@copyright\r
+; Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>\r
+; This program and the accompanying materials\r
+; are licensed and made available under the terms and conditions of the BSD License\r
+; which accompanies this distribution.  The full text of the license may be found at\r
+; http://opensource.org/licenses/bsd-license.php.\r
+;\r
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+;;\r
+\r
+MSR_IA32_PLATFORM_ID        equ     000000017h\r
+MSR_IA32_BIOS_UPDT_TRIG     equ     000000079h\r
+MSR_IA32_BIOS_SIGN_ID       equ     00000008bh
\ No newline at end of file
diff --git a/IntelFsp2Pkg/FspSecCore/Ia32/SaveRestoreSseNasm.inc b/IntelFsp2Pkg/FspSecCore/Ia32/SaveRestoreSseNasm.inc
new file mode 100644 (file)
index 0000000..ae0a93d
--- /dev/null
@@ -0,0 +1,187 @@
+;------------------------------------------------------------------------------\r
+;\r
+; Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
+; This program and the accompanying materials\r
+; are licensed and made available under the terms and conditions of the BSD License\r
+; which accompanies this distribution.  The full text of the license may be found at\r
+; http://opensource.org/licenses/bsd-license.php.\r
+;\r
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+;\r
+; Abstract:\r
+;\r
+;   Provide macro for register save/restore using SSE registers\r
+;\r
+;------------------------------------------------------------------------------\r
+\r
+;\r
+; Define SSE instruction set\r
+;\r
+%ifdef USE_SSE41_FLAG\r
+;\r
+; Define SSE macros using SSE 4.1 instructions\r
+; args 1:XMM, 2:IDX, 3:REG\r
+%macro SXMMN           3\r
+             pinsrd  %1, %3, (%2 & 3)\r
+             %endmacro\r
+\r
+;\r
+;args 1:XMM, 2:REG, 3:IDX\r
+;\r
+%macro LXMMN           3\r
+             pextrd  %2, %1, (%3 & 3)\r
+             %endmacro\r
+%else\r
+;\r
+; Define SSE macros using SSE 2 instructions\r
+; args 1:XMM, 2:IDX, 3:REG\r
+%macro SXMMN       3\r
+             pinsrw  %1, %3, (%2 & 3) * 2\r
+             ror     %3, 16\r
+             pinsrw  %1, %3, (%2 & 3) * 2 + 1\r
+             rol     %3, 16\r
+             %endmacro\r
+\r
+;\r
+;args 1:XMM, 2:REG,  3:IDX\r
+;\r
+%macro LXMMN    3\r
+             pshufd  %1, %1,  ((0E4E4E4h >> (%3 * 2))  & 0FFh)\r
+             movd    %2, %1\r
+             pshufd  %1, %1,  ((0E4E4E4h >> (%3 * 2 + (%3 & 1) * 4)) & 0FFh)\r
+             %endmacro\r
+%endif\r
+\r
+;\r
+; XMM7 to save/restore EBP, EBX, ESI, EDI\r
+;\r
+%macro SAVE_REGS   0\r
+  SXMMN      xmm7, 0, ebp\r
+  SXMMN      xmm7, 1, ebx\r
+  SXMMN      xmm7, 2, esi\r
+  SXMMN      xmm7, 3, edi\r
+  SAVE_ESP\r
+             %endmacro\r
+\r
+%macro LOAD_REGS    0\r
+  LXMMN      xmm7, ebp, 0\r
+  LXMMN      xmm7, ebx, 1\r
+  LXMMN      xmm7, esi, 2\r
+  LXMMN      xmm7, edi, 3\r
+  LOAD_ESP\r
+             %endmacro\r
+\r
+;\r
+; XMM6 to save/restore EAX, EDX, ECX, ESP\r
+;\r
+%macro LOAD_EAX     0\r
+  LXMMN      xmm6, eax, 1\r
+             %endmacro\r
+\r
+%macro SAVE_EAX     0\r
+  SXMMN      xmm6, 1, eax\r
+             %endmacro\r
+\r
+%macro LOAD_EDX     0\r
+  LXMMN      xmm6, edx, 2\r
+             %endmacro\r
+\r
+%macro SAVE_EDX     0\r
+  SXMMN      xmm6, 2, edx\r
+             %endmacro\r
+\r
+%macro SAVE_ECX     0\r
+  SXMMN      xmm6, 3, ecx\r
+             %endmacro\r
+\r
+%macro LOAD_ECX     0\r
+  LXMMN      xmm6, ecx, 3\r
+             %endmacro\r
+\r
+%macro SAVE_ESP     0\r
+  SXMMN      xmm6, 0, esp\r
+             %endmacro\r
+\r
+%macro LOAD_ESP     0\r
+  movd       esp,  xmm6\r
+             %endmacro\r
+;\r
+; XMM5 for calling stack\r
+; arg 1:Entry\r
+%macro CALL_XMM       1\r
+             mov     esi, %%ReturnAddress\r
+             pslldq  xmm5, 4\r
+%ifdef USE_SSE41_FLAG\r
+             pinsrd  xmm5, esi, 0\r
+%else\r
+             pinsrw  xmm5, esi, 0\r
+             ror     esi,  16\r
+             pinsrw  xmm5, esi, 1\r
+%endif\r
+             mov     esi,  %1\r
+             jmp     esi\r
+%%ReturnAddress:\r
+             %endmacro\r
+\r
+%macro RET_XMM       0\r
+             movd    esi, xmm5\r
+             psrldq  xmm5, 4\r
+             jmp     esi\r
+             %endmacro\r
+\r
+%macro ENABLE_SSE   0\r
+            ;\r
+            ; Initialize floating point units\r
+            ;\r
+            jmp     NextAddress\r
+align 4\r
+            ;\r
+            ; Float control word initial value:\r
+            ; all exceptions masked, double-precision, round-to-nearest\r
+            ;\r
+FpuControlWord       DW      027Fh\r
+            ;\r
+            ; Multimedia-extensions control word:\r
+            ; all exceptions masked, round-to-nearest, flush to zero for masked underflow\r
+            ;\r
+MmxControlWord       DD      01F80h\r
+SseError:\r
+            ;\r
+            ; Processor has to support SSE\r
+            ;\r
+            jmp     SseError\r
+NextAddress:\r
+            finit\r
+            fldcw   [FpuControlWord]\r
+\r
+            ;\r
+            ; Use CpuId instructuion (CPUID.01H:EDX.SSE[bit 25] = 1) to test\r
+            ; whether the processor supports SSE instruction.\r
+            ;\r
+            mov     eax, 1\r
+            cpuid\r
+            bt      edx, 25\r
+            jnc     SseError\r
+\r
+%ifdef USE_SSE41_FLAG\r
+            ;\r
+            ; SSE 4.1 support\r
+            ;\r
+            bt      ecx, 19\r
+            jnc     SseError\r
+%endif\r
+\r
+            ;\r
+            ; Set OSFXSR bit (bit #9) & OSXMMEXCPT bit (bit #10)\r
+            ;\r
+            mov     eax, cr4\r
+            or      eax, 00000600h\r
+            mov     cr4, eax\r
+\r
+            ;\r
+            ; The processor should support SSE instruction and we can use\r
+            ; ldmxcsr instruction\r
+            ;\r
+            ldmxcsr [MmxControlWord]\r
+            %endmacro\r
diff --git a/IntelFsp2Pkg/FspSecCore/Ia32/Stack.nasm b/IntelFsp2Pkg/FspSecCore/Ia32/Stack.nasm
new file mode 100644 (file)
index 0000000..338e700
--- /dev/null
@@ -0,0 +1,78 @@
+;------------------------------------------------------------------------------\r
+;\r
+; Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
+; This program and the accompanying materials\r
+; are licensed and made available under the terms and conditions of the BSD License\r
+; which accompanies this distribution.  The full text of the license may be found at\r
+; http://opensource.org/licenses/bsd-license.php.\r
+;\r
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+;\r
+; Abstract:\r
+;\r
+;   Switch the stack from temporary memory to permanent memory.\r
+;\r
+;------------------------------------------------------------------------------\r
+\r
+SECTION .text\r
+\r
+;------------------------------------------------------------------------------\r
+; VOID\r
+; EFIAPI\r
+; SecSwitchStack (\r
+;   UINT32   TemporaryMemoryBase,\r
+;   UINT32   PermenentMemoryBase\r
+;   );\r
+;------------------------------------------------------------------------------\r
+global ASM_PFX(SecSwitchStack)\r
+ASM_PFX(SecSwitchStack):\r
+    ;\r
+    ; Save three register: eax, ebx, ecx\r
+    ;\r
+    push  eax\r
+    push  ebx\r
+    push  ecx\r
+    push  edx\r
+\r
+    ;\r
+    ; !!CAUTION!! this function address's is pushed into stack after\r
+    ; migration of whole temporary memory, so need save it to permanent\r
+    ; memory at first!\r
+    ;\r
+\r
+    mov   ebx, [esp + 20]          ; Save the first parameter\r
+    mov   ecx, [esp + 24]          ; Save the second parameter\r
+\r
+    ;\r
+    ; Save this function's return address into permanent memory at first.\r
+    ; Then, Fixup the esp point to permanent memory\r
+    ;\r
+    mov   eax, esp\r
+    sub   eax, ebx\r
+    add   eax, ecx\r
+    mov   edx, dword [esp]         ; copy pushed register's value to permanent memory\r
+    mov   dword [eax], edx\r
+    mov   edx, dword [esp + 4]\r
+    mov   dword [eax + 4], edx\r
+    mov   edx, dword [esp + 8]\r
+    mov   dword [eax + 8], edx\r
+    mov   edx, dword [esp + 12]\r
+    mov   dword [eax + 12], edx\r
+    mov   edx, dword [esp + 16]    ; Update this function's return address into permanent memory\r
+    mov   dword [eax + 16], edx\r
+    mov   esp, eax                     ; From now, esp is pointed to permanent memory\r
+\r
+    ;\r
+    ; Fixup the ebp point to permenent memory\r
+    ;\r
+    mov   eax, ebp\r
+    sub   eax, ebx\r
+    add   eax, ecx\r
+    mov   ebp, eax                ; From now, ebp is pointed to permanent memory\r
+\r
+    pop   edx\r
+    pop   ecx\r
+    pop   ebx\r
+    pop   eax\r
+    ret\r
diff --git a/IntelFsp2Pkg/FspSecCore/SecFsp.c b/IntelFsp2Pkg/FspSecCore/SecFsp.c
new file mode 100644 (file)
index 0000000..7259a55
--- /dev/null
@@ -0,0 +1,216 @@
+/** @file\r
+\r
+  Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "SecFsp.h"\r
+\r
+/**\r
+\r
+  Calculate the FSP IDT gate descriptor.\r
+\r
+  @param[in] IdtEntryTemplate     IDT gate descriptor template.\r
+\r
+  @return                     FSP specific IDT gate descriptor.\r
+\r
+**/\r
+UINT64\r
+FspGetExceptionHandler(\r
+  IN  UINT64  IdtEntryTemplate\r
+  )\r
+{\r
+  UINT32                    Entry;\r
+  UINT64                    ExceptionHandler;\r
+  IA32_IDT_GATE_DESCRIPTOR *IdtGateDescriptor;\r
+  FSP_INFO_HEADER          *FspInfoHeader;\r
+\r
+  FspInfoHeader     = (FSP_INFO_HEADER *)AsmGetFspInfoHeader();\r
+  ExceptionHandler  = IdtEntryTemplate;\r
+  IdtGateDescriptor = (IA32_IDT_GATE_DESCRIPTOR *)&ExceptionHandler;\r
+  Entry = (IdtGateDescriptor->Bits.OffsetHigh << 16) | IdtGateDescriptor->Bits.OffsetLow;\r
+  Entry = FspInfoHeader->ImageBase + FspInfoHeader->ImageSize - (~Entry + 1);\r
+  IdtGateDescriptor->Bits.OffsetHigh = (UINT16)(Entry >> 16);\r
+  IdtGateDescriptor->Bits.OffsetLow  = (UINT16)Entry;\r
+\r
+  return ExceptionHandler;\r
+}\r
+\r
+/**\r
+  This interface fills platform specific data.\r
+\r
+  @param[in,out]  FspData           Pointer to the FSP global data.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+SecGetPlatformData (\r
+  IN OUT  FSP_GLOBAL_DATA    *FspData\r
+  )\r
+{\r
+  FSP_PLAT_DATA    *FspPlatformData;\r
+  UINT32            TopOfCar;\r
+  UINT32           *StackPtr;\r
+  UINT32            DwordSize;\r
+\r
+  FspPlatformData = &FspData->PlatformData;\r
+\r
+  //\r
+  // The entries of platform information, together with the number of them,\r
+  // reside in the bottom of stack, left untouched by normal stack operation.\r
+  //\r
+\r
+  FspPlatformData->DataPtr   = NULL;\r
+  FspPlatformData->MicrocodeRegionBase = 0;\r
+  FspPlatformData->MicrocodeRegionSize = 0;\r
+  FspPlatformData->CodeRegionBase      = 0;\r
+  FspPlatformData->CodeRegionSize      = 0;\r
+\r
+  //\r
+  // Pointer to the size field\r
+  //\r
+  TopOfCar = FspPlatformData->CarBase + FspPlatformData->CarSize;\r
+  StackPtr = (UINT32 *)(TopOfCar - sizeof (UINT32));\r
+\r
+  if (*(StackPtr - 1) == FSP_MCUD_SIGNATURE) {\r
+    while (*StackPtr != 0) {\r
+      if (*(StackPtr - 1) == FSP_MCUD_SIGNATURE) {\r
+        //\r
+        // This following data was pushed onto stack after TempRamInit API\r
+        //\r
+        DwordSize = 4;\r
+        StackPtr  = StackPtr - 1 - DwordSize;\r
+        CopyMem (&(FspPlatformData->MicrocodeRegionBase), StackPtr, (DwordSize << 2));\r
+        StackPtr--;\r
+      } else if (*(StackPtr - 1) == FSP_PER0_SIGNATURE) {\r
+        //\r
+        // This is the performance data for InitTempMemory API entry/exit\r
+        //\r
+        DwordSize = 4;\r
+        StackPtr  = StackPtr - 1 - DwordSize;\r
+        CopyMem (FspData->PerfData, StackPtr, (DwordSize << 2));\r
+\r
+        ((UINT8 *)(&FspData->PerfData[0]))[7] = FSP_PERF_ID_API_TEMP_RAM_INIT_ENTRY;\r
+        ((UINT8 *)(&FspData->PerfData[1]))[7] = FSP_PERF_ID_API_TEMP_RAM_INIT_EXIT;\r
+\r
+        StackPtr--;\r
+      } else {\r
+        StackPtr -= (*StackPtr);\r
+      }\r
+    }\r
+  }\r
+}\r
+\r
+/**\r
+\r
+  Initialize the FSP global data region.\r
+  It needs to be done as soon as possible after the stack is setup.\r
+\r
+  @param[in,out] PeiFspData             Pointer of the FSP global data.\r
+  @param[in]     BootLoaderStack        BootLoader stack.\r
+  @param[in]     ApiIdx                 The index of the FSP API.\r
+\r
+**/\r
+VOID\r
+FspGlobalDataInit (\r
+  IN OUT  FSP_GLOBAL_DATA    *PeiFspData,\r
+  IN UINT32                   BootLoaderStack,\r
+  IN UINT8                    ApiIdx\r
+  )\r
+{\r
+  VOID              *FspmUpdDataPtr;\r
+  CHAR8              ImageId[9];\r
+  UINTN              Idx;\r
+\r
+  //\r
+  // Set FSP Global Data pointer\r
+  //\r
+  SetFspGlobalDataPointer    (PeiFspData);\r
+  ZeroMem  ((VOID *)PeiFspData, sizeof(FSP_GLOBAL_DATA));\r
+\r
+  PeiFspData->Signature            = FSP_GLOBAL_DATA_SIGNATURE;\r
+  PeiFspData->Version              = 0;\r
+  PeiFspData->CoreStack            = BootLoaderStack;\r
+  PeiFspData->PerfIdx              = 2;\r
+  PeiFspData->PerfSig              = FSP_PERFORMANCE_DATA_SIGNATURE;\r
+  PeiFspData->PlatformData.CarBase = AsmReadMsr32 (0x200) & ~(0x6);\r
+  PeiFspData->PlatformData.CarSize = ~(AsmReadMsr32(0x201) & ~(0x800)) + 1;\r
+\r
+  SetFspMeasurePoint (FSP_PERF_ID_API_FSP_MEMORY_INIT_ENTRY);\r
+\r
+  //\r
+  // Get FSP Header offset\r
+  // It may have multiple FVs, so look into the last one for FSP header\r
+  //\r
+  PeiFspData->FspInfoHeader      = (FSP_INFO_HEADER *)AsmGetFspInfoHeader();\r
+  SecGetPlatformData (PeiFspData);\r
+\r
+  //\r
+  // Set API calling mode\r
+  //\r
+  SetFspApiCallingIndex (ApiIdx);\r
+  \r
+  //\r
+  // Set UPD pointer\r
+  //\r
+  FspmUpdDataPtr = (VOID *) GetFspApiParameter ();\r
+  if (FspmUpdDataPtr == NULL) {\r
+    FspmUpdDataPtr = (VOID *)(PeiFspData->FspInfoHeader->ImageBase + PeiFspData->FspInfoHeader->CfgRegionOffset);\r
+  }\r
+  SetFspUpdDataPointer (FspmUpdDataPtr);\r
+  SetFspMemoryInitUpdDataPointer (FspmUpdDataPtr);\r
+  SetFspSiliconInitUpdDataPointer (NULL);\r
+\r
+  //\r
+  // Initialize serial port\r
+  // It might have been done in ProcessLibraryConstructorList(), however,\r
+  // the FSP global data is not initialized at that time. So do it again\r
+  // for safe.\r
+  //\r
+  SerialPortInitialize ();\r
+\r
+  //\r
+  // Ensure the golbal data pointer is valid\r
+  //\r
+  ASSERT (GetFspGlobalDataPointer () == PeiFspData);\r
+\r
+  for (Idx = 0; Idx < 8; Idx++) {\r
+    ImageId[Idx] = PeiFspData->FspInfoHeader->ImageId[Idx];\r
+  }\r
+  ImageId[Idx] = 0;\r
+\r
+  DEBUG ((DEBUG_INFO | DEBUG_INIT, "\n============= FSP Spec v%d.%d Header Revision v%x (%a v%x.%x.%x.%x) =============\n", \\r
+         (PeiFspData->FspInfoHeader->SpecVersion >> 4) & 0xF, \\r
+         PeiFspData->FspInfoHeader->SpecVersion & 0xF, \\r
+         PeiFspData->FspInfoHeader->HeaderRevision, \\r
+         ImageId, \\r
+         (PeiFspData->FspInfoHeader->ImageRevision >> 24) & 0xFF, \\r
+         (PeiFspData->FspInfoHeader->ImageRevision >> 16) & 0xFF, \\r
+         (PeiFspData->FspInfoHeader->ImageRevision >> 8) & 0xFF, \\r
+         PeiFspData->FspInfoHeader->ImageRevision & 0xFF));\r
+}\r
+\r
+/**\r
+\r
+  Adjust the FSP data pointers after the stack is migrated to memory.\r
+\r
+  @param[in] OffsetGap             The offset gap between the old stack and the new stack.\r
+\r
+**/\r
+VOID\r
+FspDataPointerFixUp (\r
+  IN UINT32   OffsetGap\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA  *NewFspData;\r
+\r
+  NewFspData = (FSP_GLOBAL_DATA *)((UINTN)GetFspGlobalDataPointer() + (UINTN)OffsetGap);\r
+  SetFspGlobalDataPointer (NewFspData);\r
+}\r
diff --git a/IntelFsp2Pkg/FspSecCore/SecFsp.h b/IntelFsp2Pkg/FspSecCore/SecFsp.h
new file mode 100644 (file)
index 0000000..f199b12
--- /dev/null
@@ -0,0 +1,99 @@
+/** @file\r
+\r
+  Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _SEC_FSP_H_\r
+#define _SEC_FSP_H_\r
+\r
+#include <PiPei.h>\r
+#include <FspEas.h>\r
+#include <Library/PcdLib.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/SerialPortLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/FspCommonLib.h>\r
+#include <Library/FspSecPlatformLib.h>\r
+\r
+#define FSP_MCUD_SIGNATURE  SIGNATURE_32 ('M', 'C', 'U', 'D')\r
+#define FSP_PER0_SIGNATURE  SIGNATURE_32 ('P', 'E', 'R', '0')\r
+\r
+/**\r
+\r
+  Calculate the FSP IDT gate descriptor.\r
+\r
+  @param[in] IdtEntryTemplate     IDT gate descriptor template.\r
+\r
+  @return                     FSP specific IDT gate descriptor.\r
+\r
+**/\r
+UINT64\r
+FspGetExceptionHandler(\r
+  IN  UINT64  IdtEntryTemplate\r
+  );\r
+\r
+/**\r
+\r
+  Initialize the FSP global data region.\r
+  It needs to be done as soon as possible after the stack is setup.\r
+\r
+  @param[in,out] PeiFspData             Pointer of the FSP global data.\r
+  @param[in]     BootLoaderStack        BootLoader stack.\r
+  @param[in]     ApiIdx                 The index of the FSP API.\r
+\r
+**/\r
+VOID\r
+FspGlobalDataInit (\r
+  IN OUT  FSP_GLOBAL_DATA    *PeiFspData,\r
+  IN UINT32                   BootLoaderStack,\r
+  IN UINT8                    ApiIdx\r
+  );\r
+\r
+\r
+/**\r
+\r
+  Adjust the FSP data pointers after the stack is migrated to memory.\r
+\r
+  @param[in] OffsetGap             The offset gap between the old stack and the new stack.\r
+\r
+**/\r
+VOID\r
+FspDataPointerFixUp (\r
+  IN UINT32   OffsetGap\r
+  );\r
+\r
+\r
+/**\r
+  This interface returns the base address of FSP binary.\r
+\r
+  @return   FSP binary base address.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+AsmGetFspBaseAddress (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This interface gets FspInfoHeader pointer\r
+\r
+  @return   FSP binary base address.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+AsmGetFspInfoHeader (\r
+  VOID\r
+  );\r
+\r
+#endif\r
diff --git a/IntelFsp2Pkg/FspSecCore/SecFspApiChk.c b/IntelFsp2Pkg/FspSecCore/SecFspApiChk.c
new file mode 100644 (file)
index 0000000..bace5ec
--- /dev/null
@@ -0,0 +1,97 @@
+/** @file\r
+\r
+  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "SecFsp.h"\r
+\r
+\r
+/**\r
+  This function check the FSP API calling condition.\r
+\r
+  @param[in]  ApiIdx           Internal index of the FSP API.\r
+  @param[in]  ApiParam         Parameter of the FSP API.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+FspApiCallingCheck (\r
+  IN UINT8     ApiIdx,\r
+  IN VOID     *ApiParam\r
+  )\r
+{\r
+  EFI_STATUS                Status;\r
+  FSP_GLOBAL_DATA           *FspData;\r
+\r
+  Status = EFI_SUCCESS;\r
+  FspData = GetFspGlobalDataPointer ();\r
+  \r
+  if (ApiIdx == NotifyPhaseApiIndex) {\r
+    //\r
+    // NotifyPhase check\r
+    //\r
+    if ((FspData == NULL) || ((UINT32)FspData == 0xFFFFFFFF)) {\r
+      Status = EFI_UNSUPPORTED;\r
+    } else {\r
+      if (FspData->Signature != FSP_GLOBAL_DATA_SIGNATURE) {\r
+        Status = EFI_UNSUPPORTED;\r
+      }\r
+    }\r
+  } else if (ApiIdx == FspMemoryInitApiIndex) {\r
+    //\r
+    // FspMemoryInit check\r
+    //\r
+    if ((UINT32)FspData != 0xFFFFFFFF) {\r
+      Status = EFI_UNSUPPORTED;\r
+    } else if (EFI_ERROR (FspUpdSignatureCheck (ApiIdx, ApiParam))) {\r
+      Status = EFI_INVALID_PARAMETER;\r
+    }\r
+  } else if (ApiIdx == TempRamExitApiIndex) {\r
+    //\r
+    // TempRamExit check\r
+    //\r
+    if ((FspData == NULL) || ((UINT32)FspData == 0xFFFFFFFF)) {\r
+      Status = EFI_UNSUPPORTED;\r
+    } else {\r
+      if (FspData->Signature != FSP_GLOBAL_DATA_SIGNATURE) {\r
+        Status = EFI_UNSUPPORTED;\r
+      }\r
+    }\r
+  } else if (ApiIdx == FspSiliconInitApiIndex) {\r
+    //\r
+    // FspSiliconInit check\r
+    //\r
+    if ((FspData == NULL) || ((UINT32)FspData == 0xFFFFFFFF)) {\r
+      Status = EFI_UNSUPPORTED;\r
+    } else {\r
+      if (FspData->Signature != FSP_GLOBAL_DATA_SIGNATURE) {\r
+        Status = EFI_UNSUPPORTED;\r
+      } else if (EFI_ERROR (FspUpdSignatureCheck (ApiIdx, ApiParam))) {\r
+        Status = EFI_INVALID_PARAMETER;\r
+      }\r
+    }\r
+  } else {\r
+    Status = EFI_UNSUPPORTED;\r
+  }\r
+\r
+  if (!EFI_ERROR (Status)) {\r
+    if ((ApiIdx != FspMemoryInitApiIndex)) {\r
+      //\r
+      // For FspMemoryInit, the global data is not valid yet\r
+      // The API index will be updated by SecCore after the global data\r
+      // is initialized\r
+      //\r
+      SetFspApiCallingIndex (ApiIdx);\r
+    }\r
+  }\r
+  \r
+  return Status;\r
+}\r
diff --git a/IntelFsp2Pkg/FspSecCore/SecMain.c b/IntelFsp2Pkg/FspSecCore/SecMain.c
new file mode 100644 (file)
index 0000000..fa556bf
--- /dev/null
@@ -0,0 +1,227 @@
+/** @file\r
+\r
+  Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "SecMain.h"\r
+#include "SecFsp.h"\r
+\r
+EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI gSecTemporaryRamSupportPpi = {\r
+  SecTemporaryRamSupport\r
+};\r
+\r
+EFI_PEI_PPI_DESCRIPTOR            mPeiSecPlatformInformationPpi[] = {\r
+  {\r
+    (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
+    &gEfiTemporaryRamSupportPpiGuid,\r
+    &gSecTemporaryRamSupportPpi\r
+  }\r
+};\r
+\r
+//\r
+// These are IDT entries pointing to 08:FFFFFFE4h.\r
+//\r
+UINT64  mIdtEntryTemplate = 0xffff8e000008ffe4ULL;\r
+\r
+/**\r
+\r
+  Entry point to the C language phase of SEC. After the SEC assembly\r
+  code has initialized some temporary memory and set up the stack,\r
+  the control is transferred to this function.\r
+\r
+\r
+  @param[in] SizeOfRam          Size of the temporary memory available for use.\r
+  @param[in] TempRamBase        Base address of tempory ram\r
+  @param[in] BootFirmwareVolume Base address of the Boot Firmware Volume.\r
+  @param[in] PeiCore            PeiCore entry point.\r
+  @param[in] BootLoaderStack    BootLoader stack.\r
+  @param[in] ApiIdx             the index of API.\r
+\r
+  @return This function never returns.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+SecStartup (\r
+  IN UINT32                   SizeOfRam,\r
+  IN UINT32                   TempRamBase,\r
+  IN VOID                    *BootFirmwareVolume,\r
+  IN PEI_CORE_ENTRY           PeiCore,\r
+  IN UINT32                   BootLoaderStack,\r
+  IN UINT32                   ApiIdx\r
+  )\r
+{\r
+  EFI_SEC_PEI_HAND_OFF        SecCoreData;\r
+  IA32_DESCRIPTOR             IdtDescriptor;\r
+  SEC_IDT_TABLE               IdtTableInStack;\r
+  UINT32                      Index;\r
+  FSP_GLOBAL_DATA             PeiFspData;\r
+  UINT64                      ExceptionHandler;\r
+\r
+  //\r
+  // Process all libraries constructor function linked to SecCore.\r
+  //\r
+  ProcessLibraryConstructorList ();\r
+\r
+  //\r
+  // Initialize floating point operating environment\r
+  // to be compliant with UEFI spec.\r
+  //\r
+  InitializeFloatingPointUnits ();\r
+\r
+\r
+  // |-------------------|---->\r
+  // |Idt Table          |\r
+  // |-------------------|\r
+  // |PeiService Pointer |    PeiStackSize\r
+  // |-------------------|\r
+  // |                   |\r
+  // |      Stack        |\r
+  // |-------------------|---->\r
+  // |                   |\r
+  // |                   |\r
+  // |      Heap         |    PeiTemporayRamSize\r
+  // |                   |\r
+  // |                   |\r
+  // |-------------------|---->  TempRamBase\r
+  IdtTableInStack.PeiService  = NULL;\r
+  ExceptionHandler = FspGetExceptionHandler(mIdtEntryTemplate);\r
+  for (Index = 0; Index < SEC_IDT_ENTRY_COUNT; Index ++) {\r
+    CopyMem ((VOID*)&IdtTableInStack.IdtTable[Index], (VOID*)&ExceptionHandler, sizeof (UINT64));\r
+  }\r
+\r
+  IdtDescriptor.Base  = (UINTN) &IdtTableInStack.IdtTable;\r
+  IdtDescriptor.Limit = (UINT16)(sizeof (IdtTableInStack.IdtTable) - 1);\r
+\r
+  AsmWriteIdtr (&IdtDescriptor);\r
+\r
+  //\r
+  // Initialize the global FSP data region\r
+  //\r
+  FspGlobalDataInit (&PeiFspData, BootLoaderStack, (UINT8)ApiIdx);\r
+\r
+  //\r
+  // Update the base address and length of Pei temporary memory\r
+  //\r
+  SecCoreData.DataSize               = sizeof (EFI_SEC_PEI_HAND_OFF);\r
+  SecCoreData.BootFirmwareVolumeBase = BootFirmwareVolume;\r
+  SecCoreData.BootFirmwareVolumeSize = (UINT32)((EFI_FIRMWARE_VOLUME_HEADER *)BootFirmwareVolume)->FvLength;\r
+\r
+  SecCoreData.TemporaryRamBase       = (VOID*)(UINTN) TempRamBase;\r
+  SecCoreData.TemporaryRamSize       = SizeOfRam;\r
+  SecCoreData.PeiTemporaryRamBase    = SecCoreData.TemporaryRamBase;\r
+  SecCoreData.PeiTemporaryRamSize    = SecCoreData.TemporaryRamSize * PcdGet8 (PcdFspHeapSizePercentage) / 100;\r
+  SecCoreData.StackBase              = (VOID*)(UINTN)((UINTN)SecCoreData.TemporaryRamBase + SecCoreData.PeiTemporaryRamSize);\r
+  SecCoreData.StackSize              = SecCoreData.TemporaryRamSize - SecCoreData.PeiTemporaryRamSize;\r
+\r
+  DEBUG ((DEBUG_INFO, "Fsp BootFirmwareVolumeBase - 0x%x\n", SecCoreData.BootFirmwareVolumeBase));\r
+  DEBUG ((DEBUG_INFO, "Fsp BootFirmwareVolumeSize - 0x%x\n", SecCoreData.BootFirmwareVolumeSize));\r
+  DEBUG ((DEBUG_INFO, "Fsp TemporaryRamBase       - 0x%x\n", SecCoreData.TemporaryRamBase));\r
+  DEBUG ((DEBUG_INFO, "Fsp TemporaryRamSize       - 0x%x\n", SecCoreData.TemporaryRamSize));\r
+  DEBUG ((DEBUG_INFO, "Fsp PeiTemporaryRamBase    - 0x%x\n", SecCoreData.PeiTemporaryRamBase));\r
+  DEBUG ((DEBUG_INFO, "Fsp PeiTemporaryRamSize    - 0x%x\n", SecCoreData.PeiTemporaryRamSize));\r
+  DEBUG ((DEBUG_INFO, "Fsp StackBase              - 0x%x\n", SecCoreData.StackBase));\r
+  DEBUG ((DEBUG_INFO, "Fsp StackSize              - 0x%x\n", SecCoreData.StackSize));\r
+\r
+  //\r
+  // Call PeiCore Entry\r
+  //  \r
+  PeiCore (&SecCoreData, mPeiSecPlatformInformationPpi);\r
+\r
+  //\r
+  // Should never be here\r
+  //\r
+  CpuDeadLoop ();\r
+}\r
+\r
+/**\r
+  This service of the TEMPORARY_RAM_SUPPORT_PPI that migrates temporary RAM into\r
+  permanent memory.\r
+\r
+  @param[in] PeiServices            Pointer to the PEI Services Table.\r
+  @param[in] TemporaryMemoryBase    Source Address in temporary memory from which the SEC or PEIM will copy the\r
+                                Temporary RAM contents.\r
+  @param[in] PermanentMemoryBase    Destination Address in permanent memory into which the SEC or PEIM will copy the\r
+                                Temporary RAM contents.\r
+  @param[in] CopySize               Amount of memory to migrate from temporary to permanent memory.\r
+\r
+  @retval EFI_SUCCESS           The data was successfully returned.\r
+  @retval EFI_INVALID_PARAMETER PermanentMemoryBase + CopySize > TemporaryMemoryBase when\r
+                                TemporaryMemoryBase > PermanentMemoryBase.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SecTemporaryRamSupport (\r
+  IN CONST EFI_PEI_SERVICES   **PeiServices,\r
+  IN EFI_PHYSICAL_ADDRESS     TemporaryMemoryBase,\r
+  IN EFI_PHYSICAL_ADDRESS     PermanentMemoryBase,\r
+  IN UINTN                    CopySize\r
+  )\r
+{\r
+  IA32_DESCRIPTOR   IdtDescriptor;\r
+  VOID*             OldHeap;\r
+  VOID*             NewHeap;\r
+  VOID*             OldStack;\r
+  VOID*             NewStack;\r
+  UINTN             HeapSize;\r
+  UINTN             StackSize;\r
+\r
+  HeapSize   = CopySize * PcdGet8 (PcdFspHeapSizePercentage) / 100 ;\r
+  StackSize  = CopySize - HeapSize;\r
+    \r
+  OldHeap = (VOID*)(UINTN)TemporaryMemoryBase;\r
+  NewHeap = (VOID*)((UINTN)PermanentMemoryBase + StackSize);\r
+\r
+  OldStack = (VOID*)((UINTN)TemporaryMemoryBase + HeapSize);\r
+  NewStack = (VOID*)(UINTN)PermanentMemoryBase;\r
+\r
+  //\r
+  // Migrate Heap\r
+  //\r
+  CopyMem (NewHeap, OldHeap, HeapSize);\r
+\r
+  //\r
+  // Migrate Stack\r
+  //\r
+  CopyMem (NewStack, OldStack, StackSize);\r
+\r
+\r
+  //\r
+  // We need *not* fix the return address because currently,\r
+  // The PeiCore is executed in flash.\r
+  //\r
+\r
+  //\r
+  // Rebase IDT table in permanent memory\r
+  //\r
+  AsmReadIdtr (&IdtDescriptor);\r
+  IdtDescriptor.Base = IdtDescriptor.Base - (UINTN)OldStack + (UINTN)NewStack;\r
+\r
+  AsmWriteIdtr (&IdtDescriptor);\r
+\r
+  //\r
+  // Fixed the FSP data pointer\r
+  //\r
+  FspDataPointerFixUp ((UINTN)NewStack - (UINTN)OldStack);\r
+\r
+  //\r
+  // SecSwitchStack function must be invoked after the memory migration\r
+  // immediatly, also we need fixup the stack change caused by new call into\r
+  // permenent memory.\r
+  //\r
+  SecSwitchStack (\r
+    (UINT32) (UINTN) OldStack,\r
+    (UINT32) (UINTN) NewStack\r
+    );\r
+\r
+  return EFI_SUCCESS;\r
+}\r
diff --git a/IntelFsp2Pkg/FspSecCore/SecMain.h b/IntelFsp2Pkg/FspSecCore/SecMain.h
new file mode 100644 (file)
index 0000000..33f7362
--- /dev/null
@@ -0,0 +1,140 @@
+/** @file\r
+\r
+  Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _SEC_CORE_H_\r
+#define _SEC_CORE_H_\r
+\r
+\r
+#include <PiPei.h>\r
+#include <Ppi/TemporaryRamSupport.h>\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/IoLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/PcdLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/PciCf8Lib.h>\r
+#include <Library/SerialPortLib.h>\r
+#include <Library/FspSwitchStackLib.h>\r
+#include <Library/FspCommonLib.h>\r
+#include <FspEas.h>\r
+\r
+#define SEC_IDT_ENTRY_COUNT    34\r
+\r
+typedef VOID (*PEI_CORE_ENTRY) ( \\r
+  IN CONST  EFI_SEC_PEI_HAND_OFF    *SecCoreData, \\r
+  IN CONST  EFI_PEI_PPI_DESCRIPTOR  *PpiList \\r
+);\r
+\r
+typedef struct _SEC_IDT_TABLE {\r
+  EFI_PEI_SERVICES  *PeiService;\r
+  UINT64            IdtTable[SEC_IDT_ENTRY_COUNT];\r
+} SEC_IDT_TABLE;\r
+\r
+/**\r
+  Switch the stack in the temporary memory to the one in the permanent memory.\r
+\r
+  This function must be invoked after the memory migration immediately. The relative\r
+  position of the stack in the temporary and permanent memory is same.\r
+\r
+  @param[in] TemporaryMemoryBase  Base address of the temporary memory.\r
+  @param[in] PermenentMemoryBase  Base address of the permanent memory.\r
+**/\r
+VOID\r
+EFIAPI\r
+SecSwitchStack (\r
+  IN UINT32   TemporaryMemoryBase,\r
+  IN UINT32   PermenentMemoryBase\r
+  );\r
+\r
+/**\r
+  This service of the TEMPORARY_RAM_SUPPORT_PPI that migrates temporary RAM into\r
+  permanent memory.\r
+\r
+  @param[in] PeiServices            Pointer to the PEI Services Table.\r
+  @param[in] TemporaryMemoryBase    Source Address in temporary memory from which the SEC or PEIM will copy the\r
+                                Temporary RAM contents.\r
+  @param[in] PermanentMemoryBase    Destination Address in permanent memory into which the SEC or PEIM will copy the\r
+                                Temporary RAM contents.\r
+  @param[in] CopySize               Amount of memory to migrate from temporary to permanent memory.\r
+\r
+  @retval EFI_SUCCESS           The data was successfully returned.\r
+  @retval EFI_INVALID_PARAMETER PermanentMemoryBase + CopySize > TemporaryMemoryBase when\r
+                                TemporaryMemoryBase > PermanentMemoryBase.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SecTemporaryRamSupport (\r
+  IN CONST EFI_PEI_SERVICES   **PeiServices,\r
+  IN EFI_PHYSICAL_ADDRESS     TemporaryMemoryBase,\r
+  IN EFI_PHYSICAL_ADDRESS     PermanentMemoryBase,\r
+  IN UINTN                    CopySize\r
+  );\r
+\r
+/**\r
+  Initializes floating point units for requirement of UEFI specification.\r
+\r
+  This function initializes floating-point control word to 0x027F (all exceptions\r
+  masked,double-precision, round-to-nearest) and multimedia-extensions control word\r
+  (if supported) to 0x1F80 (all exceptions masked, round-to-nearest, flush to zero\r
+  for masked underflow).\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+InitializeFloatingPointUnits (\r
+  VOID\r
+  );\r
+\r
+/**\r
+\r
+  Entry point to the C language phase of SEC. After the SEC assembly\r
+  code has initialized some temporary memory and set up the stack,\r
+  the control is transferred to this function.\r
+\r
+\r
+  @param[in] SizeOfRam          Size of the temporary memory available for use.\r
+  @param[in] TempRamBase        Base address of tempory ram\r
+  @param[in] BootFirmwareVolume Base address of the Boot Firmware Volume.\r
+  @param[in] PeiCore            PeiCore entry point.\r
+  @param[in] BootLoaderStack    BootLoader stack.\r
+  @param[in] ApiIdx             the index of API.\r
+\r
+  @return This function never returns.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+SecStartup (\r
+  IN UINT32                   SizeOfRam,\r
+  IN UINT32                   TempRamBase,\r
+  IN VOID                    *BootFirmwareVolume,\r
+  IN PEI_CORE_ENTRY           PeiCore,\r
+  IN UINT32                   BootLoaderStack,\r
+  IN UINT32                   ApiIdx\r
+  );\r
+\r
+/**\r
+  Autogenerated function that calls the library constructors for all of the module's\r
+  dependent libraries.  This function must be called by the SEC Core once a stack has\r
+  been established.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+ProcessLibraryConstructorList (\r
+  VOID\r
+  );\r
+\r
+#endif\r
diff --git a/IntelFsp2Pkg/FspSecCore/Vtf0/Bin/ResetVec.ia32.raw b/IntelFsp2Pkg/FspSecCore/Vtf0/Bin/ResetVec.ia32.raw
new file mode 100644 (file)
index 0000000..2dc9f17
Binary files /dev/null and b/IntelFsp2Pkg/FspSecCore/Vtf0/Bin/ResetVec.ia32.raw differ
diff --git a/IntelFsp2Pkg/FspSecCore/Vtf0/Build.py b/IntelFsp2Pkg/FspSecCore/Vtf0/Build.py
new file mode 100644 (file)
index 0000000..3018391
--- /dev/null
@@ -0,0 +1,53 @@
+## @file\r
+#  Automate the process of building the various reset vector types\r
+#\r
+#  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>\r
+#\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution.  The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php\r
+#\r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+\r
+import glob\r
+import os\r
+import subprocess\r
+import sys\r
+\r
+def RunCommand(commandLine):\r
+    #print ' '.join(commandLine)\r
+    return subprocess.call(commandLine)\r
+\r
+for filename in glob.glob(os.path.join('Bin', '*.raw')):\r
+    os.remove(filename)\r
+\r
+arch = 'ia32'\r
+debugType = None\r
+output = os.path.join('Bin', 'ResetVec')\r
+output += '.' + arch\r
+if debugType is not None:\r
+    output += '.' + debugType\r
+output += '.raw'\r
+commandLine = (\r
+    'nasm',\r
+    '-D', 'ARCH_%s' % arch.upper(),\r
+    '-D', 'DEBUG_%s' % str(debugType).upper(),\r
+    '-o', output,\r
+    'ResetVectorCode.asm',\r
+    )\r
+ret = RunCommand(commandLine)\r
+print '\tASM\t' + output\r
+if ret != 0: sys.exit(ret)\r
+\r
+commandLine = (\r
+    'python',\r
+    'Tools/FixupForRawSection.py',\r
+    output,\r
+    )\r
+print '\tFIXUP\t' + output\r
+ret = RunCommand(commandLine)\r
+if ret != 0: sys.exit(ret)\r
+\r
diff --git a/IntelFsp2Pkg/FspSecCore/Vtf0/Ia16/ResetVec.asm16 b/IntelFsp2Pkg/FspSecCore/Vtf0/Ia16/ResetVec.asm16
new file mode 100644 (file)
index 0000000..585876f
--- /dev/null
@@ -0,0 +1,103 @@
+;; @file\r
+;  Reset Vector Data structure\r
+;  This structure is located at 0xFFFFFFC0\r
+;\r
+; Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>\r
+; This program and the accompanying materials\r
+; are licensed and made available under the terms and conditions of the BSD License\r
+; which accompanies this distribution.  The full text of the license may be found at\r
+; http://opensource.org/licenses/bsd-license.php.\r
+;\r
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+;\r
+;;\r
+\r
+BITS    16\r
+\r
+\r
+;\r
+; The layout of this file is fixed. The build tool makes assumption of the layout.\r
+;\r
+\r
+ORG     0x0\r
+;\r
+; Reserved\r
+;\r
+ReservedData:         DD 0eeeeeeeeh, 0eeeeeeeeh\r
+\r
+ ;  ORG     0x10\r
+ TIMES 0x10-($-$$) DB 0\r
+;\r
+; This is located at 0xFFFFFFD0h\r
+;\r
+    mov     di, "AP"\r
+    jmp     ApStartup\r
+\r
+ ;   ORG     0x20\r
+\r
+ TIMES 0x20-($-$$) DB 0\r
+\r
+; Pointer to the entry point of the PEI core\r
+; It is located at 0xFFFFFFE0, and is fixed up by some build tool\r
+; So if the value 8..1 appears in the final FD image, tool failure occurs.\r
+;\r
+PeiCoreEntryPoint:       DD      0x12345678\r
+\r
+;\r
+; This is the handler for all kinds of exceptions. Since it's for debugging\r
+; purpose only, nothing except a deadloop would be done here. Developers could\r
+; analyze the cause of the exception if a debugger had been attached.\r
+;\r
+InterruptHandler:\r
+    jmp     $\r
+    iret\r
+\r
+  ;  ORG     0x30\r
+ TIMES 0x30-($-$$) DB 0\r
+;\r
+; For IA32, the reset vector must be at 0xFFFFFFF0, i.e., 4G-16 byte\r
+; Execution starts here upon power-on/platform-reset.\r
+;\r
+ResetHandler:\r
+    nop\r
+    nop\r
+\r
+ApStartup:\r
+    ;\r
+    ; Jmp Rel16 instruction\r
+    ; Use machine code directly in case of the assembler optimization\r
+    ; SEC entry point relatvie address will be fixed up by some build tool.\r
+    ;\r
+    ; Typically, SEC entry point is the function _ModuleEntryPoint() defined in\r
+    ; SecEntry.asm\r
+    ;\r
+    DB      0x0e9\r
+    DW      -3\r
+\r
+  ; ORG     0x38\r
+\r
+ TIMES 0x38-($-$$) DB 0\r
+;\r
+; Ap reset vector segment address is at 0xFFFFFFF8\r
+; This will be fixed up by some build tool,\r
+; so if the value 1..8 appears in the final FD image,\r
+; tool failure occurs\r
+;\r
+ApSegAddress:    dd      0x12345678\r
+\r
+ ;   ORG     0x3c\r
+ TIMES 0x3c-($-$$) DB 0\r
+;\r
+; BFV Base is at 0xFFFFFFFC\r
+; This will be fixed up by some build tool,\r
+; so if the value 1..8 appears in the final FD image,\r
+; tool failure occurs.\r
+;\r
+BfvBase:     DD      0x12345678\r
+\r
+;\r
+; Nothing can go here, otherwise the layout of this file would change.\r
+;\r
+\r
+   ; END\r
diff --git a/IntelFsp2Pkg/FspSecCore/Vtf0/ResetVectorCode.asm b/IntelFsp2Pkg/FspSecCore/Vtf0/ResetVectorCode.asm
new file mode 100644 (file)
index 0000000..72b2524
--- /dev/null
@@ -0,0 +1,17 @@
+;------------------------------------------------------------------------------\r
+; @file\r
+; This file includes all other code files to assemble the reset vector code\r
+;\r
+; Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>\r
+; This program and the accompanying materials\r
+; are licensed and made available under the terms and conditions of the BSD License\r
+; which accompanies this distribution.  The full text of the license may be found at\r
+; http://opensource.org/licenses/bsd-license.php\r
+;\r
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+;\r
+;------------------------------------------------------------------------------\r
+\r
+\r
+%include "Ia16/ResetVec.asm16"\r
diff --git a/IntelFsp2Pkg/FspSecCore/Vtf0/Tools/FixupForRawSection.py b/IntelFsp2Pkg/FspSecCore/Vtf0/Tools/FixupForRawSection.py
new file mode 100644 (file)
index 0000000..8e7c20b
--- /dev/null
@@ -0,0 +1,110 @@
+## @file\r
+#  Apply fixup to VTF binary image for FFS Raw section\r
+#\r
+#  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>\r
+#\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution.  The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php\r
+#\r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+\r
+import sys\r
+\r
+filename = sys.argv[1]\r
+\r
+if filename.lower().find('ia32') >= 0:\r
+    d = open(sys.argv[1], 'rb').read()\r
+    c = ((len(d) + 4 + 7) & ~7) - 4\r
+    if c > len(d):\r
+        c -= len(d)\r
+        f = open(sys.argv[1], 'wb')\r
+        f.write('\x90' * c)\r
+        f.write(d)\r
+        f.close()\r
+else:\r
+    from struct import pack\r
+\r
+    PAGE_PRESENT             =     0x01\r
+    PAGE_READ_WRITE          =     0x02\r
+    PAGE_USER_SUPERVISOR     =     0x04\r
+    PAGE_WRITE_THROUGH       =     0x08\r
+    PAGE_CACHE_DISABLE       =    0x010\r
+    PAGE_ACCESSED            =    0x020\r
+    PAGE_DIRTY               =    0x040\r
+    PAGE_PAT                 =    0x080\r
+    PAGE_GLOBAL              =   0x0100\r
+    PAGE_2M_MBO              =    0x080\r
+    PAGE_2M_PAT              =  0x01000\r
+\r
+    def NopAlign4k(s):\r
+        c = ((len(s) + 0xfff) & ~0xfff) - len(s)\r
+        return ('\x90' * c) + s\r
+\r
+    def PageDirectoryEntries4GbOf2MbPages(baseAddress):\r
+\r
+        s = ''\r
+        for i in range(0x800):\r
+            i = (\r
+                    baseAddress + long(i << 21) +\r
+                    PAGE_2M_MBO +\r
+                    PAGE_CACHE_DISABLE +\r
+                    PAGE_ACCESSED +\r
+                    PAGE_DIRTY +\r
+                    PAGE_READ_WRITE +\r
+                    PAGE_PRESENT\r
+                )\r
+            s += pack('Q', i)\r
+        return s\r
+\r
+    def PageDirectoryPointerTable4GbOf2MbPages(pdeBase):\r
+        s = ''\r
+        for i in range(0x200):\r
+            i = (\r
+                    pdeBase +\r
+                    (min(i, 3) << 12) +\r
+                    PAGE_CACHE_DISABLE +\r
+                    PAGE_ACCESSED +\r
+                    PAGE_READ_WRITE +\r
+                    PAGE_PRESENT\r
+                )\r
+            s += pack('Q', i)\r
+        return s\r
+\r
+    def PageMapLevel4Table4GbOf2MbPages(pdptBase):\r
+        s = ''\r
+        for i in range(0x200):\r
+            i = (\r
+                    pdptBase +\r
+                    (min(i, 0) << 12) +\r
+                    PAGE_CACHE_DISABLE +\r
+                    PAGE_ACCESSED +\r
+                    PAGE_READ_WRITE +\r
+                    PAGE_PRESENT\r
+                )\r
+            s += pack('Q', i)\r
+        return s\r
+\r
+    def First4GbPageEntries(topAddress):\r
+        PDE = PageDirectoryEntries4GbOf2MbPages(0L)\r
+        pml4tBase = topAddress - 0x1000\r
+        pdptBase = pml4tBase - 0x1000\r
+        pdeBase = pdptBase - len(PDE)\r
+        PDPT = PageDirectoryPointerTable4GbOf2MbPages(pdeBase)\r
+        PML4T = PageMapLevel4Table4GbOf2MbPages(pdptBase)\r
+        return PDE + PDPT + PML4T\r
+\r
+    def AlignAndAddPageTables():\r
+        d = open(sys.argv[1], 'rb').read()\r
+        code = NopAlign4k(d)\r
+        topAddress = 0x100000000 - len(code)\r
+        d = ('\x90' * 4) + First4GbPageEntries(topAddress) + code\r
+        f = open(sys.argv[1], 'wb')\r
+        f.write(d)\r
+        f.close()\r
+\r
+    AlignAndAddPageTables()\r
+\r
diff --git a/IntelFsp2Pkg/Include/FspDataTable.h b/IntelFsp2Pkg/Include/FspDataTable.h
new file mode 100644 (file)
index 0000000..3c79f34
--- /dev/null
@@ -0,0 +1,32 @@
+/** @file\r
+  The header file of FSP data table\r
+\r
+  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _FSP_DATA_TABLE_H_\r
+#define _FSP_DATA_TABLE_H_\r
+\r
+#pragma pack(1)\r
+\r
+#define FSP_DATA_SIGNATURE  SIGNATURE_32 ('F', 'S', 'P', 'D')\r
+\r
+typedef struct  {\r
+  UINT32  Signature;\r
+  UINT32  Length;\r
+  UINT32  FsptBase;\r
+  UINT32  FspmBase;\r
+  UINT32  FspsBase;\r
+} FSP_DATA_TABLE;\r
+\r
+#pragma pack()\r
+\r
+#endif\r
diff --git a/IntelFsp2Pkg/Include/FspEas.h b/IntelFsp2Pkg/Include/FspEas.h
new file mode 100644 (file)
index 0000000..79bb0b8
--- /dev/null
@@ -0,0 +1,24 @@
+/** @file\r
+  Intel FSP definition from Intel Firmware Support Package External\r
+  Architecture Specification v2.0.\r
+\r
+  Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _FSP_EAS_H_\r
+#define _FSP_EAS_H_\r
+\r
+#include <Uefi.h>\r
+#include <Guid/GuidHobFspEas.h>\r
+#include <Guid/FspHeaderFile.h>\r
+#include <FspEas/FspApi.h>\r
+\r
+#endif\r
diff --git a/IntelFsp2Pkg/Include/FspEas/FspApi.h b/IntelFsp2Pkg/Include/FspEas/FspApi.h
new file mode 100644 (file)
index 0000000..f7c7168
--- /dev/null
@@ -0,0 +1,241 @@
+/** @file\r
+  Intel FSP API definition from Intel Firmware Support Package External\r
+  Architecture Specification v2.0.\r
+\r
+  Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _FSP_API_H_\r
+#define _FSP_API_H_\r
+\r
+#pragma pack(1)\r
+typedef struct {\r
+  ///\r
+  /// UPD Region Signature. This signature will be\r
+  /// "XXXXXX_T" for FSP-T\r
+  /// "XXXXXX_M" for FSP-M\r
+  /// "XXXXXX_S" for FSP-S\r
+  /// Where XXXXXX is an unique signature\r
+  ///\r
+  UINT64                      Signature;\r
+  ///\r
+  /// Revision of the Data structure. For FSP v2.0 value is 1.\r
+  ///\r
+  UINT8                       Revision;\r
+  UINT8                       Reserved[23];\r
+} FSP_UPD_HEADER;\r
+\r
+typedef struct {\r
+  ///\r
+  /// Revision of the structure. For FSP v2.0 value is 1.\r
+  ///\r
+  UINT8                       Revision;\r
+  UINT8                       Reserved[3];\r
+  ///\r
+  /// Pointer to the non-volatile storage (NVS) data buffer.\r
+  /// If it is NULL it indicates the NVS data is not available.\r
+  ///\r
+  VOID                        *NvsBufferPtr;\r
+  ///\r
+  /// Pointer to the temporary stack base address to be\r
+  /// consumed inside FspMemoryInit() API.\r
+  ///\r
+  VOID                        *StackBase;\r
+  ///\r
+  /// Temporary stack size to be consumed inside\r
+  /// FspMemoryInit() API.\r
+  ///\r
+  UINT32                      StackSize;\r
+  ///\r
+  /// Size of memory to be reserved by FSP below "top\r
+  /// of low usable memory" for bootloader usage.\r
+  ///\r
+  UINT32                      BootLoaderTolumSize;\r
+  ///\r
+  /// Current boot mode.\r
+  ///\r
+  UINT32                      BootMode;\r
+  UINT8                       Reserved1[8];\r
+} FSPM_ARCH_UPD;\r
+\r
+typedef struct {\r
+  FSP_UPD_HEADER              FspUpdHeader;\r
+} FSPT_UPD_COMMON;\r
+\r
+typedef struct {\r
+  FSP_UPD_HEADER              FspUpdHeader;\r
+  FSPM_ARCH_UPD               FspmArchUpd;\r
+} FSPM_UPD_COMMON;\r
+\r
+typedef struct {\r
+  FSP_UPD_HEADER              FspUpdHeader;\r
+} FSPS_UPD_COMMON;\r
+\r
+typedef enum {\r
+  ///\r
+  /// This stage is notified when the bootloader completes the\r
+  /// PCI enumeration and the resource allocation for the\r
+  /// PCI devices is complete.\r
+  ///\r
+  EnumInitPhaseAfterPciEnumeration = 0x20,\r
+  ///\r
+  /// This stage is notified just before the bootloader hand-off\r
+  /// to the OS loader.\r
+  ///\r
+  EnumInitPhaseReadyToBoot         = 0x40,\r
+  ///\r
+  /// This stage is notified just before the firmware/Preboot\r
+  /// environment transfers management of all system resources\r
+  /// to the OS or next level execution environment.\r
+  ///\r
+  EnumInitPhaseEndOfFirmware       = 0xF0\r
+} FSP_INIT_PHASE;\r
+\r
+typedef struct {\r
+  ///\r
+  /// Notification phase used for NotifyPhase API\r
+  ///\r
+  FSP_INIT_PHASE     Phase;\r
+} NOTIFY_PHASE_PARAMS;\r
+\r
+#pragma pack()\r
+\r
+/**\r
+  This FSP API is called soon after coming out of reset and before memory and stack is\r
+  available. This FSP API will load the microcode update, enable code caching for the\r
+  region specified by the boot loader and also setup a temporary stack to be used until\r
+  main memory is initialized.\r
+\r
+  A hardcoded stack can be set up with the following values, and the "esp" register\r
+  initialized to point to this hardcoded stack.\r
+  1. The return address where the FSP will return control after setting up a temporary\r
+     stack.\r
+  2. A pointer to the input parameter structure\r
+\r
+  However, since the stack is in ROM and not writeable, this FSP API cannot be called\r
+  using the "call" instruction, but needs to be jumped to.\r
+\r
+  @param[in] FsptUpdDataPtr     Pointer to the FSPT_UPD data structure.\r
+\r
+  @retval EFI_SUCCESS           Temporary RAM was initialized successfully.\r
+  @retval EFI_INVALID_PARAMETER Input parameters are invalid.\r
+  @retval EFI_UNSUPPORTED       The FSP calling conditions were not met.\r
+  @retval EFI_DEVICE_ERROR      Temp RAM initialization failed.\r
+\r
+  If this function is successful, the FSP initializes the ECX and EDX registers to point to\r
+  a temporary but writeable memory range available to the boot loader and returns with\r
+  FSP_SUCCESS in register EAX. Register ECX points to the start of this temporary\r
+  memory range and EDX points to the end of the range. Boot loader is free to use the\r
+  whole range described. Typically the boot loader can reload the ESP register to point\r
+  to the end of this returned range so that it can be used as a standard stack.\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *FSP_TEMP_RAM_INIT) (\r
+  IN  VOID    *FsptUpdDataPtr\r
+  );\r
+\r
+/**\r
+  This FSP API is used to notify the FSP about the different phases in the boot process.\r
+  This allows the FSP to take appropriate actions as needed during different initialization\r
+  phases. The phases will be platform dependent and will be documented with the FSP\r
+  release. The current FSP supports two notify phases:\r
+    Post PCI enumeration\r
+    Ready To Boot\r
+\r
+  @param[in] NotifyPhaseParamPtr Address pointer to the NOTIFY_PHASE_PRAMS\r
+\r
+  @retval EFI_SUCCESS           The notification was handled successfully.\r
+  @retval EFI_UNSUPPORTED       The notification was not called in the proper order.\r
+  @retval EFI_INVALID_PARAMETER The notification code is invalid.\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *FSP_NOTIFY_PHASE) (\r
+  IN NOTIFY_PHASE_PARAMS *NotifyPhaseParamPtr\r
+  );\r
+\r
+/**\r
+  This FSP API is called after TempRamInit and initializes the memory.\r
+  This FSP API accepts a pointer to a data structure that will be platform dependent\r
+  and defined for each FSP binary. This will be documented in Integration guide with\r
+  each FSP release.\r
+  After FspMemInit completes its execution, it passes the pointer to the HobList and\r
+  returns to the boot loader from where it was called. BootLoader is responsible to \r
+  migrate it's stack and data to Memory.\r
+  FspMemoryInit, TempRamExit and FspSiliconInit APIs provide an alternate method to\r
+  complete the silicon initialization and provides bootloader an opportunity to get\r
+  control after system memory is available and before the temporary RAM is torn down.\r
+\r
+  @param[in]  FspmUpdDataPtr          Pointer to the FSPM_UPD data sructure.\r
+  @param[out] HobListPtr              Pointer to receive the address of the HOB list.\r
+\r
+  @retval EFI_SUCCESS                 FSP execution environment was initialized successfully.\r
+  @retval EFI_INVALID_PARAMETER       Input parameters are invalid.\r
+  @retval EFI_UNSUPPORTED             The FSP calling conditions were not met.\r
+  @retval EFI_DEVICE_ERROR            FSP initialization failed.\r
+  @retval EFI_OUT_OF_RESOURCES        Stack range requested by FSP is not met.\r
+  @retval FSP_STATUS_RESET_REQUIREDx  A reset is reuired. These status codes will not be returned during S3.\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *FSP_MEMORY_INIT) (\r
+  IN  VOID    *FspmUpdDataPtr,\r
+  OUT VOID    **HobListPtr\r
+  );\r
+\r
+\r
+/**\r
+  This FSP API is called after FspMemoryInit API. This FSP API tears down the temporary\r
+  memory setup by TempRamInit API. This FSP API accepts a pointer to a data structure\r
+  that will be platform dependent and defined for each FSP binary. This will be\r
+  documented in Integration Guide.\r
+  FspMemoryInit, TempRamExit and FspSiliconInit APIs provide an alternate method to\r
+  complete the silicon initialization and provides bootloader an opportunity to get\r
+  control after system memory is available and before the temporary RAM is torn down.\r
+\r
+  @param[in] TempRamExitParamPtr Pointer to the Temp Ram Exit parameters structure.\r
+                                 This structure is normally defined in the Integration Guide.\r
+                                 And if it is not defined in the Integration Guide, pass NULL.\r
+\r
+  @retval EFI_SUCCESS            FSP execution environment was initialized successfully.\r
+  @retval EFI_INVALID_PARAMETER  Input parameters are invalid.\r
+  @retval EFI_UNSUPPORTED        The FSP calling conditions were not met.\r
+  @retval EFI_DEVICE_ERROR       FSP initialization failed.\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *FSP_TEMP_RAM_EXIT) (\r
+  IN  VOID    *TempRamExitParamPtr\r
+  );\r
+\r
+\r
+/**\r
+  This FSP API is called after TempRamExit API.\r
+  FspMemoryInit, TempRamExit and FspSiliconInit APIs provide an alternate method to complete the\r
+  silicon initialization.\r
+\r
+  @param[in] FspsUpdDataPtr     Pointer to the FSPS_UPD data structure.\r
+                                If NULL, FSP will use the default parameters.\r
+\r
+  @retval EFI_SUCCESS                 FSP execution environment was initialized successfully.\r
+  @retval EFI_INVALID_PARAMETER       Input parameters are invalid.\r
+  @retval EFI_UNSUPPORTED             The FSP calling conditions were not met.\r
+  @retval EFI_DEVICE_ERROR            FSP initialization failed.\r
+  @retval FSP_STATUS_RESET_REQUIREDx  A reset is reuired. These status codes will not be returned during S3.\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *FSP_SILICON_INIT) (\r
+  IN  VOID    *FspsUpdDataPtr\r
+  );\r
+\r
+#endif\r
diff --git a/IntelFsp2Pkg/Include/FspGlobalData.h b/IntelFsp2Pkg/Include/FspGlobalData.h
new file mode 100644 (file)
index 0000000..a484d16
--- /dev/null
@@ -0,0 +1,68 @@
+/** @file\r
+\r
+  Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _FSP_GLOBAL_DATA_H_\r
+#define _FSP_GLOBAL_DATA_H_\r
+\r
+#include <FspEas.h>\r
+\r
+#pragma pack(1)\r
+\r
+typedef enum {\r
+  TempRamInitApiIndex,\r
+  FspInitApiIndex,\r
+  NotifyPhaseApiIndex,\r
+  FspMemoryInitApiIndex,\r
+  TempRamExitApiIndex,\r
+  FspSiliconInitApiIndex,\r
+  FspApiIndexMax\r
+} FSP_API_INDEX;\r
+\r
+typedef struct  {\r
+   VOID               *DataPtr;\r
+   UINT32             MicrocodeRegionBase;\r
+   UINT32             MicrocodeRegionSize;\r
+   UINT32             CodeRegionBase;\r
+   UINT32             CodeRegionSize;\r
+   UINT32             CarBase;\r
+   UINT32             CarSize;\r
+} FSP_PLAT_DATA;\r
+\r
+#define FSP_GLOBAL_DATA_SIGNATURE  SIGNATURE_32 ('F', 'S', 'P', 'D')\r
+#define FSP_PERFORMANCE_DATA_SIGNATURE  SIGNATURE_32 ('P', 'E', 'R', 'F')\r
+\r
+typedef struct  {\r
+   UINT32             Signature;\r
+   UINT8              Version;\r
+   UINT8              Reserved1[3];\r
+   UINT32             CoreStack;\r
+   UINT32             StatusCode;\r
+   UINT32             Reserved2[8];\r
+   FSP_PLAT_DATA      PlatformData;\r
+   FSP_INFO_HEADER    *FspInfoHeader;\r
+   VOID               *UpdDataPtr;\r
+   VOID               *TempRamInitUpdPtr;\r
+   VOID               *MemoryInitUpdPtr;\r
+   VOID               *SiliconInitUpdPtr;\r
+   UINT8              ApiIdx;\r
+   UINT8              Reserved3[31];\r
+   UINT32             PerfSig;\r
+   UINT16             PerfLen;\r
+   UINT16             Reserved4;\r
+   UINT32             PerfIdx;\r
+   UINT64             PerfData[32];\r
+} FSP_GLOBAL_DATA;\r
+\r
+#pragma pack()\r
+\r
+#endif\r
diff --git a/IntelFsp2Pkg/Include/FspMeasurePointId.h b/IntelFsp2Pkg/Include/FspMeasurePointId.h
new file mode 100644 (file)
index 0000000..ee103df
--- /dev/null
@@ -0,0 +1,62 @@
+/** @file\r
+\r
+  Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _FSP_MEASURE_POINT_ID_H_\r
+#define _FSP_MEASURE_POINT_ID_H_\r
+\r
+//\r
+// 0xD0 - 0xEF are reserved for FSP common measure point\r
+//\r
+#define  FSP_PERF_ID_MRC_INIT_ENTRY               0xD0\r
+#define  FSP_PERF_ID_MRC_INIT_EXIT                (FSP_PERF_ID_MRC_INIT_ENTRY +  1)\r
+\r
+#define  FSP_PERF_ID_SYSTEM_AGENT_INIT_ENTRY      0xD8\r
+#define  FSP_PERF_ID_SYSTEM_AGENT_INIT_EXIT       (FSP_PERF_ID_SYSTEM_AGENT_INIT_ENTRY +  1)\r
+\r
+#define  FSP_PERF_ID_PCH_INIT_ENTRY               0xDA\r
+#define  FSP_PERF_ID_PCH_INIT_EXIT                (FSP_PERF_ID_PCH_INIT_ENTRY +  1)\r
+\r
+#define  FSP_PERF_ID_CPU_INIT_ENTRY               0xE0\r
+#define  FSP_PERF_ID_CPU_INIT_EXIT                (FSP_PERF_ID_CPU_INIT_ENTRY +  1)\r
+\r
+#define  FSP_PERF_ID_GFX_INIT_ENTRY               0xE8\r
+#define  FSP_PERF_ID_GFX_INIT_EXIT                (FSP_PERF_ID_GFX_INIT_ENTRY +  1)\r
+\r
+#define  FSP_PERF_ID_ME_INIT_ENTRY                0xEA\r
+#define  FSP_PERF_ID_ME_INIT_EXIT                 (FSP_PERF_ID_ME_INIT_ENTRY +  1)\r
+\r
+//\r
+// 0xF0 - 0xFF are reserved for FSP API\r
+//\r
+#define  FSP_PERF_ID_API_TEMP_RAM_INIT_ENTRY           0xF0\r
+#define  FSP_PERF_ID_API_TEMP_RAM_INIT_EXIT            (FSP_PERF_ID_API_TEMP_RAM_INIT_ENTRY + 1)\r
+\r
+#define  FSP_PERF_ID_API_FSP_MEMORY_INIT_ENTRY         0xF2\r
+#define  FSP_PERF_ID_API_FSP_MEMORY_INIT_EXIT          (FSP_PERF_ID_API_FSP_MEMORY_INIT_ENTRY + 1)\r
+\r
+#define  FSP_PERF_ID_API_TEMP_RAM_EXIT_ENTRY           0xF4\r
+#define  FSP_PERF_ID_API_TEMP_RAM_EXIT_EXIT            (FSP_PERF_ID_API_TEMP_RAM_EXIT_ENTRY + 1)\r
+\r
+#define  FSP_PERF_ID_API_FSP_SILICON_INIT_ENTRY        0xF6\r
+#define  FSP_PERF_ID_API_FSP_SILICON_INIT_EXIT         (FSP_PERF_ID_API_FSP_SILICON_INIT_ENTRY + 1)\r
+\r
+#define  FSP_PERF_ID_API_NOTIFY_POST_PCI_ENTRY         0xF8\r
+#define  FSP_PERF_ID_API_NOTIFY_POST_PCI_EXIT          (FSP_PERF_ID_API_NOTIFY_POST_PCI_ENTRY + 1)\r
+\r
+#define  FSP_PERF_ID_API_NOTIFY_READY_TO_BOOT_ENTRY    0xFA\r
+#define  FSP_PERF_ID_API_NOTIFY_READY_TO_BOOT_EXIT     (FSP_PERF_ID_API_NOTIFY_READY_TO_BOOT_ENTRY + 1)\r
+\r
+#define  FSP_PERF_ID_API_NOTIFY_END_OF_FIRMWARE_ENTRY  0xFC\r
+#define  FSP_PERF_ID_API_NOTIFY_END_OF_FIRMWARE_EXIT   (FSP_PERF_ID_API_NOTIFY_END_OF_FIRMWARE_ENTRY + 1)\r
+\r
+#endif\r
diff --git a/IntelFsp2Pkg/Include/FspStatusCode.h b/IntelFsp2Pkg/Include/FspStatusCode.h
new file mode 100644 (file)
index 0000000..c9a316e
--- /dev/null
@@ -0,0 +1,46 @@
+/** @file\r
+  Intel FSP status code definition\r
+\r
+  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _FSP_STATUS_CODE_H_\r
+#define _FSP_STATUS_CODE_H_\r
+\r
+//\r
+// FSP API - 4 BITS\r
+//\r
+#define FSP_STATUS_CODE_TEMP_RAM_INIT                0xF000\r
+#define FSP_STATUS_CODE_MEMORY_INIT                  0xD000\r
+#define FSP_STATUS_CODE_TEMP_RAM_EXIT                0xB000\r
+#define FSP_STATUS_CODE_SILICON_INIT                 0x9000\r
+#define FSP_STATUS_CODE_POST_PCIE_ENUM_NOTIFICATION  0x6000\r
+#define FSP_STATUS_CODE_READY_TO_BOOT_NOTIFICATION   0x4000\r
+#define FSP_STATUS_CODE_END_OF_FIRMWARE_NOTIFICATION 0x2000\r
+\r
+//\r
+// MODULE - 4 BITS\r
+//\r
+#define FSP_STATUS_CODE_GFX_PEIM                     0x0700\r
+#define FSP_STATUS_CODE_COMMON_CODE                  0x0800\r
+#define FSP_STATUS_CODE_SILICON_COMMON_CODE          0x0900\r
+#define FSP_STATUS_CODE_SYSTEM_AGENT                 0x0A00\r
+#define FSP_STATUS_CODE_PCH                          0x0B00\r
+#define FSP_STATUS_CODE_CPU                          0x0C00\r
+#define FSP_STATUS_CODE_MRC                          0x0D00\r
+#define FSP_STATUS_CODE_ME_BIOS                      0x0E00\r
+//\r
+// Individual Codes - 1 BYTE\r
+//\r
+#define FSP_STATUS_CODE_API_ENTRY                    0x0000\r
+#define FSP_STATUS_CODE_API_EXIT                     0x007F\r
+\r
+#endif\r
diff --git a/IntelFsp2Pkg/Include/Guid/FspHeaderFile.h b/IntelFsp2Pkg/Include/Guid/FspHeaderFile.h
new file mode 100644 (file)
index 0000000..96cac00
--- /dev/null
@@ -0,0 +1,204 @@
+/** @file\r
+  Intel FSP Header File definition from Intel Firmware Support Package External\r
+  Architecture Specification v2.0.\r
+\r
+  Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef __FSP_HEADER_FILE_H__\r
+#define __FSP_HEADER_FILE_H__\r
+\r
+#define FSP_HEADER_REVISION_3   3\r
+\r
+#define FSPE_HEADER_REVISION_1  1\r
+#define FSPP_HEADER_REVISION_1  1\r
+\r
+///\r
+/// Fixed FSP header offset in the FSP image\r
+///\r
+#define FSP_INFO_HEADER_OFF    0x94\r
+\r
+#define OFFSET_IN_FSP_INFO_HEADER(x)  (UINT32)&((FSP_INFO_HEADER *)(UINTN)0)->x\r
+\r
+#define FSP_INFO_HEADER_SIGNATURE  SIGNATURE_32 ('F', 'S', 'P', 'H')\r
+\r
+#pragma pack(1)\r
+\r
+///\r
+/// FSP Information Header as described in FSP v2.0 Spec section 5.1.1.\r
+///\r
+typedef struct {\r
+  ///\r
+  /// Byte 0x00: Signature ('FSPH') for the FSP Information Header.\r
+  ///\r
+  UINT32  Signature;\r
+  ///\r
+  /// Byte 0x04: Length of the FSP Information Header.\r
+  ///\r
+  UINT32  HeaderLength;\r
+  ///\r
+  /// Byte 0x08: Reserved.\r
+  ///\r
+  UINT8   Reserved1[2];\r
+  ///\r
+  /// Byte 0x0A: Indicates compliance with a revision of this specification in the BCD format.\r
+  ///\r
+  UINT8   SpecVersion;\r
+  ///\r
+  /// Byte 0x0B: Revision of the FSP Information Header.\r
+  ///\r
+  UINT8   HeaderRevision;\r
+  ///\r
+  /// Byte 0x0C: Revision of the FSP binary.\r
+  ///\r
+  UINT32  ImageRevision;\r
+  ///\r
+  /// Byte 0x10: Signature string that will help match the FSP Binary to a supported HW configuration.\r
+  ///\r
+  CHAR8   ImageId[8];\r
+  ///\r
+  /// Byte 0x18: Size of the entire FSP binary.\r
+  ///\r
+  UINT32  ImageSize;\r
+  ///\r
+  /// Byte 0x1C: FSP binary preferred base address.\r
+  ///\r
+  UINT32  ImageBase;\r
+  ///\r
+  /// Byte 0x20: Attribute for the FSP binary.\r
+  ///\r
+  UINT16  ImageAttribute;\r
+  ///\r
+  /// Byte 0x22: Attributes of the FSP Component.\r
+  ///\r
+  UINT16  ComponentAttribute;\r
+  ///\r
+  /// Byte 0x24: Offset of the FSP configuration region.\r
+  ///\r
+  UINT32  CfgRegionOffset;\r
+  ///\r
+  /// Byte 0x28: Size of the FSP configuration region.\r
+  ///\r
+  UINT32  CfgRegionSize;\r
+  ///\r
+  /// Byte 0x2C: Reserved2.\r
+  ///\r
+  UINT32  Reserved2;\r
+  ///\r
+  /// Byte 0x30: The offset for the API to setup a temporary stack till the memory is initialized.\r
+  ///\r
+  UINT32  TempRamInitEntryOffset;\r
+  ///\r
+  /// Byte 0x34: Reserved3.\r
+  ///\r
+  UINT32  Reserved3;\r
+  ///\r
+  /// Byte 0x38: The offset for the API to inform the FSP about the different stages in the boot process.\r
+  ///\r
+  UINT32  NotifyPhaseEntryOffset;\r
+  ///\r
+  /// Byte 0x3C: The offset for the API to initialize the memory.\r
+  ///\r
+  UINT32  FspMemoryInitEntryOffset;\r
+  ///\r
+  /// Byte 0x40: The offset for the API to tear down temporary RAM.\r
+  ///\r
+  UINT32  TempRamExitEntryOffset;\r
+  ///\r
+  /// Byte 0x44: The offset for the API to initialize the CPU and chipset.\r
+  ///\r
+  UINT32  FspSiliconInitEntryOffset;\r
+} FSP_INFO_HEADER;\r
+\r
+///\r
+/// Signature of the FSP Extended Header\r
+///\r
+#define FSP_INFO_EXTENDED_HEADER_SIGNATURE  SIGNATURE_32 ('F', 'S', 'P', 'E')\r
+\r
+///\r
+/// FSP Information Extended Header as described in FSP v2.0 Spec section 5.1.2.\r
+///\r
+typedef struct {\r
+  ///\r
+  /// Byte 0x00: Signature ('FSPE') for the FSP Extended Information Header.\r
+  ///\r
+  UINT32  Signature;\r
+  ///\r
+  /// Byte 0x04: Length of the table in bytes, including all additional FSP producer defined data.\r
+  ///\r
+  UINT32  Length;\r
+  ///\r
+  /// Byte 0x08: FSP producer defined revision of the table.\r
+  ///\r
+  UINT8   Revision;\r
+  ///\r
+  /// Byte 0x09: Reserved for future use.\r
+  ///\r
+  UINT8   Reserved;\r
+  ///\r
+  /// Byte 0x0A: FSP producer identification string \r
+  ///\r
+  CHAR8   FspProducerId[6];\r
+  ///\r
+  /// Byte 0x10: FSP producer implementation revision number. Larger numbers are assumed to be newer revisions.\r
+  ///\r
+  UINT32  FspProducerRevision;\r
+  ///\r
+  /// Byte 0x14: Size of the FSP producer defined data (n) in bytes.\r
+  ///\r
+  UINT32  FspProducerDataSize;\r
+  ///\r
+  /// Byte 0x18: FSP producer defined data of size (n) defined by FspProducerDataSize.\r
+  ///\r
+} FSP_INFO_EXTENDED_HEADER;\r
+\r
+//\r
+// A generic table search algorithm for additional tables can be implemented with a\r
+// signature search algorithm until a terminator signature 'FSPP' is found.\r
+//\r
+#define FSP_FSPP_SIGNATURE  SIGNATURE_32 ('F', 'S', 'P', 'P')\r
+#define FSP_PATCH_TABLE_SIGNATURE  FSP_FSPP_SIGNATURE\r
+\r
+///\r
+/// FSP Patch Table as described in FSP v2.0 Spec section 5.1.5.\r
+///\r
+typedef struct {\r
+  ///\r
+  /// Byte 0x00: FSP Patch Table Signature "FSPP".\r
+  ///\r
+  UINT32  Signature;\r
+  ///\r
+  /// Byte 0x04: Size including the PatchData.\r
+  ///\r
+  UINT16  HeaderLength;\r
+  ///\r
+  /// Byte 0x06: Revision is set to 0x01.\r
+  ///\r
+  UINT8   HeaderRevision;\r
+  ///\r
+  /// Byte 0x07: Reserved for future use.\r
+  ///\r
+  UINT8   Reserved;\r
+  ///\r
+  /// Byte 0x08: Number of entries to Patch.\r
+  ///\r
+  UINT32  PatchEntryNum;\r
+  ///\r
+  /// Byte 0x0C: Patch Data.\r
+  ///\r
+//UINT32  PatchData[];\r
+} FSP_PATCH_TABLE;\r
+\r
+#pragma pack()\r
+\r
+extern EFI_GUID gFspHeaderFileGuid;\r
+\r
+#endif\r
diff --git a/IntelFsp2Pkg/Include/Guid/GuidHobFspEas.h b/IntelFsp2Pkg/Include/Guid/GuidHobFspEas.h
new file mode 100644 (file)
index 0000000..83c7f00
--- /dev/null
@@ -0,0 +1,23 @@
+/** @file\r
+  Intel FSP Hob Guid definition from Intel Firmware Support Package External\r
+  Architecture Specification v2.0.\r
+\r
+  Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef __GUID_HOB_FSP_EAS_GUID__\r
+#define __GUID_HOB_FSP_EAS_GUID__\r
+\r
+extern EFI_GUID gFspBootLoaderTolumHobGuid;\r
+extern EFI_GUID gFspReservedMemoryResourceHobGuid;\r
+extern EFI_GUID gFspNonVolatileStorageHobGuid;\r
+\r
+#endif\r
diff --git a/IntelFsp2Pkg/Include/Library/CacheAsRamLib.h b/IntelFsp2Pkg/Include/Library/CacheAsRamLib.h
new file mode 100644 (file)
index 0000000..6f3d068
--- /dev/null
@@ -0,0 +1,30 @@
+/** @file\r
+\r
+  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _CACHE_AS_RAM_LIB_H_\r
+#define _CACHE_AS_RAM_LIB_H_\r
+\r
+/**\r
+  This function disable CAR.\r
+\r
+  @param[in] DisableCar       TRUE means use INVD, FALSE means use WBINVD\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+DisableCacheAsRam (\r
+  IN BOOLEAN                   DisableCar\r
+  );\r
+\r
+#endif\r
+\r
diff --git a/IntelFsp2Pkg/Include/Library/CacheLib.h b/IntelFsp2Pkg/Include/Library/CacheLib.h
new file mode 100644 (file)
index 0000000..909ae92
--- /dev/null
@@ -0,0 +1,62 @@
+/** @file\r
+\r
+  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _CACHE_LIB_H_\r
+#define _CACHE_LIB_H_\r
+\r
+//\r
+// EFI_MEMORY_CACHE_TYPE\r
+//\r
+typedef INT32 EFI_MEMORY_CACHE_TYPE;\r
+\r
+#define EFI_CACHE_UNCACHEABLE                 0\r
+#define EFI_CACHE_WRITECOMBINING              1\r
+#define EFI_CACHE_WRITETHROUGH                4\r
+#define EFI_CACHE_WRITEPROTECTED              5\r
+#define EFI_CACHE_WRITEBACK                   6\r
+\r
+/**\r
+ Reset all the MTRRs to a known state.\r
+\r
+  @retval  EFI_SUCCESS All MTRRs have been reset successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+ResetCacheAttributes (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Given the memory range and cache type, programs the MTRRs.\r
+\r
+  @param[in] MemoryAddress           Base Address of Memory to program MTRR.\r
+  @param[in] MemoryLength            Length of Memory to program MTRR.\r
+  @param[in] MemoryCacheType         Cache Type.\r
+\r
+  @retval EFI_SUCCESS            Mtrr are set successfully.\r
+  @retval EFI_LOAD_ERROR         No empty MTRRs to use.\r
+  @retval EFI_INVALID_PARAMETER  The input parameter is not valid.\r
+  @retval others                 An error occurs when setting MTTR.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SetCacheAttributes (\r
+  IN  EFI_PHYSICAL_ADDRESS      MemoryAddress,\r
+  IN  UINT64                    MemoryLength,\r
+  IN  EFI_MEMORY_CACHE_TYPE     MemoryCacheType\r
+  );\r
+\r
+#endif\r
+\r
diff --git a/IntelFsp2Pkg/Include/Library/DebugDeviceLib.h b/IntelFsp2Pkg/Include/Library/DebugDeviceLib.h
new file mode 100644 (file)
index 0000000..5c35eda
--- /dev/null
@@ -0,0 +1,29 @@
+/** @file\r
+\r
+  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef __DEBUG_DEVICE_LIB_H__\r
+#define __DEBUG_DEVICE_LIB_H__\r
+\r
+/**\r
+  Returns the debug print device enable state.\r
+\r
+  @return  Debug print device enable state.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+GetDebugPrintDeviceEnable (\r
+  VOID\r
+  );\r
+\r
+#endif\r
diff --git a/IntelFsp2Pkg/Include/Library/FspCommonLib.h b/IntelFsp2Pkg/Include/Library/FspCommonLib.h
new file mode 100644 (file)
index 0000000..0bb0c53
--- /dev/null
@@ -0,0 +1,312 @@
+/** @file\r
+\r
+  Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _FSP_COMMON_LIB_H_\r
+#define _FSP_COMMON_LIB_H_\r
+\r
+#include <FspGlobalData.h>\r
+#include <FspMeasurePointId.h>\r
+\r
+/**\r
+  This function sets the FSP global data pointer.\r
+\r
+  @param[in] FspData       Fsp global data pointer.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFspGlobalDataPointer (\r
+  IN FSP_GLOBAL_DATA   *FspData\r
+  );\r
+\r
+/**\r
+  This function gets the FSP global data pointer.\r
+\r
+**/\r
+FSP_GLOBAL_DATA *\r
+EFIAPI\r
+GetFspGlobalDataPointer (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function gets back the FSP API first parameter passed by the bootlaoder.\r
+\r
+  @retval ApiParameter FSP API first parameter passed by the bootlaoder.\r
+**/\r
+UINT32\r
+EFIAPI\r
+GetFspApiParameter (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function gets back the FSP API second parameter passed by the bootlaoder.\r
+\r
+  @retval ApiParameter FSP API second parameter passed by the bootlaoder.\r
+**/\r
+UINT32\r
+EFIAPI\r
+GetFspApiParameter2 (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function sets the FSP API parameter in the stack.\r
+\r
+   @param[in] Value       New parameter value.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFspApiParameter (\r
+  IN UINT32      Value\r
+  );\r
+\r
+/**\r
+  This function set the API status code returned to the BootLoader.\r
+\r
+  @param[in] ReturnStatus       Status code to return.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFspApiReturnStatus (\r
+  IN UINT32  ReturnStatus\r
+  );\r
+\r
+/**\r
+  This function sets the context switching stack to a new stack frame.\r
+\r
+  @param[in] NewStackTop       New core stack to be set.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFspCoreStackPointer (\r
+  IN VOID   *NewStackTop\r
+  );\r
+\r
+/**\r
+  This function sets the platform specific data pointer.\r
+\r
+  @param[in] PlatformData       Fsp platform specific data pointer.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFspPlatformDataPointer (\r
+  IN VOID   *PlatformData\r
+  );\r
+\r
+/**\r
+  This function gets the platform specific data pointer.\r
+\r
+   @param[in] PlatformData       Fsp platform specific data pointer.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetFspPlatformDataPointer (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function sets the UPD data pointer.\r
+\r
+  @param[in] UpdDataPtr   UPD data pointer.\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFspUpdDataPointer (\r
+  IN VOID    *UpdDataPtr\r
+  );\r
+\r
+/**\r
+  This function gets the UPD data pointer.\r
+\r
+  @return UpdDataPtr   UPD data pointer.\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetFspUpdDataPointer (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function sets the memory init UPD data pointer.\r
+\r
+  @param[in] MemoryInitUpdPtr   memory init UPD data pointer.\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFspMemoryInitUpdDataPointer (\r
+  IN VOID    *MemoryInitUpdPtr\r
+  );\r
+\r
+/**\r
+  This function gets the memory init UPD data pointer.\r
+\r
+  @return memory init UPD data pointer.\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetFspMemoryInitUpdDataPointer (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function sets the silicon init UPD data pointer.\r
+\r
+  @param[in] SiliconInitUpdPtr   silicon init UPD data pointer.\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFspSiliconInitUpdDataPointer (\r
+  IN VOID    *SiliconInitUpdPtr\r
+  );\r
+\r
+/**\r
+  This function gets the silicon init UPD data pointer.\r
+\r
+  @return silicon init UPD data pointer.\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetFspSiliconInitUpdDataPointer (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Set FSP measurement point timestamp.\r
+\r
+  @param[in] Id       Measurement point ID.\r
+\r
+  @return performance timestamp.\r
+**/\r
+UINT64\r
+EFIAPI\r
+SetFspMeasurePoint (\r
+  IN UINT8  Id\r
+  );\r
+\r
+/**\r
+  This function gets the FSP info header pointer.\r
+\r
+  @retval FspInfoHeader   FSP info header pointer\r
+**/\r
+FSP_INFO_HEADER *\r
+EFIAPI\r
+GetFspInfoHeader (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function sets the FSP info header pointer.\r
+\r
+  @param[in] FspInfoHeader   FSP info header pointer\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFspInfoHeader (\r
+  FSP_INFO_HEADER *FspInfoHeader\r
+  );\r
+\r
+/**\r
+  This function gets the FSP info header pointer from the API context.\r
+\r
+  @retval FspInfoHeader   FSP info header pointer\r
+**/\r
+FSP_INFO_HEADER *\r
+EFIAPI\r
+GetFspInfoHeaderFromApiContext (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function gets the VPD data pointer.\r
+\r
+  @return VpdDataRgnPtr   VPD data pointer.\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetFspVpdDataPointer (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function gets FSP API calling mode.\r
+\r
+  @retval API calling mode\r
+**/\r
+UINT8\r
+EFIAPI\r
+GetFspApiCallingIndex (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function sets FSP API calling mode.\r
+\r
+  @param[in] Index     API calling index\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFspApiCallingIndex (\r
+  UINT8  Index\r
+  );\r
+\r
+/**\r
+  This function gets FSP Phase StatusCode.\r
+  \r
+  @retval StatusCode\r
+**/\r
+UINT32\r
+EFIAPI\r
+GetPhaseStatusCode (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  This function sets FSP Phase StatusCode.\r
+\r
+  @param[in] Mode     Phase StatusCode\r
+**/\r
+VOID\r
+EFIAPI\r
+SetPhaseStatusCode (\r
+  UINT32  StatusCode\r
+  );\r
+\r
+/**\r
+  This function gets FSP CAR base.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+GetFspCarBase (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function gets FSP CAR size.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+GetFspCarSize (\r
+  VOID\r
+  );\r
+\r
+#endif\r
diff --git a/IntelFsp2Pkg/Include/Library/FspPlatformLib.h b/IntelFsp2Pkg/Include/Library/FspPlatformLib.h
new file mode 100644 (file)
index 0000000..9247bd5
--- /dev/null
@@ -0,0 +1,105 @@
+/** @file\r
+\r
+  Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _FSP_PLATFORM_LIB_H_\r
+#define _FSP_PLATFORM_LIB_H_\r
+\r
+/**\r
+  Get system memory resource descriptor by owner.\r
+\r
+  @param[in] OwnerGuid   resource owner guid\r
+**/\r
+EFI_HOB_RESOURCE_DESCRIPTOR *\r
+EFIAPI\r
+FspGetResourceDescriptorByOwner (\r
+  IN EFI_GUID   *OwnerGuid\r
+  );\r
+\r
+/**\r
+  Get system memory from HOB.\r
+\r
+  @param[in,out] LowMemoryLength   less than 4G memory length\r
+  @param[in,out] HighMemoryLength  greater than 4G memory length\r
+**/\r
+VOID\r
+EFIAPI\r
+FspGetSystemMemorySize (\r
+  IN OUT UINT64              *LowMemoryLength,\r
+  IN OUT UINT64              *HighMemoryLength\r
+  );\r
+\r
+/**\r
+  Migrate BootLoader data before destroying CAR.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+FspMigrateTemporaryMemory (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Set a new stack frame for the continuation function.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+FspSetNewStackFrame (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function transfer control back to BootLoader after FspSiliconInit.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+FspSiliconInitDone (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function returns control to BootLoader after MemoryInitApi.\r
+\r
+  @param[in,out] HobListPtr The address of HobList pointer.\r
+**/\r
+VOID\r
+EFIAPI\r
+FspMemoryInitDone (\r
+  IN OUT VOID   **HobListPtr\r
+  );\r
+\r
+/**\r
+  This function returns control to BootLoader after TempRamExitApi.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+FspTempRamExitDone (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function handle NotifyPhase API call from the BootLoader.\r
+  It gives control back to the BootLoader after it is handled. If the\r
+  Notification code is a ReadyToBoot event, this function will return\r
+  and FSP continues the remaining execution until it reaches the DxeIpl.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+FspWaitForNotify (\r
+  VOID\r
+  );\r
+\r
+#endif\r
diff --git a/IntelFsp2Pkg/Include/Library/FspSecPlatformLib.h b/IntelFsp2Pkg/Include/Library/FspSecPlatformLib.h
new file mode 100644 (file)
index 0000000..cf2b0ff
--- /dev/null
@@ -0,0 +1,88 @@
+/** @file\r
+\r
+  Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _FSP_SEC_PLATFORM_LIB_H_\r
+#define _FSP_SEC_PLATFORM_LIB_H_\r
+\r
+/**\r
+  This function performs platform level initialization.\r
+\r
+  This function must be in ASM file, because stack is not established yet.\r
+  This function is optional. If a library instance does not provide this function, the default empty one will be used.\r
+\r
+  The callee should not use XMM6/XMM7.\r
+  The return address is saved in MM7.\r
+\r
+  @retval in saved in EAX - 0 means platform initialization success.\r
+                            other means platform initialization fail.\r
+**/\r
+UINT32\r
+EFIAPI\r
+SecPlatformInit (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function loads Microcode.\r
+\r
+  This function must be in ASM file, because stack is not established yet.\r
+  This function is optional. If a library instance does not provide this function, the default one will be used.\r
+\r
+  The callee should not use XMM6/XMM7.\r
+  The return address is saved in MM7.\r
+\r
+  @param[in] FsptUpdDataPtr     Address pointer to the FSPT_UPD data structure. It is saved in ESP.\r
+\r
+  @retval in saved in EAX - 0 means Microcode is loaded successfully.\r
+                            other means Microcode is not loaded successfully.\r
+**/\r
+UINT32\r
+EFIAPI\r
+LoadMicrocode (\r
+  IN  VOID    *FsptUpdDataPtr\r
+  );\r
+\r
+/**\r
+  This function initializes the CAR.\r
+\r
+  This function must be in ASM file, because stack is not established yet.\r
+\r
+  The callee should not use XMM6/XMM7.\r
+  The return address is saved in MM7.\r
+\r
+  @param[in] FsptUpdDataPtr     Address pointer to the FSPT_UPD data structure. It is saved in ESP.\r
+\r
+  @retval in saved in EAX - 0 means CAR initialization success.\r
+                            other means CAR initialization fail.\r
+**/\r
+UINT32\r
+EFIAPI\r
+SecCarInit (\r
+  IN  VOID    *FsptUpdDataPtr\r
+  );\r
+\r
+/**\r
+  This function check the signture of UPD.\r
+\r
+  @param[in]  ApiIdx           Internal index of the FSP API.\r
+  @param[in]  ApiParam         Parameter of the FSP API.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+FspUpdSignatureCheck (\r
+  IN UINT32   ApiIdx,\r
+  IN VOID     *ApiParam\r
+  );\r
+\r
+#endif\r
diff --git a/IntelFsp2Pkg/Include/Library/FspSwitchStackLib.h b/IntelFsp2Pkg/Include/Library/FspSwitchStackLib.h
new file mode 100644 (file)
index 0000000..e90b13e
--- /dev/null
@@ -0,0 +1,45 @@
+/** @file\r
+\r
+  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _FSP_SWITCH_STACK_LIB_H_\r
+#define _FSP_SWITCH_STACK_LIB_H_\r
+\r
+/**\r
+\r
+  This funciton will switch the current stack to the previous saved stack.\r
+  Before calling the previous stack has to be set in  FSP_GLOBAL_DATA.CoreStack.\r
+                    EIP\r
+                    FLAGS  16 bit  FLAGS  16 bit\r
+                    EDI\r
+                    ESI\r
+                    EBP\r
+                    ESP\r
+                    EBX\r
+                    EDX\r
+                    ECX\r
+                    EAX\r
+                    DWORD     IDT base1\r
+  StackPointer:     DWORD     IDT base2\r
+\r
+  @return ReturnKey          After switching to the saved stack,\r
+                             this value will be saved in eax before returning.\r
+\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+Pei2LoaderSwitchStack (\r
+  VOID\r
+  );\r
+\r
+#endif\r
diff --git a/IntelFsp2Pkg/IntelFsp2Pkg.dec b/IntelFsp2Pkg/IntelFsp2Pkg.dec
new file mode 100644 (file)
index 0000000..52024af
--- /dev/null
@@ -0,0 +1,80 @@
+## @file\r
+# Provides driver and definitions to build fsp in EDKII bios.\r
+#\r
+# Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
+# This program and the accompanying materials are licensed and made available under\r
+# the terms and conditions of the BSD License that accompanies this distribution.\r
+# The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php.\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+##\r
+\r
+[Defines]\r
+  DEC_SPECIFICATION              = 0x00010005\r
+  PACKAGE_NAME                   = IntelFsp2Pkg\r
+  PACKAGE_GUID                   = A8C53B5E-D556-4F3E-874D-0D6FA2CDC7BF\r
+  PACKAGE_VERSION                = 0.1\r
+\r
+[Includes]\r
+  Include\r
+  \r
+[LibraryClasses]\r
+  ##  @libraryclass  Provides cache-as-ram support.\r
+  CacheAsRamLib|Include/Library/CacheAsRamLib.h\r
+\r
+  ##  @libraryclass  Provides cache setting on MTRR.\r
+  CacheLib|Include/Library/CacheLib.h\r
+\r
+  ##  @libraryclass  Provides debug device abstraction.\r
+  DebugDeviceLib|Include/Library/DebugDeviceLib.h\r
+\r
+  ##  @libraryclass  Provides FSP related services.\r
+  FspCommonLib|Include/Library/FspCommonLib.h\r
+\r
+  ##  @libraryclass  Provides FSP platform related actions.\r
+  FspPlatformLib|Include/Library/FspPlatformLib.h\r
+\r
+  ##  @libraryclass  Provides FSP switch stack function.\r
+  FspSwitchStackLib|Include/Library/FspSwitchStackLib.h\r
+  \r
+  ##  @libraryclass  Provides FSP platform sec related actions.\r
+  FspSecPlatformLib|Include/Library/FspSecPlatformLib.h\r
+\r
+[Guids]\r
+  #\r
+  # GUID defined in package\r
+  #\r
+  gIntelFsp2PkgTokenSpaceGuid           = { 0xed6e0531, 0xf715, 0x4a3d, { 0x9b, 0x12, 0xc1, 0xca, 0x5e, 0xf6, 0x98, 0xa2 } }\r
+\r
+  # Guid define in FSP EAS\r
+  gFspHeaderFileGuid                    = { 0x912740BE, 0x2284, 0x4734, { 0xB9, 0x71, 0x84, 0xB0, 0x27, 0x35, 0x3F, 0x0C } }\r
+  gFspReservedMemoryResourceHobGuid     = { 0x69a79759, 0x1373, 0x4367, { 0xa6, 0xc4, 0xc7, 0xf5, 0x9e, 0xfd, 0x98, 0x6e } }\r
+  gFspNonVolatileStorageHobGuid         = { 0x721acf02, 0x4d77, 0x4c2a, { 0xb3, 0xdc, 0x27, 0x0b, 0x7b, 0xa9, 0xe4, 0xb0 } }\r
+  gFspBootLoaderTolumHobGuid            = { 0x73ff4f56, 0xaa8e, 0x4451, { 0xb3, 0x16, 0x36, 0x35, 0x36, 0x67, 0xad, 0x44 } } # FSP EAS v1.1\r
+\r
+  gFspPerformanceDataGuid               = { 0x56ed21b6, 0xba23, 0x429e, { 0x89, 0x32, 0x37, 0x6d, 0x8e, 0x18, 0x2e, 0xe3 } }\r
+  gFspEventEndOfFirmwareGuid            = { 0xbd44f629, 0xeae7, 0x4198, { 0x87, 0xf1, 0x39, 0xfa, 0xb0, 0xfd, 0x71, 0x7e } }\r
+\r
+[PcdsFixedAtBuild]\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdGlobalDataPointerAddress |0xFED00108|UINT32|0x00000001\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdTemporaryRamBase         |0xFEF00000|UINT32|0x10001001\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdTemporaryRamSize         |    0x2000|UINT32|0x10001002\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspTemporaryRamSize      |    0x1000|UINT32|0x10001003\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspReservedBufferSize    |     0x100|UINT32|0x10001004\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspMaxPerfEntry          |        32|UINT32|0x00002001\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspMaxPatchEntry         |         6|UINT32|0x00002002\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspAreaBaseAddress       |0xFFF80000|UINT32|0x10000001\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspAreaSize              |0x00040000|UINT32|0x10000002\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspBootFirmwareVolumeBase|0xFFF80000|UINT32|0x10000003\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspHeaderSpecVersion     |      0x20| UINT8|0x00000002\r
+\r
+  # x % of FSP temporary memory will be used for heap\r
+  # (100 - x) % of FSP temporary memory will be used for stack\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspHeapSizePercentage    |        50| UINT8|0x10000004\r
+  \r
+[PcdsFixedAtBuild,PcdsDynamic,PcdsDynamicEx]\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspReservedMemoryLength |0x00100000|UINT32|0x46530000\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdBootLoaderEntry         |0xFFFFFFE4|UINT32|0x46530100\r
diff --git a/IntelFsp2Pkg/IntelFsp2Pkg.dsc b/IntelFsp2Pkg/IntelFsp2Pkg.dsc
new file mode 100644 (file)
index 0000000..3b50bbf
--- /dev/null
@@ -0,0 +1,77 @@
+## @file\r
+# Provides driver and definitions to build fsp.\r
+#\r
+# Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
+# This program and the accompanying materials are licensed and made available under\r
+# the terms and conditions of the BSD License that accompanies this distribution.\r
+# The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php.\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+##\r
+\r
+[Defines]\r
+  PLATFORM_NAME                  = IntelFsp2Pkg\r
+  PLATFORM_GUID                  = 55CA3D18-831B-469A-A1C3-7AE719EB6A97\r
+  PLATFORM_VERSION               = 0.1\r
+  DSC_SPECIFICATION              = 0x00010005\r
+  OUTPUT_DIRECTORY               = Build/IntelFsp2Pkg\r
+  SUPPORTED_ARCHITECTURES        = IA32\r
+  BUILD_TARGETS                  = DEBUG|RELEASE|NOOPT\r
+  SKUID_IDENTIFIER               = DEFAULT\r
+\r
+[LibraryClasses]\r
+  BaseLib|MdePkg/Library/BaseLib/BaseLib.inf\r
+  BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf\r
+  PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf\r
+  PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf\r
+  DebugPrintErrorLevelLib|MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib.inf\r
+  PciCf8Lib|MdePkg/Library/BasePciCf8Lib/BasePciCf8Lib.inf\r
+  IoLib|MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf\r
+  UefiDecompressLib|MdePkg/Library/BaseUefiDecompressLib/BaseUefiDecompressLib.inf\r
+\r
+  ReportStatusCodeLib|MdePkg/Library/BaseReportStatusCodeLibNull/BaseReportStatusCodeLibNull.inf\r
+  PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf\r
+  SerialPortLib|MdePkg/Library/BaseSerialPortLibNull/BaseSerialPortLibNull.inf\r
+  ReportStatusCodeLib|MdePkg/Library/BaseReportStatusCodeLibNull/BaseReportStatusCodeLibNull.inf\r
+  DebugDeviceLib|IntelFsp2Pkg/Library/BaseDebugDeviceLibNull/BaseDebugDeviceLibNull.inf\r
+\r
+  # FSP override\r
+  DebugLib|IntelFsp2Pkg/Library/BaseFspDebugLibSerialPort/BaseFspDebugLibSerialPort.inf\r
+\r
+  # FSP specific lib\r
+  CacheAsRamLib|IntelFsp2Pkg/Library/BaseCacheAsRamLibNull/BaseCacheAsRamLibNull.inf\r
+  CacheLib|IntelFsp2Pkg/Library/BaseCacheLib/BaseCacheLib.inf\r
+  FspCommonLib|IntelFsp2Pkg/Library/BaseFspCommonLib/BaseFspCommonLib.inf\r
+  FspPlatformLib|IntelFsp2Pkg/Library/BaseFspPlatformLib/BaseFspPlatformLib.inf\r
+  FspSwitchStackLib|IntelFsp2Pkg/Library/BaseFspSwitchStackLib/BaseFspSwitchStackLib.inf\r
+  FspSecPlatformLib|IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/SecFspSecPlatformLibNull.inf\r
+\r
+[LibraryClasses.common.PEIM]\r
+  PeimEntryPoint|MdePkg/Library/PeimEntryPoint/PeimEntryPoint.inf\r
+  PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf\r
+  PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf\r
+  MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf\r
+  ExtractGuidedSectionLib|MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.inf\r
+\r
+  HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf\r
+\r
+[Components]\r
+  IntelFsp2Pkg/Library/BaseCacheAsRamLibNull/BaseCacheAsRamLibNull.inf\r
+  IntelFsp2Pkg/Library/BaseCacheLib/BaseCacheLib.inf\r
+  IntelFsp2Pkg/Library/BaseFspCommonLib/BaseFspCommonLib.inf\r
+  IntelFsp2Pkg/Library/BaseFspDebugLibSerialPort/BaseFspDebugLibSerialPort.inf\r
+  IntelFsp2Pkg/Library/BaseFspPlatformLib/BaseFspPlatformLib.inf\r
+  IntelFsp2Pkg/Library/BaseFspSwitchStackLib/BaseFspSwitchStackLib.inf\r
+\r
+  IntelFsp2Pkg/FspSecCore/FspSecCoreT.inf\r
+  IntelFsp2Pkg/FspSecCore/FspSecCoreM.inf\r
+  IntelFsp2Pkg/FspSecCore/FspSecCoreS.inf\r
+  IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.inf\r
+\r
+[PcdsFixedAtBuild.common]\r
+  gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x1f\r
+  gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80080046\r
+  gEfiMdePkgTokenSpaceGuid.PcdReportStatusCodePropertyMask|0x07\r
diff --git a/IntelFsp2Pkg/Library/BaseCacheAsRamLibNull/BaseCacheAsRamLibNull.inf b/IntelFsp2Pkg/Library/BaseCacheAsRamLibNull/BaseCacheAsRamLibNull.inf
new file mode 100644 (file)
index 0000000..bdb6744
--- /dev/null
@@ -0,0 +1,31 @@
+## @file\r
+#  NULL instance of Base cache as RAM.\r
+#\r
+#  Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>\r
+#\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution. The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php.\r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+##\r
+\r
+[defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = BaseCacheAsRamLibNull\r
+  FILE_GUID                      = 630AEB10-2106-4234-9DB3-836A3663F50D\r
+  MODULE_TYPE                    = BASE\r
+  VERSION_STRING                 = 1.0\r
+  LIBRARY_CLASS                  = CacheAsRamLib\r
+\r
+[sources.common]\r
+  DisableCacheAsRamNull.c\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  IntelFsp2Pkg/IntelFsp2Pkg.dec\r
+\r
+[LibraryClasses]\r
+\r
diff --git a/IntelFsp2Pkg/Library/BaseCacheAsRamLibNull/DisableCacheAsRamNull.c b/IntelFsp2Pkg/Library/BaseCacheAsRamLibNull/DisableCacheAsRamNull.c
new file mode 100644 (file)
index 0000000..9b45163
--- /dev/null
@@ -0,0 +1,41 @@
+/** @file\r
+\r
+  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <Uefi.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/CacheAsRamLib.h>\r
+\r
+/**\r
+  This function disable CAR.\r
+\r
+  @param[in] DisableCar       TRUE means use INVD, FALSE means use WBINVD\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+DisableCacheAsRam (\r
+  IN BOOLEAN                   DisableCar\r
+  )\r
+{\r
+  //\r
+  // Disable CAR\r
+  //\r
+\r
+  if (DisableCar) {\r
+    AsmInvd ();\r
+  } else {\r
+    AsmWbinvd();\r
+  }\r
+\r
+  return ;\r
+}\r
diff --git a/IntelFsp2Pkg/Library/BaseCacheLib/BaseCacheLib.inf b/IntelFsp2Pkg/Library/BaseCacheLib/BaseCacheLib.inf
new file mode 100644 (file)
index 0000000..7b026b1
--- /dev/null
@@ -0,0 +1,34 @@
+## @file\r
+#  Instance of BaseCache.\r
+#\r
+#  Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>\r
+#\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution. The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php.\r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+##\r
+\r
+[defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = BaseCacheLib\r
+  FILE_GUID                      = 8EF3A653-DA8B-4FFA-BB85-FF47406DB9F0\r
+  MODULE_TYPE                    = BASE\r
+  VERSION_STRING                 = 1.0\r
+  LIBRARY_CLASS                  = CacheLib\r
+\r
+[sources.IA32]\r
+  CacheLib.c\r
+  CacheLibInternal.h\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  IntelFsp2Pkg/IntelFsp2Pkg.dec\r
+\r
+[LibraryClasses]\r
+  BaseMemoryLib\r
+  CacheAsRamLib\r
+\r
diff --git a/IntelFsp2Pkg/Library/BaseCacheLib/CacheLib.c b/IntelFsp2Pkg/Library/BaseCacheLib/CacheLib.c
new file mode 100644 (file)
index 0000000..b38dce3
--- /dev/null
@@ -0,0 +1,703 @@
+/** @file\r
+\r
+  Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <Uefi.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/CacheLib.h>\r
+#include <Library/CacheAsRamLib.h>\r
+#include "CacheLibInternal.h"\r
+\r
+/**\r
+  Search the memory cache type for specific memory from MTRR.\r
+\r
+  @param[in]  MemoryAddress         the address of target memory\r
+  @param[in]  MemoryLength          the length of target memory\r
+  @param[in]  ValidMtrrAddressMask  the MTRR address mask\r
+  @param[out] UsedMsrNum            the used MSR number\r
+  @param[out] UsedMemoryCacheType   the cache type for the target memory\r
+\r
+  @retval EFI_SUCCESS    The memory is found in MTRR and cache type is returned\r
+  @retval EFI_NOT_FOUND  The memory is not found in MTRR\r
+\r
+**/\r
+EFI_STATUS\r
+SearchForExactMtrr (\r
+  IN  EFI_PHYSICAL_ADDRESS      MemoryAddress,\r
+  IN  UINT64                    MemoryLength,\r
+  IN  UINT64                    ValidMtrrAddressMask,\r
+  OUT UINT32                    *UsedMsrNum,\r
+  OUT EFI_MEMORY_CACHE_TYPE     *MemoryCacheType\r
+  );\r
+\r
+/**\r
+  Check if CacheType match current default setting.\r
+\r
+  @param[in] MemoryCacheType  input cache type to be checked.\r
+\r
+  @retval TRUE MemoryCacheType is default MTRR setting.\r
+  @retval FALSE MemoryCacheType is NOT default MTRR setting.\r
+**/\r
+BOOLEAN\r
+IsDefaultType (\r
+  IN  EFI_MEMORY_CACHE_TYPE     MemoryCacheType\r
+  );\r
+\r
+/**\r
+  Return MTRR alignment requirement for base address and size.\r
+\r
+  @param[in]  BaseAddress     Base address.\r
+  @param[in]  Size            Size.\r
+\r
+  @retval Zero      Alligned.\r
+  @retval Non-Zero  Not alligned.\r
+\r
+**/\r
+UINT32\r
+CheckMtrrAlignment (\r
+  IN  UINT64                    BaseAddress,\r
+  IN  UINT64                    Size\r
+  );\r
+\r
+typedef struct {\r
+  UINT32    Msr;\r
+  UINT32    BaseAddress;\r
+  UINT32    Length;\r
+} EFI_FIXED_MTRR;\r
+\r
+EFI_FIXED_MTRR mFixedMtrrTable[] = {\r
+  { EFI_MSR_IA32_MTRR_FIX64K_00000, 0,       0x10000},\r
+  { EFI_MSR_IA32_MTRR_FIX16K_80000, 0x80000, 0x4000},\r
+  { EFI_MSR_IA32_MTRR_FIX16K_A0000, 0xA0000, 0x4000},\r
+  { EFI_MSR_IA32_MTRR_FIX4K_C0000,  0xC0000, 0x1000},\r
+  { EFI_MSR_IA32_MTRR_FIX4K_C8000,  0xC8000, 0x1000},\r
+  { EFI_MSR_IA32_MTRR_FIX4K_D0000,  0xD0000, 0x1000},\r
+  { EFI_MSR_IA32_MTRR_FIX4K_D8000,  0xD8000, 0x1000},\r
+  { EFI_MSR_IA32_MTRR_FIX4K_E0000,  0xE0000, 0x1000},\r
+  { EFI_MSR_IA32_MTRR_FIX4K_E8000,  0xE8000, 0x1000},\r
+  { EFI_MSR_IA32_MTRR_FIX4K_F0000,  0xF0000, 0x1000},\r
+  { EFI_MSR_IA32_MTRR_FIX4K_F8000,  0xF8000, 0x1000}\r
+};\r
+\r
+/**\r
+  Given the input, check if the number of MTRR is lesser.\r
+  if positive or subtractive.\r
+\r
+  @param[in]  Input   Length of Memory to program MTRR.\r
+\r
+  @retval  Zero      do positive.\r
+  @retval  Non-Zero  do subtractive.\r
+\r
+**/\r
+INT8\r
+CheckDirection (\r
+  IN  UINT64                    Input\r
+  )\r
+{\r
+  return 0;\r
+}\r
+\r
+/**\r
+  Disable cache and its mtrr.\r
+\r
+  @param[out]  OldMtrr To return the Old MTRR value\r
+\r
+**/\r
+VOID\r
+EfiDisableCacheMtrr (\r
+  OUT UINT64                   *OldMtrr\r
+  )\r
+{\r
+  UINT64  TempQword;\r
+\r
+  //\r
+  // Disable Cache MTRR\r
+  //\r
+  *OldMtrr = AsmReadMsr64(EFI_MSR_CACHE_IA32_MTRR_DEF_TYPE);\r
+  TempQword = (*OldMtrr) & ~B_EFI_MSR_GLOBAL_MTRR_ENABLE & ~B_EFI_MSR_FIXED_MTRR_ENABLE;\r
+  AsmWriteMsr64(EFI_MSR_CACHE_IA32_MTRR_DEF_TYPE, TempQword);\r
+  AsmDisableCache ();\r
+}\r
+\r
+/**\r
+  Recover cache MTRR.\r
+\r
+  @param[in] EnableMtrr Whether to enable the MTRR\r
+  @param[in] OldMtrr    The saved old MTRR value to restore when not to enable the MTRR\r
+\r
+**/\r
+VOID\r
+EfiRecoverCacheMtrr (\r
+  IN BOOLEAN                  EnableMtrr,\r
+  IN UINT64                   OldMtrr\r
+  )\r
+{\r
+  UINT64  TempQword;\r
+\r
+  //\r
+  // Enable Cache MTRR\r
+  //\r
+  if (EnableMtrr) {\r
+    TempQword = AsmReadMsr64(EFI_MSR_CACHE_IA32_MTRR_DEF_TYPE);\r
+    TempQword |= (UINT64)(B_EFI_MSR_GLOBAL_MTRR_ENABLE | B_EFI_MSR_FIXED_MTRR_ENABLE);\r
+  } else {\r
+    TempQword = OldMtrr;\r
+  }\r
+\r
+  AsmWriteMsr64 (EFI_MSR_CACHE_IA32_MTRR_DEF_TYPE, TempQword);\r
+\r
+  AsmEnableCache ();\r
+}\r
+\r
+/**\r
+  Programming MTRR according to Memory address, length, and type.\r
+\r
+  @param[in] MtrrNumber           the variable MTRR index number\r
+  @param[in] MemoryAddress        the address of target memory\r
+  @param[in] MemoryLength         the length of target memory\r
+  @param[in] MemoryCacheType      the cache type of target memory\r
+  @param[in] ValidMtrrAddressMask the MTRR address mask\r
+\r
+**/\r
+VOID\r
+EfiProgramMtrr (\r
+  IN  UINTN                     MtrrNumber,\r
+  IN  EFI_PHYSICAL_ADDRESS      MemoryAddress,\r
+  IN  UINT64                    MemoryLength,\r
+  IN  EFI_MEMORY_CACHE_TYPE     MemoryCacheType,\r
+  IN  UINT64                    ValidMtrrAddressMask\r
+  )\r
+{\r
+  UINT64                        TempQword;\r
+  UINT64                        OldMtrr;\r
+\r
+  if (MemoryLength == 0) {\r
+    return;\r
+  }\r
+\r
+  EfiDisableCacheMtrr (&OldMtrr);\r
+\r
+  //\r
+  // MTRR Physical Base\r
+  //\r
+  TempQword = (MemoryAddress & ValidMtrrAddressMask) | MemoryCacheType;\r
+  AsmWriteMsr64 (MtrrNumber, TempQword);\r
+\r
+  //\r
+  // MTRR Physical Mask\r
+  //\r
+  TempQword = ~(MemoryLength - 1);\r
+  AsmWriteMsr64 (MtrrNumber + 1, (TempQword & ValidMtrrAddressMask) | B_EFI_MSR_CACHE_MTRR_VALID);\r
+\r
+  EfiRecoverCacheMtrr (TRUE, OldMtrr);\r
+}\r
+\r
+/**\r
+  Calculate the maximum value which is a power of 2, but less the MemoryLength.\r
+\r
+  @param[in]  MemoryAddress       Memory address.\r
+  @param[in]  MemoryLength        The number to pass in.\r
+\r
+  @return The maximum value which is align to power of 2 and less the MemoryLength\r
+\r
+**/\r
+UINT64\r
+Power2MaxMemory (\r
+  IN UINT64                 MemoryAddress,\r
+  IN UINT64                 MemoryLength\r
+  )\r
+{\r
+  UINT64                    Result;\r
+\r
+  if (MemoryLength == 0) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  //\r
+  // Compute inital power of 2 size to return\r
+  //\r
+  Result = GetPowerOfTwo64(MemoryLength);\r
+\r
+  //\r
+  // Special case base of 0 as all ranges are valid\r
+  //\r
+  if (MemoryAddress == 0) {\r
+    return Result;\r
+  }\r
+\r
+  //\r
+  // Loop till a value that can be mapped to this base address is found\r
+  //\r
+  while (CheckMtrrAlignment (MemoryAddress, Result) != 0) {\r
+    //\r
+    // Need to try the next smaller power of 2\r
+    //\r
+    Result = RShiftU64 (Result, 1);\r
+  }\r
+\r
+  return Result;\r
+}\r
+\r
+/**\r
+  Return MTRR alignment requirement for base address and size.\r
+\r
+  @param[in]  BaseAddress     Base address.\r
+  @param[in]  Size            Size.\r
+\r
+  @retval Zero      Alligned.\r
+  @retval Non-Zero  Not alligned.\r
+\r
+**/\r
+UINT32\r
+CheckMtrrAlignment (\r
+  IN  UINT64    BaseAddress,\r
+  IN  UINT64    Size\r
+  )\r
+{\r
+  UINT32      ShiftedBase;\r
+  UINT32      ShiftedSize;\r
+\r
+  //\r
+  // Shift base and size right 12 bits to allow for larger memory sizes.  The\r
+  // MTRRs do not use the first 12 bits so this is safe for now.  Only supports\r
+  // up to 52 bits of physical address space.\r
+  //\r
+  ShiftedBase = (UINT32) RShiftU64 (BaseAddress, 12);\r
+  ShiftedSize = (UINT32) RShiftU64 (Size, 12);\r
+\r
+  //\r
+  // Return the results to the caller of the MOD\r
+  //\r
+  return ShiftedBase % ShiftedSize;\r
+}\r
+\r
+/**\r
+  Programs fixed MTRRs registers.\r
+\r
+  @param[in]  MemoryCacheType  The memory type to set.\r
+  @param[in]  Base             The base address of memory range.\r
+  @param[in]  Length           The length of memory range.\r
+\r
+  @retval RETURN_SUCCESS      The cache type was updated successfully\r
+  @retval RETURN_UNSUPPORTED  The requested range or cache type was invalid\r
+                              for the fixed MTRRs.\r
+\r
+**/\r
+EFI_STATUS\r
+ProgramFixedMtrr (\r
+  IN  EFI_MEMORY_CACHE_TYPE     MemoryCacheType,\r
+  IN  UINT64                    *Base,\r
+  IN  UINT64                    *Len\r
+  )\r
+{\r
+  UINT32                      MsrNum;\r
+  UINT32                      ByteShift;\r
+  UINT64                      TempQword;\r
+  UINT64                      OrMask;\r
+  UINT64                      ClearMask;\r
+\r
+  TempQword = 0;\r
+  OrMask =  0;\r
+  ClearMask = 0;\r
+\r
+  for (MsrNum = 0; MsrNum < V_EFI_FIXED_MTRR_NUMBER; MsrNum++) {\r
+    if ((*Base >= mFixedMtrrTable[MsrNum].BaseAddress) &&\r
+        (*Base < (mFixedMtrrTable[MsrNum].BaseAddress + 8 * mFixedMtrrTable[MsrNum].Length))) {\r
+      break;\r
+    }\r
+  }\r
+  if (MsrNum == V_EFI_FIXED_MTRR_NUMBER ) {\r
+    return EFI_DEVICE_ERROR;\r
+  }\r
+  //\r
+  // We found the fixed MTRR to be programmed\r
+  //\r
+  for (ByteShift=0; ByteShift < 8; ByteShift++) {\r
+    if ( *Base == (mFixedMtrrTable[MsrNum].BaseAddress + ByteShift * mFixedMtrrTable[MsrNum].Length)) {\r
+      break;\r
+    }\r
+  }\r
+  if (ByteShift == 8 ) {\r
+    return EFI_DEVICE_ERROR;\r
+  }\r
+  for (; ((ByteShift<8) && (*Len >= mFixedMtrrTable[MsrNum].Length));ByteShift++) {\r
+    OrMask |= LShiftU64((UINT64) MemoryCacheType, (UINT32) (ByteShift* 8));\r
+    ClearMask |= LShiftU64((UINT64) 0xFF, (UINT32) (ByteShift * 8));\r
+    *Len -= mFixedMtrrTable[MsrNum].Length;\r
+    *Base += mFixedMtrrTable[MsrNum].Length;\r
+  }\r
+  TempQword = (AsmReadMsr64 (mFixedMtrrTable[MsrNum].Msr) & (~ClearMask)) | OrMask;\r
+  AsmWriteMsr64 (mFixedMtrrTable[MsrNum].Msr, TempQword);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Check if there is a valid variable MTRR that overlaps the given range.\r
+\r
+  @param[in]  Start  Base Address of the range to check.\r
+  @param[in]  End    End address of the range to check.\r
+\r
+  @retval TRUE   Mtrr overlap.\r
+  @retval FALSE  Mtrr not overlap.\r
+**/\r
+BOOLEAN\r
+CheckMtrrOverlap (\r
+  IN  EFI_PHYSICAL_ADDRESS      Start,\r
+  IN  EFI_PHYSICAL_ADDRESS      End\r
+  )\r
+{\r
+  return FALSE;\r
+}\r
+\r
+/**\r
+  Given the memory range and cache type, programs the MTRRs.\r
+\r
+  @param[in] MemoryAddress           Base Address of Memory to program MTRR.\r
+  @param[in] MemoryLength            Length of Memory to program MTRR.\r
+  @param[in] MemoryCacheType         Cache Type.\r
+\r
+  @retval EFI_SUCCESS            Mtrr are set successfully.\r
+  @retval EFI_LOAD_ERROR         No empty MTRRs to use.\r
+  @retval EFI_INVALID_PARAMETER  The input parameter is not valid.\r
+  @retval others                 An error occurs when setting MTTR.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SetCacheAttributes (\r
+  IN  EFI_PHYSICAL_ADDRESS      MemoryAddress,\r
+  IN  UINT64                    MemoryLength,\r
+  IN  EFI_MEMORY_CACHE_TYPE     MemoryCacheType\r
+  )\r
+{\r
+  EFI_STATUS            Status;\r
+  UINT32                MsrNum, MsrNumEnd;\r
+  UINT64                TempQword;\r
+  UINT32                LastVariableMtrrForBios;\r
+  UINT64                OldMtrr;\r
+  UINT32                UsedMsrNum;\r
+  EFI_MEMORY_CACHE_TYPE UsedMemoryCacheType;\r
+  UINT64                ValidMtrrAddressMask;\r
+  UINT32                Cpuid_RegEax;\r
+\r
+  AsmCpuid (CPUID_EXTENDED_FUNCTION, &Cpuid_RegEax, NULL, NULL, NULL);\r
+  if (Cpuid_RegEax >= CPUID_VIR_PHY_ADDRESS_SIZE) {\r
+    AsmCpuid (CPUID_VIR_PHY_ADDRESS_SIZE, &Cpuid_RegEax, NULL, NULL, NULL);\r
+    ValidMtrrAddressMask = (LShiftU64((UINT64) 1, (Cpuid_RegEax & 0xFF)) - 1) & (~(UINT64)0x0FFF);\r
+  } else {\r
+    ValidMtrrAddressMask = (LShiftU64((UINT64) 1, 36) - 1) & (~(UINT64)0x0FFF);\r
+  }\r
+\r
+  //\r
+  // Check for invalid parameter\r
+  //\r
+  if ((MemoryAddress & ~ValidMtrrAddressMask) != 0 || (MemoryLength & ~ValidMtrrAddressMask) != 0) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if (MemoryLength == 0) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  switch (MemoryCacheType) {\r
+    case EFI_CACHE_UNCACHEABLE:\r
+    case EFI_CACHE_WRITECOMBINING:\r
+    case EFI_CACHE_WRITETHROUGH:\r
+    case EFI_CACHE_WRITEPROTECTED:\r
+    case EFI_CACHE_WRITEBACK:\r
+      break;\r
+\r
+    default:\r
+      return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  //\r
+  // Check if Fixed MTRR\r
+  //\r
+  if ((MemoryAddress + MemoryLength) <= (1 << 20)) {\r
+    Status = EFI_SUCCESS;\r
+    EfiDisableCacheMtrr (&OldMtrr);\r
+    while ((MemoryLength > 0) && (Status == EFI_SUCCESS)) {\r
+      Status = ProgramFixedMtrr (MemoryCacheType, &MemoryAddress, &MemoryLength);\r
+    }\r
+    EfiRecoverCacheMtrr (TRUE, OldMtrr);\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Search if the range attribute has been set before\r
+  //\r
+  Status = SearchForExactMtrr(\r
+                              MemoryAddress,\r
+                              MemoryLength,\r
+                              ValidMtrrAddressMask,\r
+                              &UsedMsrNum,\r
+                              &UsedMemoryCacheType\r
+                              );\r
+\r
+  if (!EFI_ERROR(Status)) {\r
+    //\r
+    // Compare if it has the same type as current setting\r
+    //\r
+    if (UsedMemoryCacheType == MemoryCacheType) {\r
+      return EFI_SUCCESS;\r
+    } else {\r
+      //\r
+      // Different type\r
+      //\r
+\r
+      //\r
+      // Check if the set type is the same as Default Type\r
+      //\r
+      if (IsDefaultType(MemoryCacheType)) {\r
+        //\r
+        // Clear the MTRR\r
+        //\r
+        AsmWriteMsr64(UsedMsrNum, 0);\r
+        AsmWriteMsr64(UsedMsrNum + 1, 0);\r
+\r
+        return EFI_SUCCESS;\r
+      } else {\r
+        //\r
+        // Modify the MTRR type\r
+        //\r
+        EfiProgramMtrr(UsedMsrNum,\r
+                       MemoryAddress,\r
+                       MemoryLength,\r
+                       MemoryCacheType,\r
+                       ValidMtrrAddressMask\r
+                       );\r
+        return EFI_SUCCESS;\r
+      }\r
+    }\r
+  }\r
+\r
+#if 0\r
+  //\r
+  // @bug - Need to create memory map so that when checking for overlap we\r
+  //        can determine if an overlap exists based on all caching requests.\r
+  //\r
+  // Don't waste a variable MTRR if the caching attrib is same as default in MTRR_DEF_TYPE\r
+  //\r
+  if (MemoryCacheType == (AsmReadMsr64(EFI_MSR_CACHE_IA32_MTRR_DEF_TYPE) & B_EFI_MSR_CACHE_MEMORY_TYPE))  {\r
+    if (!CheckMtrrOverlap (MemoryAddress, MemoryAddress+MemoryLength-1)) {\r
+      return EFI_SUCCESS;\r
+    }\r
+  }\r
+#endif\r
+\r
+  //\r
+  // Find first unused MTRR\r
+  //\r
+  MsrNumEnd = EFI_MSR_CACHE_VARIABLE_MTRR_BASE + (2 * (UINT32)(AsmReadMsr64(EFI_MSR_IA32_MTRR_CAP) & B_EFI_MSR_IA32_MTRR_CAP_VARIABLE_SUPPORT));\r
+  for (MsrNum = EFI_MSR_CACHE_VARIABLE_MTRR_BASE; MsrNum < MsrNumEnd; MsrNum +=2) {\r
+    if ((AsmReadMsr64(MsrNum+1) & B_EFI_MSR_CACHE_MTRR_VALID) == 0 ) {\r
+      break;\r
+    }\r
+  }\r
+\r
+  //\r
+  // Reserve 1 MTRR pair for OS.\r
+  //\r
+  LastVariableMtrrForBios = MsrNumEnd - 1 - (EFI_CACHE_NUM_VAR_MTRR_PAIRS_FOR_OS * 2);\r
+  if (MsrNum > LastVariableMtrrForBios) {\r
+    return EFI_LOAD_ERROR;\r
+  }\r
+\r
+  //\r
+  // Special case for 1 MB base address\r
+  //\r
+  if (MemoryAddress == BASE_1MB) {\r
+    MemoryAddress = 0;\r
+  }\r
+\r
+  //\r
+  // Program MTRRs\r
+  //\r
+  TempQword = MemoryLength;\r
+\r
+  if (TempQword == Power2MaxMemory(MemoryAddress, TempQword)) {\r
+    EfiProgramMtrr(MsrNum,\r
+                   MemoryAddress,\r
+                   MemoryLength,\r
+                   MemoryCacheType,\r
+                   ValidMtrrAddressMask\r
+                   );\r
+\r
+  } else {\r
+    //\r
+    // Fill in MTRRs with values.  Direction can not be checked for this method\r
+    // as we are using WB as the default cache type and only setting areas to UC.\r
+    //\r
+    do {\r
+      //\r
+      // Do boundary check so we don't go past last MTRR register\r
+      // for BIOS use.  Leave one MTRR pair for OS use.\r
+      //\r
+      if (MsrNum > LastVariableMtrrForBios) {\r
+        return EFI_LOAD_ERROR;\r
+      }\r
+\r
+      //\r
+      // Set next power of 2 region\r
+      //\r
+      MemoryLength = Power2MaxMemory(MemoryAddress, TempQword);\r
+      EfiProgramMtrr(MsrNum,\r
+                     MemoryAddress,\r
+                     MemoryLength,\r
+                     MemoryCacheType,\r
+                     ValidMtrrAddressMask\r
+                     );\r
+      MemoryAddress += MemoryLength;\r
+      TempQword -= MemoryLength;\r
+      MsrNum += 2;\r
+    } while (TempQword != 0);\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Reset all the MTRRs to a known state.\r
+\r
+  @retval  EFI_SUCCESS All MTRRs have been reset successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+ResetCacheAttributes (\r
+  VOID\r
+  )\r
+{\r
+  UINT32                      MsrNum, MsrNumEnd;\r
+  UINT16                      Index;\r
+  UINT64                      OldMtrr;\r
+  UINT64                      CacheType;\r
+  BOOLEAN                     DisableCar;\r
+  Index = 0;\r
+  DisableCar = TRUE;\r
+\r
+  //\r
+  // Determine default cache type\r
+  //\r
+  CacheType = EFI_CACHE_UNCACHEABLE;\r
+\r
+  //\r
+  // Set default cache type\r
+  //\r
+  AsmWriteMsr64(EFI_MSR_CACHE_IA32_MTRR_DEF_TYPE, CacheType);\r
+\r
+  //\r
+  // Disable CAR\r
+  //\r
+  DisableCacheAsRam (DisableCar);\r
+\r
+  EfiDisableCacheMtrr (&OldMtrr);\r
+\r
+  //\r
+  // Reset Fixed MTRRs\r
+  //\r
+  for (Index = 0; Index < V_EFI_FIXED_MTRR_NUMBER; Index++) {\r
+    AsmWriteMsr64 (mFixedMtrrTable[Index].Msr, 0);\r
+  }\r
+\r
+  //\r
+  // Reset Variable MTRRs\r
+  //\r
+  MsrNumEnd = EFI_MSR_CACHE_VARIABLE_MTRR_BASE + (2 * (UINT32)(AsmReadMsr64(EFI_MSR_IA32_MTRR_CAP) & B_EFI_MSR_IA32_MTRR_CAP_VARIABLE_SUPPORT));\r
+  for (MsrNum = EFI_MSR_CACHE_VARIABLE_MTRR_BASE; MsrNum < MsrNumEnd; MsrNum++) {\r
+    AsmWriteMsr64 (MsrNum, 0);\r
+  }\r
+\r
+  //\r
+  // Enable Fixed and Variable MTRRs\r
+  //\r
+  EfiRecoverCacheMtrr (TRUE, OldMtrr);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Search the memory cache type for specific memory from MTRR.\r
+\r
+  @param[in]  MemoryAddress         the address of target memory\r
+  @param[in]  MemoryLength          the length of target memory\r
+  @param[in]  ValidMtrrAddressMask  the MTRR address mask\r
+  @param[out] UsedMsrNum            the used MSR number\r
+  @param[out] UsedMemoryCacheType   the cache type for the target memory\r
+\r
+  @retval EFI_SUCCESS    The memory is found in MTRR and cache type is returned\r
+  @retval EFI_NOT_FOUND  The memory is not found in MTRR\r
+\r
+**/\r
+EFI_STATUS\r
+SearchForExactMtrr (\r
+  IN  EFI_PHYSICAL_ADDRESS      MemoryAddress,\r
+  IN  UINT64                    MemoryLength,\r
+  IN  UINT64                    ValidMtrrAddressMask,\r
+  OUT UINT32                    *UsedMsrNum,\r
+  OUT EFI_MEMORY_CACHE_TYPE     *UsedMemoryCacheType\r
+  )\r
+{\r
+  UINT32                      MsrNum, MsrNumEnd;\r
+  UINT64                      TempQword;\r
+\r
+  if (MemoryLength == 0) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  MsrNumEnd = EFI_MSR_CACHE_VARIABLE_MTRR_BASE + (2 * (UINT32)(AsmReadMsr64(EFI_MSR_IA32_MTRR_CAP) & B_EFI_MSR_IA32_MTRR_CAP_VARIABLE_SUPPORT));\r
+  for (MsrNum = EFI_MSR_CACHE_VARIABLE_MTRR_BASE; MsrNum < MsrNumEnd; MsrNum +=2) {\r
+    TempQword = AsmReadMsr64(MsrNum+1);\r
+    if ((TempQword & B_EFI_MSR_CACHE_MTRR_VALID) == 0) {\r
+      continue;\r
+    }\r
+\r
+    if ((TempQword & ValidMtrrAddressMask) != ((~(MemoryLength - 1)) & ValidMtrrAddressMask)) {\r
+      continue;\r
+    }\r
+\r
+    TempQword = AsmReadMsr64 (MsrNum);\r
+    if ((TempQword & ValidMtrrAddressMask) != (MemoryAddress & ValidMtrrAddressMask)) {\r
+      continue;\r
+    }\r
+\r
+    *UsedMemoryCacheType = (EFI_MEMORY_CACHE_TYPE)(TempQword & B_EFI_MSR_CACHE_MEMORY_TYPE);\r
+    *UsedMsrNum = MsrNum;\r
+\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  return EFI_NOT_FOUND;\r
+}\r
+\r
+/**\r
+  Check if CacheType match current default setting.\r
+\r
+  @param[in] MemoryCacheType  input cache type to be checked.\r
+\r
+  @retval TRUE MemoryCacheType is default MTRR setting.\r
+  @retval TRUE MemoryCacheType is NOT default MTRR setting.\r
+**/\r
+BOOLEAN\r
+IsDefaultType (\r
+  IN  EFI_MEMORY_CACHE_TYPE     MemoryCacheType\r
+  )\r
+{\r
+  if ((AsmReadMsr64(EFI_MSR_CACHE_IA32_MTRR_DEF_TYPE) & B_EFI_MSR_CACHE_MEMORY_TYPE) != MemoryCacheType) {\r
+    return FALSE;\r
+  }\r
+\r
+  return TRUE;\r
+}\r
+\r
diff --git a/IntelFsp2Pkg/Library/BaseCacheLib/CacheLibInternal.h b/IntelFsp2Pkg/Library/BaseCacheLib/CacheLibInternal.h
new file mode 100644 (file)
index 0000000..fbbf551
--- /dev/null
@@ -0,0 +1,59 @@
+/** @file\r
+\r
+  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _CACHE_LIB_INTERNAL_H_\r
+#define _CACHE_LIB_INTERNAL_H_\r
+\r
+#define EFI_MSR_CACHE_VARIABLE_MTRR_BASE       0x00000200\r
+#define EFI_MSR_CACHE_VARIABLE_MTRR_END        0x0000020F\r
+#define   V_EFI_FIXED_MTRR_NUMBER                                      11\r
+\r
+#define EFI_MSR_IA32_MTRR_FIX64K_00000         0x00000250\r
+#define EFI_MSR_IA32_MTRR_FIX16K_80000         0x00000258\r
+#define EFI_MSR_IA32_MTRR_FIX16K_A0000         0x00000259\r
+#define EFI_MSR_IA32_MTRR_FIX4K_C0000          0x00000268\r
+#define EFI_MSR_IA32_MTRR_FIX4K_C8000          0x00000269\r
+#define EFI_MSR_IA32_MTRR_FIX4K_D0000          0x0000026A\r
+#define EFI_MSR_IA32_MTRR_FIX4K_D8000          0x0000026B\r
+#define EFI_MSR_IA32_MTRR_FIX4K_E0000          0x0000026C\r
+#define EFI_MSR_IA32_MTRR_FIX4K_E8000          0x0000026D\r
+#define EFI_MSR_IA32_MTRR_FIX4K_F0000          0x0000026E\r
+#define EFI_MSR_IA32_MTRR_FIX4K_F8000          0x0000026F\r
+#define EFI_MSR_CACHE_IA32_MTRR_DEF_TYPE       0x000002FF\r
+#define   B_EFI_MSR_CACHE_MTRR_VALID                                   BIT11\r
+#define   B_EFI_MSR_GLOBAL_MTRR_ENABLE                                 BIT11\r
+#define   B_EFI_MSR_FIXED_MTRR_ENABLE                                  BIT10\r
+#define   B_EFI_MSR_CACHE_MEMORY_TYPE                                  (BIT2 | BIT1 | BIT0)\r
+\r
+#define EFI_MSR_VALID_MASK                     0xFFFFFFFFF\r
+#define EFI_CACHE_VALID_ADDRESS                0xFFFFFF000\r
+#define EFI_SMRR_CACHE_VALID_ADDRESS           0xFFFFF000\r
+#define EFI_CACHE_VALID_EXTENDED_ADDRESS       0xFFFFFFFFFF000\r
+\r
+// Leave one MTRR pairs for OS use\r
+#define EFI_CACHE_NUM_VAR_MTRR_PAIRS_FOR_OS   1\r
+#define EFI_CACHE_LAST_VARIABLE_MTRR_FOR_BIOS (EFI_MSR_CACHE_VARIABLE_MTRR_END) - \\r
+        (EFI_CACHE_NUM_VAR_MTRR_PAIRS_FOR_OS * 2)\r
+\r
+#define EFI_MSR_IA32_MTRR_CAP                  0x000000FE\r
+#define   B_EFI_MSR_IA32_MTRR_CAP_EMRR_SUPPORT                         BIT12\r
+#define   B_EFI_MSR_IA32_MTRR_CAP_SMRR_SUPPORT                         BIT11\r
+#define   B_EFI_MSR_IA32_MTRR_CAP_WC_SUPPORT                           BIT10\r
+#define   B_EFI_MSR_IA32_MTRR_CAP_FIXED_SUPPORT                        BIT8\r
+#define   B_EFI_MSR_IA32_MTRR_CAP_VARIABLE_SUPPORT                     (BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0)\r
+\r
+#define CPUID_VIR_PHY_ADDRESS_SIZE                                    0x80000008\r
+#define CPUID_EXTENDED_FUNCTION                                       0x80000000\r
+\r
+#endif\r
+\r
diff --git a/IntelFsp2Pkg/Library/BaseDebugDeviceLibNull/BaseDebugDeviceLibNull.inf b/IntelFsp2Pkg/Library/BaseDebugDeviceLibNull/BaseDebugDeviceLibNull.inf
new file mode 100644 (file)
index 0000000..5e4c572
--- /dev/null
@@ -0,0 +1,34 @@
+## @file\r
+#  Debug device library instance that retrieves the current enabling state for\r
+#  the platform debug output device.\r
+#\r
+#  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>\r
+#\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution. The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php.\r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+##\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = BaseDebugDeviceLibNull\r
+  FILE_GUID                      = 5E975522-176F-4E2D-BB25-64ADCC7792A4\r
+  MODULE_TYPE                    = BASE\r
+  VERSION_STRING                 = 1.0\r
+  LIBRARY_CLASS                  = DebugDeviceLib\r
+\r
+#\r
+#  VALID_ARCHITECTURES           = IA32\r
+#\r
+\r
+[Sources]\r
+  DebugDeviceLibNull.c\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  IntelFsp2Pkg/IntelFsp2Pkg.dec\r
+\r
diff --git a/IntelFsp2Pkg/Library/BaseDebugDeviceLibNull/DebugDeviceLibNull.c b/IntelFsp2Pkg/Library/BaseDebugDeviceLibNull/DebugDeviceLibNull.c
new file mode 100644 (file)
index 0000000..95c1004
--- /dev/null
@@ -0,0 +1,31 @@
+/** @file\r
+  Debug device library instance that retrieves the current enabling state for\r
+  the platform debug output device.\r
+\r
+  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <Base.h>\r
+\r
+/**\r
+  Returns the debug print device enable state.\r
+\r
+  @return  Debug print device enable state.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+GetDebugPrintDeviceEnable (\r
+  VOID\r
+  )\r
+{\r
+  return 1;\r
+}\r
diff --git a/IntelFsp2Pkg/Library/BaseFspCommonLib/BaseFspCommonLib.inf b/IntelFsp2Pkg/Library/BaseFspCommonLib/BaseFspCommonLib.inf
new file mode 100644 (file)
index 0000000..0b0741b
--- /dev/null
@@ -0,0 +1,39 @@
+## @file\r
+#  Instance of FspCommonLib \r
+#  Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
+#\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution. The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php.\r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+##\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = BaseFspCommonLib\r
+  FILE_GUID                      = 38BE57E8-902C-485A-AB5E-D5AEC613194D\r
+  MODULE_TYPE                    = BASE\r
+  VERSION_STRING                 = 1.0\r
+  LIBRARY_CLASS                  = FspCommonLib\r
+\r
+[Sources]\r
+  FspCommonLib.c\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  IntelFsp2Pkg/IntelFsp2Pkg.dec\r
+\r
+[LibraryClasses]\r
+  BaseMemoryLib\r
+\r
+[Pcd]\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdGlobalDataPointerAddress      ## CONSUMES\r
+\r
+[FixedPcd]\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspMaxPatchEntry              ## CONSUMES\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspMaxPerfEntry               ## CONSUMES\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdTemporaryRamBase              ## CONSUMES\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdTemporaryRamSize              ## CONSUMES\r
diff --git a/IntelFsp2Pkg/Library/BaseFspCommonLib/FspCommonLib.c b/IntelFsp2Pkg/Library/BaseFspCommonLib/FspCommonLib.c
new file mode 100644 (file)
index 0000000..efd55f4
--- /dev/null
@@ -0,0 +1,546 @@
+/** @file\r
+\r
+  Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <PiPei.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/PcdLib.h>\r
+#include <FspGlobalData.h>\r
+#include <FspEas.h>\r
+#include <FspDataTable.h>\r
+\r
+#pragma pack(1)\r
+\r
+//\r
+//   API Parameter                +0x34\r
+//   API return address           +0x30\r
+//\r
+//   push    FspInfoHeader        +0x2C\r
+//   pushfd                       +0x28\r
+//   cli\r
+//   pushad                       +0x24\r
+//   sub     esp, 8               +0x00\r
+//   sidt    fword ptr [esp]\r
+//\r
+typedef struct {\r
+  UINT16    IdtrLimit;\r
+  UINT32    IdtrBase;\r
+  UINT16    Reserved;\r
+  UINT32    Edi;\r
+  UINT32    Esi;\r
+  UINT32    Ebp;\r
+  UINT32    Esp;\r
+  UINT32    Ebx;\r
+  UINT32    Edx;\r
+  UINT32    Ecx;\r
+  UINT32    Eax;\r
+  UINT16    Flags[2];\r
+  UINT32    FspInfoHeader;\r
+  UINT32    ApiRet;\r
+  UINT32    ApiParam[2];\r
+} CONTEXT_STACK;\r
+\r
+#define CONTEXT_STACK_OFFSET(x)  (UINT32)&((CONTEXT_STACK *)(UINTN)0)->x\r
+\r
+#pragma pack()\r
+\r
+/**\r
+  This function sets the FSP global data pointer.\r
+\r
+  @param[in] FspData       Fsp global data pointer.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFspGlobalDataPointer (\r
+  IN FSP_GLOBAL_DATA   *FspData\r
+  )\r
+{\r
+  ASSERT (FspData != NULL);\r
+  *((volatile UINT32 *)(UINTN)PcdGet32(PcdGlobalDataPointerAddress)) = (UINT32)(UINTN)FspData;\r
+}\r
+\r
+/**\r
+  This function gets the FSP global data pointer.\r
+\r
+**/\r
+FSP_GLOBAL_DATA *\r
+EFIAPI\r
+GetFspGlobalDataPointer (\r
+  VOID\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA   *FspData;\r
+\r
+  FspData = *(FSP_GLOBAL_DATA  **)(UINTN)PcdGet32(PcdGlobalDataPointerAddress);\r
+  return FspData;\r
+}\r
+\r
+/**\r
+  This function gets back the FSP API first parameter passed by the bootlaoder.\r
+\r
+  @retval ApiParameter FSP API first parameter passed by the bootlaoder.\r
+**/\r
+UINT32\r
+EFIAPI\r
+GetFspApiParameter (\r
+  VOID\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA  *FspData;\r
+\r
+  FspData  = GetFspGlobalDataPointer ();\r
+  return *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiParam[0]));\r
+}\r
+\r
+/**\r
+  This function gets back the FSP API second parameter passed by the bootlaoder.\r
+\r
+  @retval ApiParameter FSP API second parameter passed by the bootlaoder.\r
+**/\r
+UINT32\r
+EFIAPI\r
+GetFspApiParameter2 (\r
+  VOID\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA  *FspData;\r
+\r
+  FspData  = GetFspGlobalDataPointer ();\r
+  return *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiParam[1]));\r
+}\r
+\r
+/**\r
+  This function sets the FSP API parameter in the stack.\r
+\r
+   @param[in] Value       New parameter value.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFspApiParameter (\r
+  IN UINT32      Value\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA  *FspData;\r
+\r
+  FspData  = GetFspGlobalDataPointer ();\r
+  *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(ApiParam)) = Value;\r
+}\r
+\r
+/**\r
+  This function set the API status code returned to the BootLoader.\r
+\r
+  @param[in] ReturnStatus       Status code to return.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFspApiReturnStatus (\r
+  IN UINT32  ReturnStatus\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA  *FspData;\r
+\r
+  FspData  = GetFspGlobalDataPointer ();\r
+  *(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(Eax)) = ReturnStatus;\r
+}\r
+\r
+/**\r
+  This function sets the context switching stack to a new stack frame.\r
+\r
+  @param[in] NewStackTop       New core stack to be set.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFspCoreStackPointer (\r
+  IN VOID   *NewStackTop\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA  *FspData;\r
+  UINT32           *OldStack;\r
+  UINT32           *NewStack;\r
+  UINT32           StackContextLen;\r
+\r
+  FspData  = GetFspGlobalDataPointer ();\r
+  StackContextLen = sizeof(CONTEXT_STACK) / sizeof(UINT32);\r
+\r
+  //\r
+  // Reserve space for the ContinuationFunc two parameters\r
+  //\r
+  OldStack = (UINT32 *)FspData->CoreStack;\r
+  NewStack = (UINT32 *)NewStackTop - StackContextLen - 2;\r
+  FspData->CoreStack = (UINT32)NewStack;\r
+  while (StackContextLen-- != 0) {\r
+    *NewStack++ = *OldStack++;\r
+  }\r
+}\r
+\r
+/**\r
+  This function sets the platform specific data pointer.\r
+\r
+  @param[in] PlatformData       Fsp platform specific data pointer.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFspPlatformDataPointer (\r
+  IN VOID   *PlatformData\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA  *FspData;\r
+\r
+  FspData  = GetFspGlobalDataPointer ();\r
+  FspData->PlatformData.DataPtr = PlatformData;\r
+}\r
+\r
+\r
+/**\r
+  This function gets the platform specific data pointer.\r
+\r
+   @param[in] PlatformData       Fsp platform specific data pointer.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetFspPlatformDataPointer (\r
+  VOID\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA  *FspData;\r
+\r
+  FspData  = GetFspGlobalDataPointer ();\r
+  return FspData->PlatformData.DataPtr;\r
+}\r
+\r
+\r
+/**\r
+  This function sets the UPD data pointer.\r
+\r
+  @param[in] UpdDataPtr   UPD data pointer.\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFspUpdDataPointer (\r
+  IN VOID    *UpdDataPtr\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA  *FspData;\r
+\r
+  //\r
+  // Get the Fsp Global Data Pointer\r
+  //\r
+  FspData  = GetFspGlobalDataPointer ();\r
+\r
+  //\r
+  // Set the UPD pointer.\r
+  //\r
+  FspData->UpdDataPtr = UpdDataPtr;\r
+}\r
+\r
+/**\r
+  This function gets the UPD data pointer.\r
+\r
+  @return UpdDataPtr   UPD data pointer.\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetFspUpdDataPointer (\r
+  VOID\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA  *FspData;\r
+\r
+  FspData  = GetFspGlobalDataPointer ();\r
+  return FspData->UpdDataPtr;\r
+}\r
+\r
+\r
+/**\r
+  This function sets the memory init UPD data pointer.\r
+\r
+  @param[in] MemoryInitUpdPtr   memory init UPD data pointer.\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFspMemoryInitUpdDataPointer (\r
+  IN VOID    *MemoryInitUpdPtr\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA  *FspData;\r
+\r
+  //\r
+  // Get the Fsp Global Data Pointer\r
+  //\r
+  FspData  = GetFspGlobalDataPointer ();\r
+\r
+  //\r
+  // Set the memory init UPD pointer.\r
+  //\r
+  FspData->MemoryInitUpdPtr = MemoryInitUpdPtr;\r
+}\r
+\r
+/**\r
+  This function gets the memory init UPD data pointer.\r
+\r
+  @return memory init UPD data pointer.\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetFspMemoryInitUpdDataPointer (\r
+  VOID\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA  *FspData;\r
+\r
+  FspData  = GetFspGlobalDataPointer ();\r
+  return FspData->MemoryInitUpdPtr;\r
+}\r
+\r
+\r
+/**\r
+  This function sets the silicon init UPD data pointer.\r
+\r
+  @param[in] SiliconInitUpdPtr   silicon init UPD data pointer.\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFspSiliconInitUpdDataPointer (\r
+  IN VOID    *SiliconInitUpdPtr\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA  *FspData;\r
+\r
+  //\r
+  // Get the Fsp Global Data Pointer\r
+  //\r
+  FspData  = GetFspGlobalDataPointer ();\r
+\r
+  //\r
+  // Set the silicon init UPD data pointer.\r
+  //\r
+  FspData->SiliconInitUpdPtr = SiliconInitUpdPtr;\r
+}\r
+\r
+/**\r
+  This function gets the silicon init UPD data pointer.\r
+\r
+  @return silicon init UPD data pointer.\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetFspSiliconInitUpdDataPointer (\r
+  VOID\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA  *FspData;\r
+\r
+  FspData  = GetFspGlobalDataPointer ();\r
+  return FspData->SiliconInitUpdPtr;\r
+}\r
+\r
+\r
+/**\r
+  Set FSP measurement point timestamp.\r
+\r
+  @param[in] Id       Measurement point ID.\r
+\r
+  @return performance timestamp.\r
+**/\r
+UINT64\r
+EFIAPI\r
+SetFspMeasurePoint (\r
+  IN UINT8  Id\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA  *FspData;\r
+\r
+  //\r
+  // Bit [55: 0]  will be the timestamp\r
+  // Bit [63:56]  will be the ID\r
+  //\r
+  FspData  = GetFspGlobalDataPointer ();\r
+  if (FspData->PerfIdx < sizeof(FspData->PerfData) / sizeof(FspData->PerfData[0])) {\r
+    FspData->PerfData[FspData->PerfIdx] = AsmReadTsc ();\r
+    ((UINT8 *)(&FspData->PerfData[FspData->PerfIdx]))[7] = Id;\r
+  }\r
+\r
+  return FspData->PerfData[(FspData->PerfIdx)++];\r
+}\r
+\r
+/**\r
+  This function gets the FSP info header pointer.\r
+\r
+  @retval FspInfoHeader   FSP info header pointer\r
+**/\r
+FSP_INFO_HEADER *\r
+EFIAPI\r
+GetFspInfoHeader (\r
+  VOID\r
+  )\r
+{\r
+  return  GetFspGlobalDataPointer()->FspInfoHeader;\r
+}\r
+\r
+/**\r
+  This function sets the FSP info header pointer.\r
+\r
+  @param[in] FspInfoHeader   FSP info header pointer\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFspInfoHeader (\r
+  FSP_INFO_HEADER *FspInfoHeader\r
+  )\r
+{\r
+  GetFspGlobalDataPointer()->FspInfoHeader = FspInfoHeader;\r
+}\r
+\r
+/**\r
+  This function gets the FSP info header pointer using the API stack context.\r
+\r
+  @retval FspInfoHeader   FSP info header pointer using the API stack context\r
+**/\r
+FSP_INFO_HEADER *\r
+EFIAPI\r
+GetFspInfoHeaderFromApiContext (\r
+  VOID\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA  *FspData;\r
+\r
+  FspData  = GetFspGlobalDataPointer ();\r
+  return  (FSP_INFO_HEADER *)(*(UINT32 *)(UINTN)(FspData->CoreStack + CONTEXT_STACK_OFFSET(FspInfoHeader)));\r
+}\r
+\r
+/**\r
+  This function gets the VPD data pointer.\r
+\r
+  @return VpdDataRgnPtr   VPD data pointer.\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetFspVpdDataPointer (\r
+  VOID\r
+  )\r
+{\r
+  FSP_INFO_HEADER   *FspInfoHeader;\r
+\r
+  FspInfoHeader = GetFspInfoHeader ();\r
+  return (VOID *)(FspInfoHeader->ImageBase + FspInfoHeader->CfgRegionOffset);\r
+}\r
+\r
+/**\r
+  This function gets FSP API calling index.\r
+\r
+  @retval API calling index\r
+**/\r
+UINT8\r
+EFIAPI\r
+GetFspApiCallingIndex (\r
+  VOID\r
+  )\r
+{\r
+  return  GetFspGlobalDataPointer()->ApiIdx;\r
+}\r
+\r
+/**\r
+  This function sets FSP API calling mode.\r
+\r
+  @param[in] Index     API calling index\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFspApiCallingIndex (\r
+  UINT8  Index\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA  *FspData;\r
+\r
+  FspData  = GetFspGlobalDataPointer ();\r
+  FspData->ApiIdx = Index;\r
+}\r
+\r
+/**\r
+  This function gets FSP Phase StatusCode.\r
+\r
+  @retval StatusCode\r
+**/\r
+UINT32\r
+EFIAPI\r
+GetPhaseStatusCode (\r
+  VOID\r
+  )\r
+{\r
+  return  GetFspGlobalDataPointer()->StatusCode;\r
+}\r
+\r
+/**\r
+  This function sets FSP Phase StatusCode.\r
+\r
+  @param[in] Mode     Phase StatusCode\r
+**/\r
+VOID\r
+EFIAPI\r
+SetPhaseStatusCode (\r
+  UINT32  StatusCode\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA  *FspData;\r
+\r
+  FspData  = GetFspGlobalDataPointer ();\r
+  FspData->StatusCode = StatusCode;\r
+}\r
+\r
+/**\r
+  This function gets FSP CAR base.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+GetFspCarBase (\r
+  VOID\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA  *FspData;\r
+  UINT32           CarBase;\r
+\r
+  FspData  = GetFspGlobalDataPointer ();\r
+  CarBase = FspData->PlatformData.CarBase;\r
+  if (CarBase == 0) {\r
+    CarBase = PcdGet32(PcdTemporaryRamBase);\r
+  }\r
+  return CarBase;\r
+}\r
+\r
+/**\r
+  This function gets FSP CAR size.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+GetFspCarSize (\r
+  VOID\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA  *FspData;\r
+  UINT32           CarSize;\r
+\r
+  FspData  = GetFspGlobalDataPointer ();\r
+  CarSize = FspData->PlatformData.CarSize;\r
+  if (FspData->PlatformData.CarBase == 0) {\r
+    CarSize = PcdGet32(PcdTemporaryRamSize);\r
+  }\r
+  return CarSize;\r
+}\r
diff --git a/IntelFsp2Pkg/Library/BaseFspDebugLibSerialPort/BaseFspDebugLibSerialPort.inf b/IntelFsp2Pkg/Library/BaseFspDebugLibSerialPort/BaseFspDebugLibSerialPort.inf
new file mode 100644 (file)
index 0000000..a7f10d4
--- /dev/null
@@ -0,0 +1,51 @@
+## @file\r
+#  Instance of BaseFspDebugLib\r
+#\r
+#  Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>\r
+#\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution. The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php.\r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+##\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = BaseFspDebugLibSerialPort\r
+  FILE_GUID                      = CEA4FF9C-D7BC-4F07-96F1-03F41F2B17AE\r
+  MODULE_TYPE                    = BASE\r
+  VERSION_STRING                 = 1.0\r
+  LIBRARY_CLASS                  = DebugLib\r
+\r
+#\r
+#  VALID_ARCHITECTURES           = IA32\r
+#\r
+\r
+[Sources]\r
+  DebugLib.c\r
+\r
+[Sources.Ia32]\r
+  Ia32/FspDebug.asm | MSFT\r
+  Ia32/FspDebug.s | GCC\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  IntelFsp2Pkg/IntelFsp2Pkg.dec\r
+\r
+[LibraryClasses]\r
+  SerialPortLib\r
+  BaseMemoryLib\r
+  PcdLib\r
+  PrintLib\r
+  BaseLib\r
+  DebugDeviceLib\r
+  DebugPrintErrorLevelLib\r
+\r
+[Pcd]\r
+  gEfiMdePkgTokenSpaceGuid.PcdDebugClearMemoryValue       ## CONSUMES\r
+  gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask           ## CONSUMES\r
+  gEfiMdePkgTokenSpaceGuid.PcdFixedDebugPrintErrorLevel   ## CONSUMES\r
+\r
diff --git a/IntelFsp2Pkg/Library/BaseFspDebugLibSerialPort/DebugLib.c b/IntelFsp2Pkg/Library/BaseFspDebugLibSerialPort/DebugLib.c
new file mode 100644 (file)
index 0000000..73bb08e
--- /dev/null
@@ -0,0 +1,328 @@
+/** @file\r
+\r
+  Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <Base.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/PrintLib.h>\r
+#include <Library/PcdLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/SerialPortLib.h>\r
+#include <Library/DebugDeviceLib.h>\r
+#include <Library/DebugPrintErrorLevelLib.h>\r
+\r
+//\r
+// Define the maximum debug and assert message length that this library supports\r
+//\r
+#define MAX_DEBUG_MESSAGE_LENGTH  0x100\r
+\r
+CONST CHAR8  *mHexTable = "0123456789ABCDEF";\r
+\r
+/**\r
+  Get stack frame pointer of function call.\r
+\r
+  @return StackFramePointer  stack frame pointer of function call.\r
+**/\r
+UINT32 *\r
+EFIAPI\r
+GetStackFramePointer (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Prints a debug message to the debug output device if the specified error level is enabled.\r
+\r
+  If any bit in ErrorLevel is also set in DebugPrintErrorLevelLib function\r
+  GetDebugPrintErrorLevel (), then print the message specified by Format and the\r
+  associated variable argument list to the debug output device.\r
+\r
+  If Format is NULL, then ASSERT().\r
+\r
+  @param  ErrorLevel  The error level of the debug message.\r
+  @param  Format      Format string for the debug message to print.\r
+  @param  ...         Variable argument list whose contents are accessed\r
+                      based on the format string specified by Format.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+DebugPrint (\r
+  IN  UINTN        ErrorLevel,\r
+  IN  CONST CHAR8  *Format,\r
+  ...\r
+  )\r
+{\r
+  CHAR8    Buffer[MAX_DEBUG_MESSAGE_LENGTH];\r
+  VA_LIST  Marker;\r
+\r
+  //\r
+  // If Format is NULL, then ASSERT().\r
+  //\r
+  if (!GetDebugPrintDeviceEnable ()) {\r
+    return;\r
+  }\r
+\r
+  //\r
+  // Check driver debug mask value and global mask\r
+  //\r
+  if ((ErrorLevel & GetDebugPrintErrorLevel ()) == 0) {\r
+    return;\r
+  }\r
+\r
+  //\r
+  // If Format is NULL, then ASSERT().\r
+  //\r
+  ASSERT (Format != NULL);\r
+\r
+  //\r
+  // Convert the DEBUG() message to an ASCII String\r
+  //\r
+  VA_START (Marker, Format);\r
+  AsciiVSPrint (Buffer, sizeof (Buffer), Format, Marker);\r
+  VA_END (Marker);\r
+\r
+  //\r
+  // Send the print string to a Serial Port\r
+  //\r
+  SerialPortWrite ((UINT8 *)Buffer, AsciiStrLen (Buffer));\r
+}\r
+\r
+/**\r
+  Convert an UINT32 value into HEX string sepcified by Buffer.\r
+\r
+  @param  Value   The HEX value to convert to string\r
+  @param  Buffer  The pointer to the target buffer to be filled with HEX string\r
+\r
+**/\r
+VOID\r
+FillHex (\r
+  UINT32   Value,\r
+  CHAR8   *Buffer\r
+  )\r
+{\r
+  INTN  Idx;\r
+  for (Idx = 7; Idx >= 0; Idx--) {\r
+    Buffer[Idx] = mHexTable[Value & 0x0F];\r
+    Value >>= 4;\r
+  }\r
+}\r
+\r
+/**\r
+  Prints an assert message containing a filename, line number, and description.\r
+  This may be followed by a breakpoint or a dead loop.\r
+\r
+  Print a message of the form "ASSERT <FileName>(<LineNumber>): <Description>\n"\r
+  to the debug output device.  If DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED bit of\r
+  PcdDebugProperyMask is set then CpuBreakpoint() is called. Otherwise, if\r
+  DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugProperyMask is set then\r
+  CpuDeadLoop() is called.  If neither of these bits are set, then this function\r
+  returns immediately after the message is printed to the debug output device.\r
+  DebugAssert() must actively prevent recursion.  If DebugAssert() is called while\r
+  processing another DebugAssert(), then DebugAssert() must return immediately.\r
+\r
+  If FileName is NULL, then a <FileName> string of "(NULL) Filename" is printed.\r
+  If Description is NULL, then a <Description> string of "(NULL) Description" is printed.\r
+\r
+**/\r
+VOID\r
+DebugAssertInternal (\r
+  VOID\r
+  )\r
+{\r
+  CHAR8     Buffer[MAX_DEBUG_MESSAGE_LENGTH];\r
+  UINT32   *Frame;\r
+\r
+  Frame = (UINT32 *)GetStackFramePointer ();\r
+\r
+  //\r
+  // Generate the ASSERT() message in Ascii format\r
+  //\r
+  AsciiStrnCpyS (\r
+    Buffer,\r
+    sizeof(Buffer) / sizeof(CHAR8),\r
+    "-> EBP:0x00000000  EIP:0x00000000\n",\r
+    sizeof(Buffer) / sizeof(CHAR8) - 1\r
+    );\r
+  SerialPortWrite ((UINT8 *)"ASSERT DUMP:\n", 13);\r
+  while (Frame != NULL) {\r
+    FillHex ((UINT32)Frame, Buffer + 9);\r
+    FillHex (Frame[1], Buffer + 9 + 8 + 8);\r
+    SerialPortWrite ((UINT8 *)Buffer, AsciiStrLen (Buffer));\r
+    if ((Frame[0] > (UINT32)Frame) && (Frame[0] < (UINT32)Frame + 0x00100000)) {\r
+      Frame = (UINT32 *)Frame[0];\r
+    } else {\r
+      Frame = NULL;\r
+    }\r
+  }\r
+\r
+  //\r
+  // Dead loop\r
+  //\r
+  CpuDeadLoop ();\r
+}\r
+\r
+/**\r
+  Prints an assert message containing a filename, line number, and description.\r
+  This may be followed by a breakpoint or a dead loop.\r
+\r
+  Print a message of the form "ASSERT <FileName>(<LineNumber>): <Description>\n"\r
+  to the debug output device.  If DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED bit of\r
+  PcdDebugProperyMask is set then CpuBreakpoint() is called. Otherwise, if\r
+  DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugProperyMask is set then\r
+  CpuDeadLoop() is called.  If neither of these bits are set, then this function\r
+  returns immediately after the message is printed to the debug output device.\r
+  DebugAssert() must actively prevent recursion.  If DebugAssert() is called while\r
+  processing another DebugAssert(), then DebugAssert() must return immediately.\r
+\r
+  If FileName is NULL, then a <FileName> string of "(NULL) Filename" is printed.\r
+  If Description is NULL, then a <Description> string of "(NULL) Description" is printed.\r
+\r
+  @param  FileName     The pointer to the name of the source file that generated the assert condition.\r
+  @param  LineNumber   The line number in the source file that generated the assert condition\r
+  @param  Description  The pointer to the description of the assert condition.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+DebugAssert (\r
+  IN CONST CHAR8  *FileName,\r
+  IN UINTN        LineNumber,\r
+  IN CONST CHAR8  *Description\r
+  )\r
+{\r
+  DebugAssertInternal ();\r
+}\r
+\r
+\r
+/**\r
+  Fills a target buffer with PcdDebugClearMemoryValue, and returns the target buffer.\r
+\r
+  This function fills Length bytes of Buffer with the value specified by\r
+  PcdDebugClearMemoryValue, and returns Buffer.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param   Buffer  The pointer to the target buffer to be filled with PcdDebugClearMemoryValue.\r
+  @param   Length  The number of bytes in Buffer to fill with zeros PcdDebugClearMemoryValue.\r
+\r
+  @return  Buffer  The pointer to the target buffer filled with PcdDebugClearMemoryValue.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+DebugClearMemory (\r
+  OUT VOID  *Buffer,\r
+  IN UINTN  Length\r
+  )\r
+{\r
+  return Buffer;\r
+}\r
+\r
+\r
+/**\r
+  Returns TRUE if ASSERT() macros are enabled.\r
+\r
+  This function returns TRUE if the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of\r
+  PcdDebugProperyMask is set.  Otherwise FALSE is returned.\r
+\r
+  @retval  TRUE    The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set.\r
+  @retval  FALSE   The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+DebugAssertEnabled (\r
+  VOID\r
+  )\r
+{\r
+  return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED) != 0);\r
+}\r
+\r
+\r
+/**\r
+  Returns TRUE if DEBUG() macros are enabled.\r
+\r
+  This function returns TRUE if the DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of\r
+  PcdDebugProperyMask is set.  Otherwise FALSE is returned.\r
+\r
+  @retval  TRUE    The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is set.\r
+  @retval  FALSE   The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is clear.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+DebugPrintEnabled (\r
+  VOID\r
+  )\r
+{\r
+  return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_PRINT_ENABLED) != 0);\r
+}\r
+\r
+/**\r
+  Returns TRUE if DEBUG_CODE() macros are enabled.\r
+\r
+  This function returns TRUE if the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of\r
+  PcdDebugProperyMask is set.  Otherwise FALSE is returned.\r
+\r
+  @retval  TRUE    The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set.\r
+  @retval  FALSE   The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is clear.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+DebugCodeEnabled (\r
+  VOID\r
+  )\r
+{\r
+  return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_CODE_ENABLED) != 0);\r
+}\r
+\r
+\r
+/**\r
+  Returns TRUE if DEBUG_CLEAR_MEMORY() macro is enabled.\r
+\r
+  This function returns TRUE if the DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of\r
+  PcdDebugProperyMask is set.  Otherwise FALSE is returned.\r
+\r
+  @retval  TRUE    The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is set.\r
+  @retval  FALSE   The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is clear.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+DebugClearMemoryEnabled (\r
+  VOID\r
+  )\r
+{\r
+  return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED) != 0);\r
+}\r
+\r
+/**\r
+  Returns TRUE if any one of the bit is set both in ErrorLevel and PcdFixedDebugPrintErrorLevel.\r
+\r
+  This function compares the bit mask of ErrorLevel and PcdFixedDebugPrintErrorLevel.\r
+\r
+  @retval  TRUE    Current ErrorLevel is supported.\r
+  @retval  FALSE   Current ErrorLevel is not supported.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+DebugPrintLevelEnabled (\r
+  IN  CONST UINTN        ErrorLevel\r
+  )\r
+{\r
+  return (BOOLEAN) ((ErrorLevel & PcdGet32(PcdFixedDebugPrintErrorLevel)) != 0);\r
+}\r
diff --git a/IntelFsp2Pkg/Library/BaseFspDebugLibSerialPort/Ia32/FspDebug.asm b/IntelFsp2Pkg/Library/BaseFspDebugLibSerialPort/Ia32/FspDebug.asm
new file mode 100644 (file)
index 0000000..8ac18ec
--- /dev/null
@@ -0,0 +1,34 @@
+;------------------------------------------------------------------------------\r
+;\r
+; Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>\r
+; This program and the accompanying materials\r
+; are licensed and made available under the terms and conditions of the BSD License\r
+; which accompanies this distribution.  The full text of the license may be found at\r
+; http://opensource.org/licenses/bsd-license.php.\r
+;\r
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+;\r
+; Abstract:\r
+;\r
+;   FSP Debug functions\r
+;\r
+;------------------------------------------------------------------------------\r
+\r
+    .386\r
+    .model  flat,C\r
+    .code\r
+\r
+;------------------------------------------------------------------------------\r
+; UINT32 *\r
+; EFIAPI\r
+; GetStackFramePointer (\r
+;   VOID\r
+;   );\r
+;------------------------------------------------------------------------------\r
+GetStackFramePointer  PROC  PUBLIC\r
+    mov     eax, ebp\r
+    ret\r
+GetStackFramePointer  ENDP\r
+\r
+    END\r
diff --git a/IntelFsp2Pkg/Library/BaseFspDebugLibSerialPort/Ia32/FspDebug.s b/IntelFsp2Pkg/Library/BaseFspDebugLibSerialPort/Ia32/FspDebug.s
new file mode 100644 (file)
index 0000000..0f8475f
--- /dev/null
@@ -0,0 +1,30 @@
+#------------------------------------------------------------------------------\r
+#\r
+# Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>\r
+# This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution.  The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php.\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+# Abstract:\r
+#\r
+#   FSP Debug functions\r
+#\r
+#------------------------------------------------------------------------------\r
+\r
+#------------------------------------------------------------------------------\r
+# UINT32 *\r
+# EFIAPI\r
+# GetStackFramePointer (\r
+#   VOID\r
+#   )\r
+#------------------------------------------------------------------------------\r
+ASM_GLOBAL ASM_PFX(GetStackFramePointer)\r
+ASM_PFX(GetStackFramePointer):\r
+    mov    %ebp, %eax\r
+    ret\r
+\r
+\r
diff --git a/IntelFsp2Pkg/Library/BaseFspPlatformLib/BaseFspPlatformLib.inf b/IntelFsp2Pkg/Library/BaseFspPlatformLib/BaseFspPlatformLib.inf
new file mode 100644 (file)
index 0000000..d04689e
--- /dev/null
@@ -0,0 +1,50 @@
+## @file\r
+# Instance of FspPlatformLib\r
+#\r
+#  Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
+#\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution. The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php.\r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+##\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = BaseFspPlatformLib\r
+  FILE_GUID                      = B6380BFB-7140-4C52-AC42-8C966C9A3F34\r
+  MODULE_TYPE                    = BASE\r
+  VERSION_STRING                 = 1.0\r
+  LIBRARY_CLASS                  = FspPlatformLib\r
+\r
+[Sources]\r
+  FspPlatformMemory.c\r
+  FspPlatformNotify.c\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  IntelFsp2Pkg/IntelFsp2Pkg.dec\r
+\r
+[LibraryClasses]\r
+  BaseMemoryLib\r
+  MemoryAllocationLib\r
+  FspCommonLib\r
+  PerformanceLib\r
+  ReportStatusCodeLib\r
+\r
+[Pcd]\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdGlobalDataPointerAddress    ## CONSUMES\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdTemporaryRamBase            ## CONSUMES\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdTemporaryRamSize            ## CONSUMES\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspTemporaryRamSize         ## CONSUMES\r
+\r
+[Guids]\r
+  gFspPerformanceDataGuid                                   ## CONSUMES ## GUID\r
+  gFspEventEndOfFirmwareGuid                                ## PRODUCES ## GUID\r
+\r
+[FixedPcd]\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspMaxPatchEntry        ## CONSUMES\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspMaxPerfEntry         ## CONSUMES\r
diff --git a/IntelFsp2Pkg/Library/BaseFspPlatformLib/FspPlatformMemory.c b/IntelFsp2Pkg/Library/BaseFspPlatformLib/FspPlatformMemory.c
new file mode 100644 (file)
index 0000000..d6684f3
--- /dev/null
@@ -0,0 +1,189 @@
+/** @file\r
+\r
+  Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <PiPei.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/PcdLib.h>\r
+#include <Library/HobLib.h>\r
+#include <Library/PeiServicesLib.h>\r
+#include <Library/FspCommonLib.h>\r
+#include <FspGlobalData.h>\r
+#include <FspEas.h>\r
+\r
+/**\r
+  Get system memory resource descriptor by owner.\r
+\r
+  @param[in] OwnerGuid   resource owner guid\r
+**/\r
+EFI_HOB_RESOURCE_DESCRIPTOR *\r
+EFIAPI\r
+FspGetResourceDescriptorByOwner (\r
+  IN EFI_GUID   *OwnerGuid\r
+  )\r
+{\r
+  EFI_PEI_HOB_POINTERS    Hob;\r
+\r
+  //\r
+  // Get the HOB list for processing\r
+  //\r
+  Hob.Raw = GetHobList ();\r
+\r
+  //\r
+  // Collect memory ranges\r
+  //\r
+  while (!END_OF_HOB_LIST (Hob)) {\r
+    if (Hob.Header->HobType == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {\r
+      if ((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_MEMORY_RESERVED) && \\r
+          (CompareGuid (&Hob.ResourceDescriptor->Owner, OwnerGuid))) {\r
+        return  Hob.ResourceDescriptor;                     \r
+      }\r
+    }\r
+    Hob.Raw = GET_NEXT_HOB (Hob);\r
+  }\r
+  \r
+  return NULL;\r
+}\r
+\r
+/**\r
+  Get system memory from HOB.\r
+\r
+  @param[in,out] LowMemoryLength   less than 4G memory length\r
+  @param[in,out] HighMemoryLength  greater than 4G memory length\r
+**/\r
+VOID\r
+EFIAPI\r
+FspGetSystemMemorySize (\r
+  IN OUT UINT64              *LowMemoryLength,\r
+  IN OUT UINT64              *HighMemoryLength\r
+  )\r
+{\r
+  EFI_STATUS                  Status;\r
+  EFI_BOOT_MODE               BootMode;\r
+  EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute;\r
+  EFI_PEI_HOB_POINTERS        Hob;\r
+\r
+  ResourceAttribute = (\r
+                       EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
+                       EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
+                       EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
+                       EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
+                       EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
+                       EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE\r
+                       );\r
+\r
+  Status = PeiServicesGetBootMode (&BootMode);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  if (BootMode != BOOT_ON_S3_RESUME) {\r
+    ResourceAttribute |= EFI_RESOURCE_ATTRIBUTE_TESTED;\r
+  }\r
+\r
+  *HighMemoryLength = 0;\r
+  *LowMemoryLength  = SIZE_1MB;\r
+  //\r
+  // Get the HOB list for processing\r
+  //\r
+  Hob.Raw = GetHobList ();\r
+\r
+  //\r
+  // Collect memory ranges\r
+  //\r
+  while (!END_OF_HOB_LIST (Hob)) {\r
+    if (Hob.Header->HobType == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {\r
+      if ((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) ||\r
+          ((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_MEMORY_RESERVED) &&\r
+           (Hob.ResourceDescriptor->ResourceAttribute == ResourceAttribute))) {\r
+        //\r
+        // Need memory above 1MB to be collected here\r
+        //\r
+        if (Hob.ResourceDescriptor->PhysicalStart >= BASE_1MB &&\r
+            Hob.ResourceDescriptor->PhysicalStart < (EFI_PHYSICAL_ADDRESS) BASE_4GB) {\r
+          *LowMemoryLength += (UINT64) (Hob.ResourceDescriptor->ResourceLength);\r
+        } else if (Hob.ResourceDescriptor->PhysicalStart >= (EFI_PHYSICAL_ADDRESS) BASE_4GB) {\r
+          *HighMemoryLength += (UINT64) (Hob.ResourceDescriptor->ResourceLength);\r
+        }\r
+      }\r
+    }\r
+    Hob.Raw = GET_NEXT_HOB (Hob);\r
+  }\r
+}\r
+\r
+/**\r
+  Migrate BootLoader data before destroying CAR.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+FspMigrateTemporaryMemory (\r
+  VOID\r
+ )\r
+{\r
+  UINT32                    BootLoaderTempRamStart;\r
+  UINT32                    BootLoaderTempRamEnd;\r
+  UINT32                    BootLoaderTempRamSize;\r
+  UINT32                    OffsetGap;\r
+  UINT32                    FspParamPtr;\r
+  VOID                      *BootLoaderTempRamHob;\r
+  UINT32                    MemoryInitUpdPtr;\r
+  VOID                      *PlatformDataPtr;\r
+\r
+  //\r
+  // Get the temporary memory range used by the BootLoader\r
+  //\r
+  BootLoaderTempRamStart = GetFspCarBase ();\r
+  BootLoaderTempRamSize  = GetFspCarSize () - PcdGet32(PcdFspTemporaryRamSize);\r
+\r
+  BootLoaderTempRamEnd   = BootLoaderTempRamStart +  BootLoaderTempRamSize;\r
+\r
+  //\r
+  // Build a Boot Loader Temporary Memory GUID HOB\r
+  //\r
+  BootLoaderTempRamHob = (VOID *)AllocatePages (EFI_SIZE_TO_PAGES (BootLoaderTempRamSize));\r
+  ASSERT(BootLoaderTempRamHob != NULL);\r
+\r
+  DEBUG ((DEBUG_INFO, "FSP_BOOT_LOADER_TEMPORARY_MEMORY_HOB\n"));\r
+  DEBUG ((DEBUG_INFO, "FspBootLoaderTemporaryMemory Base : %x\n", BootLoaderTempRamStart));\r
+  DEBUG ((DEBUG_INFO, "FspBootLoaderTemporaryMemory Size : %x\n", BootLoaderTempRamSize));\r
+\r
+  CopyMem (BootLoaderTempRamHob, (VOID *)BootLoaderTempRamStart, BootLoaderTempRamSize);\r
+  OffsetGap = (UINT32)BootLoaderTempRamHob - BootLoaderTempRamStart;\r
+\r
+  //\r
+  // Fix the FspMemoryinit Parameter Pointers to the new location.\r
+  //\r
+  FspParamPtr = GetFspApiParameter ();\r
+  if ((VOID *)FspParamPtr != NULL && FspParamPtr >= BootLoaderTempRamStart && \r
+      FspParamPtr < BootLoaderTempRamEnd) {\r
+    SetFspApiParameter (FspParamPtr + OffsetGap);\r
+  }\r
+\r
+  //\r
+  // Update UPD pointer in FSP Global Data\r
+  //\r
+  MemoryInitUpdPtr = (UINT32)((UINT32 *)GetFspMemoryInitUpdDataPointer ());\r
+  if (MemoryInitUpdPtr >= BootLoaderTempRamStart && MemoryInitUpdPtr < BootLoaderTempRamEnd) {\r
+    SetFspMemoryInitUpdDataPointer ((VOID *)(MemoryInitUpdPtr + OffsetGap));\r
+  }\r
+\r
+  //\r
+  // Update Platform data pointer in FSP Global Data\r
+  //\r
+  PlatformDataPtr = GetFspPlatformDataPointer ();\r
+  if (((UINT32)PlatformDataPtr >= BootLoaderTempRamStart) &&\r
+      ((UINT32)PlatformDataPtr <  BootLoaderTempRamEnd)) {\r
+    SetFspPlatformDataPointer ((UINT8 *)PlatformDataPtr + OffsetGap);\r
+  }\r
+}\r
diff --git a/IntelFsp2Pkg/Library/BaseFspPlatformLib/FspPlatformNotify.c b/IntelFsp2Pkg/Library/BaseFspPlatformLib/FspPlatformNotify.c
new file mode 100644 (file)
index 0000000..66b6cdb
--- /dev/null
@@ -0,0 +1,279 @@
+/** @file\r
+\r
+  Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <PiPei.h>\r
+#include <Library/PeiServicesLib.h>\r
+#include <Library/PeiServicesTablePointerLib.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/PcdLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/HobLib.h>\r
+#include <Library/FspSwitchStackLib.h>\r
+#include <Library/FspCommonLib.h>\r
+#include <Guid/EventGroup.h>\r
+#include <FspEas.h>\r
+#include <FspStatusCode.h>\r
+#include <Protocol/PciEnumerationComplete.h>\r
+#include <Library/ReportStatusCodeLib.h>\r
+#include <Library/PerformanceLib.h>\r
+extern EFI_GUID gFspPerformanceDataGuid;\r
+\r
+EFI_PEI_PPI_DESCRIPTOR      mPeiPostPciEnumerationPpi = {\r
+  (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
+  &gEfiPciEnumerationCompleteProtocolGuid,\r
+  NULL\r
+};\r
+\r
+EFI_PEI_PPI_DESCRIPTOR      mPeiReadyToBootPpi = {\r
+  (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
+  &gEfiEventReadyToBootGuid,\r
+  NULL\r
+};\r
+\r
+EFI_PEI_PPI_DESCRIPTOR      mPeiEndOfFirmwarePpi = {\r
+  (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
+  &gFspEventEndOfFirmwareGuid,\r
+  NULL\r
+};\r
+\r
+UINT32  mFspNotifySequence[] = {\r
+  EnumInitPhaseAfterPciEnumeration,\r
+  EnumInitPhaseReadyToBoot,\r
+  EnumInitPhaseEndOfFirmware\r
+};\r
+\r
+/**\r
+  Install FSP notification.\r
+\r
+  @param[in] NotificationCode  FSP notification code\r
+\r
+  @retval EFI_SUCCESS            Notify FSP successfully\r
+  @retval EFI_INVALID_PARAMETER  NotificationCode is invalid\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+FspNotificationHandler (\r
+  IN  UINT32     NotificationCode\r
+  )\r
+{\r
+  EFI_STATUS                Status;\r
+\r
+  Status   = EFI_SUCCESS;\r
+\r
+  switch (NotificationCode) {\r
+  case EnumInitPhaseAfterPciEnumeration:\r
+    //\r
+    // Do POST PCI initialization if needed\r
+    //\r
+    DEBUG ((DEBUG_INFO | DEBUG_INIT, "FSP Post PCI Enumeration ...\n"));\r
+    PeiServicesInstallPpi (&mPeiPostPciEnumerationPpi);\r
+    break;\r
+\r
+  case EnumInitPhaseReadyToBoot:\r
+    //\r
+    // Ready To Boot\r
+    //\r
+    DEBUG ((DEBUG_INFO| DEBUG_INIT, "FSP Ready To Boot ...\n"));\r
+    PeiServicesInstallPpi (&mPeiReadyToBootPpi);\r
+    break;\r
+\r
+  case EnumInitPhaseEndOfFirmware:\r
+    //\r
+    // End of Firmware\r
+    //\r
+    DEBUG ((DEBUG_INFO| DEBUG_INIT, "FSP End of Firmware ...\n"));\r
+    PeiServicesInstallPpi (&mPeiEndOfFirmwarePpi);\r
+    break;\r
+\r
+  default:\r
+    Status = EFI_INVALID_PARAMETER;\r
+    break;\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+  This function transfer control back to BootLoader after FspSiliconInit.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+FspSiliconInitDone (\r
+  VOID\r
+  )\r
+{\r
+  //\r
+  // This is the end of the FspSiliconInit API\r
+  // Give control back to the boot loader\r
+  //\r
+  SetFspMeasurePoint (FSP_PERF_ID_API_FSP_SILICON_INIT_EXIT);\r
+  DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspSiliconInitApi() - End\n"));\r
+\r
+  PERF_END_EX (&gFspPerformanceDataGuid, "EventRec", NULL, 0, 0x907F);\r
+\r
+  REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
+  SetFspApiReturnStatus (EFI_SUCCESS);\r
+\r
+  Pei2LoaderSwitchStack();\r
+\r
+  PERF_START_EX (&gFspPerformanceDataGuid, "EventRec", NULL, 0, 0x6000);\r
+}\r
+\r
+/**\r
+  This function returns control to BootLoader after MemoryInitApi.\r
+\r
+  @param[in,out] HobListPtr The address of HobList pointer.\r
+**/\r
+VOID\r
+EFIAPI\r
+FspMemoryInitDone (\r
+  IN OUT VOID   **HobListPtr\r
+  )\r
+{\r
+  //\r
+  // Calling use FspMemoryInit API\r
+  // Update HOB and return the control directly\r
+  //\r
+  if (HobListPtr != NULL) {\r
+    *HobListPtr = (VOID *) GetHobList ();\r
+  }\r
+\r
+  //\r
+  // This is the end of the FspMemoryInit API\r
+  // Give control back to the boot loader\r
+  //\r
+  SetFspMeasurePoint (FSP_PERF_ID_API_FSP_MEMORY_INIT_EXIT);\r
+  DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspMemoryInitApi() - End\n"));\r
+  REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_MEMORY_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
+  SetFspApiReturnStatus (EFI_SUCCESS);\r
+  Pei2LoaderSwitchStack ();\r
+\r
+  //\r
+  // The TempRamExitApi is called\r
+  //\r
+  if (GetFspApiCallingIndex () == TempRamExitApiIndex) {\r
+    SetPhaseStatusCode (FSP_STATUS_CODE_TEMP_RAM_EXIT);\r
+    REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_TEMP_RAM_EXIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
+    SetFspMeasurePoint (FSP_PERF_ID_API_TEMP_RAM_EXIT_ENTRY);\r
+    DEBUG ((DEBUG_INFO | DEBUG_INIT, "TempRamExitApi() - Begin\n"));\r
+  } else {\r
+    SetFspMeasurePoint (FSP_PERF_ID_API_FSP_SILICON_INIT_ENTRY);\r
+    DEBUG ((DEBUG_INFO | DEBUG_INIT, "FspSiliconInitApi() - Begin\n"));\r
+    SetPhaseStatusCode (FSP_STATUS_CODE_SILICON_INIT);\r
+    REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_SILICON_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
+  }\r
+}\r
+\r
+/**\r
+  This function returns control to BootLoader after TempRamExitApi.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+FspTempRamExitDone (\r
+  VOID\r
+  )\r
+{\r
+\r
+  //\r
+  // This is the end of the TempRamExit API\r
+  // Give control back to the boot loader\r
+  //\r
+  SetFspMeasurePoint (FSP_PERF_ID_API_TEMP_RAM_EXIT_EXIT);\r
+  DEBUG ((DEBUG_INFO | DEBUG_INIT, "TempRamExitApi() - End\n"));\r
+  REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_TEMP_RAM_EXIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
+  SetFspApiReturnStatus (EFI_SUCCESS);\r
+  Pei2LoaderSwitchStack ();\r
+\r
+  SetPhaseStatusCode (FSP_STATUS_CODE_SILICON_INIT);\r
+  SetFspMeasurePoint (FSP_PERF_ID_API_FSP_SILICON_INIT_ENTRY);\r
+  DEBUG ((DEBUG_INFO | DEBUG_INIT, "SiliconInitApi() - Begin\n"));\r
+  REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_SILICON_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
+}\r
+\r
+/**\r
+  This function handle NotifyPhase API call from the BootLoader.\r
+  It gives control back to the BootLoader after it is handled. If the\r
+  Notification code is a ReadyToBoot event, this function will return\r
+  and FSP continues the remaining execution until it reaches the DxeIpl.\r
+\r
+**/\r
+VOID\r
+FspWaitForNotify (\r
+  VOID\r
+  )\r
+{\r
+  EFI_STATUS                 Status;\r
+  UINT32                     NotificationValue;\r
+  UINT32                     NotificationCount;\r
+  UINT8                      Count;\r
+\r
+  NotificationCount = 0;\r
+  while (NotificationCount < sizeof(mFspNotifySequence) / sizeof(UINT32)) {\r
+\r
+    Count = (UINT8)((NotificationCount << 1) & 0x07);\r
+    SetFspMeasurePoint (FSP_PERF_ID_API_NOTIFY_POST_PCI_ENTRY + Count);\r
+\r
+    if (NotificationCount == 0) {\r
+      SetPhaseStatusCode (FSP_STATUS_CODE_POST_PCIE_ENUM_NOTIFICATION);\r
+      REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_POST_PCIE_ENUM_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
+    } else if (NotificationCount == 1) {\r
+      SetPhaseStatusCode (FSP_STATUS_CODE_READY_TO_BOOT_NOTIFICATION);\r
+      REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_READY_TO_BOOT_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
+    } else if (NotificationCount == 2) {\r
+      SetPhaseStatusCode (FSP_STATUS_CODE_END_OF_FIRMWARE_NOTIFICATION);\r
+      REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_END_OF_FIRMWARE_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
+    }\r
+\r
+    NotificationValue = ((NOTIFY_PHASE_PARAMS *)(UINTN)GetFspApiParameter ())->Phase;\r
+    DEBUG ((DEBUG_INFO | DEBUG_INIT, "NotifyPhaseApi() - Begin  [Phase: %08X]\n", NotificationValue));\r
+    if (mFspNotifySequence[NotificationCount] != NotificationValue) {\r
+      //\r
+      // Notify code does not follow the predefined order\r
+      //\r
+      DEBUG ((DEBUG_INFO, "Unsupported FSP Notification Value\n"));\r
+      Status = EFI_UNSUPPORTED;\r
+    } else {\r
+      //\r
+      // Process Notification and Give control back to the boot loader framework caller\r
+      //\r
+      Status = FspNotificationHandler (NotificationValue);\r
+      if (!EFI_ERROR(Status)) {\r
+        NotificationCount++;\r
+      }\r
+    }\r
+\r
+    SetFspApiReturnStatus(Status);\r
+    DEBUG ((DEBUG_INFO | DEBUG_INIT, "NotifyPhaseApi() - End  [Status: 0x%08X]\n", Status));\r
+\r
+    SetFspMeasurePoint (FSP_PERF_ID_API_NOTIFY_POST_PCI_EXIT + Count);\r
+\r
+    if ((NotificationCount - 1) == 0) {\r
+      REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_POST_PCIE_ENUM_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
+    } else if ((NotificationCount - 1) == 1) {\r
+      REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_READY_TO_BOOT_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
+    } else if ((NotificationCount - 1) == 2) {\r
+      REPORT_STATUS_CODE (EFI_PROGRESS_CODE, FSP_STATUS_CODE_END_OF_FIRMWARE_NOTIFICATION | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
+    }\r
+    Pei2LoaderSwitchStack();\r
+  }\r
+\r
+  //\r
+  // Control goes back to the PEI Core and it dispatches further PEIMs.\r
+  // DXEIPL is the final one to transfer control back to the boot loader.\r
+  //\r
+}\r
+\r
diff --git a/IntelFsp2Pkg/Library/BaseFspSwitchStackLib/BaseFspSwitchStackLib.inf b/IntelFsp2Pkg/Library/BaseFspSwitchStackLib/BaseFspSwitchStackLib.inf
new file mode 100644 (file)
index 0000000..bbeeb74
--- /dev/null
@@ -0,0 +1,43 @@
+## @file\r
+#  Instance of BaseFspSwitchStackLib\r
+#\r
+#  Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>\r
+#\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution. The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php.\r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+##\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = BaseFspSwitchStackLib\r
+  FILE_GUID                      = 68E79161-F7CE-4A61-8C72-F4DF6FF35CAA\r
+  MODULE_TYPE                    = BASE\r
+  VERSION_STRING                 = 1.0\r
+  LIBRARY_CLASS                  = FspSwitchStackLib\r
+\r
+[Sources.IA32]\r
+  FspSwitchStackLib.c\r
+\r
+[Sources.IA32]\r
+  Ia32/Stack.asm | MSFT\r
+  Ia32/Stack.s | GCC\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  IntelFsp2Pkg/IntelFsp2Pkg.dec\r
+\r
+[LibraryClasses]\r
+  BaseLib\r
+  IoLib\r
+\r
+[FixedPcd]\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspMaxPatchEntry      ## CONSUMES\r
+  gIntelFsp2PkgTokenSpaceGuid.PcdFspMaxPerfEntry       ## CONSUMES\r
+\r
+\r
+\r
diff --git a/IntelFsp2Pkg/Library/BaseFspSwitchStackLib/FspSwitchStackLib.c b/IntelFsp2Pkg/Library/BaseFspSwitchStackLib/FspSwitchStackLib.c
new file mode 100644 (file)
index 0000000..42a57a2
--- /dev/null
@@ -0,0 +1,42 @@
+/** @file\r
+\r
+  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <Base.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/FspCommonLib.h>\r
+\r
+/**\r
+\r
+  Switch the current stack to the previous saved stack.\r
+\r
+  @param[in]  NewStack         The new stack to be switched.\r
+\r
+  @return OldStack         After switching to the saved stack,\r
+                           this value will be saved in eax before returning.\r
+\r
+\r
+**/\r
+UINT32\r
+SwapStack (\r
+  IN  UINT32 NewStack\r
+  )\r
+{\r
+  FSP_GLOBAL_DATA  *FspData;\r
+  UINT32         OldStack;\r
+\r
+  FspData  = GetFspGlobalDataPointer ();\r
+  OldStack = FspData->CoreStack;\r
+  FspData->CoreStack = NewStack;\r
+  return OldStack;\r
+}\r
+\r
diff --git a/IntelFsp2Pkg/Library/BaseFspSwitchStackLib/Ia32/Stack.asm b/IntelFsp2Pkg/Library/BaseFspSwitchStackLib/Ia32/Stack.asm
new file mode 100644 (file)
index 0000000..1efab52
--- /dev/null
@@ -0,0 +1,77 @@
+;------------------------------------------------------------------------------\r
+;\r
+; Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>\r
+; This program and the accompanying materials\r
+; are licensed and made available under the terms and conditions of the BSD License\r
+; which accompanies this distribution.  The full text of the license may be found at\r
+; http://opensource.org/licenses/bsd-license.php.\r
+;\r
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+;\r
+; Abstract:\r
+;\r
+;   Switch the stack from temporary memory to permenent memory.\r
+;\r
+;------------------------------------------------------------------------------\r
+\r
+    .586p\r
+    .model  flat,C\r
+    .code\r
+\r
+;------------------------------------------------------------------------------\r
+; UINT32\r
+; EFIAPI\r
+; Pei2LoaderSwitchStack (\r
+;   VOID\r
+;   )\r
+;------------------------------------------------------------------------------\r
+EXTERNDEF  C   MeasurePoint:PROC\r
+Pei2LoaderSwitchStack   PROC C PUBLIC\r
+    xor     eax, eax\r
+    jmp     FspSwitchStack\r
+Pei2LoaderSwitchStack   ENDP\r
+\r
+;------------------------------------------------------------------------------\r
+; UINT32\r
+; EFIAPI\r
+; Loader2PeiSwitchStack (\r
+;   VOID\r
+;   )\r
+;------------------------------------------------------------------------------\r
+Loader2PeiSwitchStack   PROC C PUBLIC\r
+    jmp     FspSwitchStack\r
+Loader2PeiSwitchStack   ENDP\r
+\r
+;------------------------------------------------------------------------------\r
+; UINT32\r
+; EFIAPI\r
+; FspSwitchStack (\r
+;   VOID\r
+;   )\r
+;------------------------------------------------------------------------------\r
+EXTERNDEF  C   SwapStack:PROC\r
+FspSwitchStack   PROC C PUBLIC\r
+    ; Save current contexts\r
+    push    eax\r
+    pushfd\r
+    cli\r
+    pushad\r
+    sub     esp, 8\r
+    sidt    fword ptr [esp]\r
+\r
+    ; Load new stack\r
+    push    esp\r
+    call    SwapStack\r
+    mov     esp, eax\r
+\r
+    ; Restore previous contexts\r
+    lidt    fword ptr [esp]\r
+    add     esp, 8\r
+    popad\r
+    popfd\r
+    add     esp, 4\r
+    ret\r
+FspSwitchStack   ENDP\r
+\r
+    END\r
diff --git a/IntelFsp2Pkg/Library/BaseFspSwitchStackLib/Ia32/Stack.s b/IntelFsp2Pkg/Library/BaseFspSwitchStackLib/Ia32/Stack.s
new file mode 100644 (file)
index 0000000..a21a5b6
--- /dev/null
@@ -0,0 +1,78 @@
+#------------------------------------------------------------------------------\r
+#\r
+# Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>\r
+# This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution.  The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php.\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+# Abstract:\r
+#\r
+#   Switch the stack from temporary memory to permenent memory.\r
+#\r
+#------------------------------------------------------------------------------\r
+\r
+\r
+#------------------------------------------------------------------------------\r
+# UINT32\r
+# EFIAPI\r
+# Pei2LoaderSwitchStack (\r
+#   VOID\r
+#   )\r
+#------------------------------------------------------------------------------\r
+ASM_GLOBAL ASM_PFX(Pei2LoaderSwitchStack)\r
+ASM_PFX(Pei2LoaderSwitchStack):\r
+    xorl    %eax, %eax\r
+    jmp     ASM_PFX(FspSwitchStack)\r
+\r
+#------------------------------------------------------------------------------\r
+# UINT32\r
+# EFIAPI\r
+# Loader2PeiSwitchStack (\r
+#   VOID\r
+#   )\r
+#------------------------------------------------------------------------------\r
+ASM_GLOBAL ASM_PFX(Loader2PeiSwitchStack)\r
+ASM_PFX(Loader2PeiSwitchStack):\r
+    jmp     ASM_PFX(FspSwitchStack)\r
+\r
+#------------------------------------------------------------------------------\r
+# UINT32\r
+# EFIAPI\r
+# FspSwitchStack (\r
+#   VOID\r
+#   )\r
+#------------------------------------------------------------------------------\r
+ASM_GLOBAL ASM_PFX(FspSwitchStack)\r
+ASM_PFX(FspSwitchStack):\r
+    #\r
+    #Save current contexts\r
+    #\r
+    push    %eax\r
+    pushf\r
+    cli\r
+    pusha\r
+    sub     $0x08, %esp\r
+    sidt    (%esp)\r
+\r
+    #\r
+    # Load new stack\r
+    #\r
+    push   %esp\r
+    call   ASM_PFX(SwapStack)\r
+    movl   %eax, %esp\r
+\r
+    #\r
+    # Restore previous contexts\r
+    #\r
+    lidt    (%esp)\r
+    add     $0x08,%esp\r
+    popa\r
+    popf\r
+    add     $0x04,%esp\r
+    ret\r
+\r
+\r
diff --git a/IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/Ia32/Flat32.asm b/IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/Ia32/Flat32.asm
new file mode 100644 (file)
index 0000000..9f144fc
--- /dev/null
@@ -0,0 +1,131 @@
+;; @file\r
+;  This is the code that goes from real-mode to protected mode.\r
+;  It consumes the reset vector, configures the stack.\r
+;\r
+; Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>\r
+; This program and the accompanying materials\r
+; are licensed and made available under the terms and conditions of the BSD License\r
+; which accompanies this distribution.  The full text of the license may be found at\r
+; http://opensource.org/licenses/bsd-license.php.\r
+;\r
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+;;\r
+\r
+;\r
+; Define assembler characteristics\r
+;\r
+.586p\r
+.xmm\r
+.model flat, c\r
+\r
+EXTRN   TempRamInitApi:NEAR\r
+\r
+.code \r
+\r
+RET_ESI  MACRO\r
+\r
+  movd    esi, mm7                      ; restore ESP from MM7\r
+  jmp     esi\r
+\r
+ENDM\r
+\r
+;\r
+; Perform early platform initialization\r
+;\r
+SecPlatformInit    PROC    NEAR    PUBLIC\r
+\r
+  RET_ESI\r
+\r
+SecPlatformInit    ENDP\r
+\r
+;\r
+; Protected mode portion initializes stack, configures cache, and calls C entry point\r
+;\r
+\r
+;----------------------------------------------------------------------------\r
+;\r
+; Procedure:    ProtectedModeEntryPoint\r
+;\r
+; Input:        Executing in 32 Bit Protected (flat) mode\r
+;               cs: 0-4GB\r
+;               ds: 0-4GB\r
+;               es: 0-4GB\r
+;               fs: 0-4GB\r
+;               gs: 0-4GB\r
+;               ss: 0-4GB\r
+;\r
+; Output:       This function never returns\r
+;\r
+; Destroys:\r
+;               ecx\r
+;               edi\r
+;               esi\r
+;               esp\r
+;\r
+; Description:\r
+;               Perform any essential early platform initilaisation\r
+;               Setup a stack\r
+;\r
+;----------------------------------------------------------------------------\r
+\r
+ProtectedModeEntryPoint PROC NEAR C PUBLIC\r
+  ;\r
+  ; Dummy function. Consume 2 API to make sure they can be linked.\r
+  ;\r
+  mov  eax, TempRamInitApi\r
+\r
+  ; Should never return\r
+  jmp  $\r
+\r
+ProtectedModeEntryPoint ENDP\r
+\r
+;\r
+; ROM-based Global-Descriptor Table for the PEI Phase\r
+;\r
+align 16\r
+PUBLIC  BootGdtTable\r
+\r
+;\r
+; GDT[0]: 0x00: Null entry, never used.\r
+;\r
+NULL_SEL        equ     $ - GDT_BASE        ; Selector [0]\r
+GDT_BASE:\r
+BootGdtTable    DD      0\r
+                DD      0\r
+;\r
+; Linear code segment descriptor\r
+;\r
+LINEAR_CODE_SEL equ     $ - GDT_BASE        ; Selector [0x8]\r
+        DW      0FFFFh                      ; limit 0xFFFF\r
+        DW      0                           ; base 0\r
+        DB      0\r
+        DB      09Bh                        ; present, ring 0, data, expand-up, not-writable\r
+        DB      0CFh                        ; page-granular, 32-bit\r
+        DB      0\r
+;\r
+; System data segment descriptor\r
+;\r
+SYS_DATA_SEL    equ     $ - GDT_BASE        ; Selector [0x10]\r
+        DW      0FFFFh                      ; limit 0xFFFF\r
+        DW      0                           ; base 0\r
+        DB      0\r
+        DB      093h                        ; present, ring 0, data, expand-up, not-writable\r
+        DB      0CFh                        ; page-granular, 32-bit\r
+        DB      0\r
+\r
+GDT_SIZE        EQU     $ - BootGDTtable    ; Size, in bytes\r
+\r
+;\r
+; GDT Descriptor\r
+;\r
+GdtDesc:                                    ; GDT descriptor\r
+        DW      GDT_SIZE - 1                ; GDT limit\r
+        DD      OFFSET BootGdtTable         ; GDT base address\r
+\r
+ProtectedModeEntryLinearAddress   LABEL   FWORD\r
+ProtectedModeEntryLinearOffset    LABEL   DWORD\r
+  DD      OFFSET ProtectedModeEntryPoint  ; Offset of our 32 bit code\r
+  DW      LINEAR_CODE_SEL\r
+  \r
+END\r
diff --git a/IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/Ia32/Flat32.s b/IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/Ia32/Flat32.s
new file mode 100644 (file)
index 0000000..d46d792
--- /dev/null
@@ -0,0 +1,110 @@
+#------------------------------------------------------------------------------\r
+#\r
+# Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>\r
+# This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution.  The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php.\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+# Abstract:\r
+#\r
+#  This is the code that goes from real-mode to protected mode.\r
+#  It consumes the reset vector, configures the stack.\r
+#\r
+#------------------------------------------------------------------------------\r
+\r
+\r
+#\r
+# Contrary to the name, this file contains 16 bit code as well.\r
+#\r
+.text\r
+\r
+ASM_GLOBAL ASM_PFX(SecPlatformInit)\r
+ASM_PFX(SecPlatformInit):\r
+  movd    %mm7, %esi                      # restore ESP from MM7\r
+  jmp     *%esi\r
+\r
+#----------------------------------------------------------------------------\r
+#\r
+# Procedure:    ProtectedModeEntryPoint\r
+#\r
+# Input:        Executing in 32 Bit Protected (flat) mode\r
+#               cs: 0-4GB\r
+#               ds: 0-4GB\r
+#               es: 0-4GB\r
+#               fs: 0-4GB\r
+#               gs: 0-4GB\r
+#               ss: 0-4GB\r
+#\r
+# Output:       This function never returns\r
+#\r
+# Destroys:\r
+#               ecx\r
+#               edi\r
+#               esi\r
+#               esp\r
+#\r
+# Description:\r
+#               Perform any essential early platform initilaisation\r
+#               Setup a stack\r
+#\r
+#----------------------------------------------------------------------------\r
+ProtectedModeEntryPoint:\r
+  #\r
+  # Dummy function. Consume 2 API to make sure they can be linked.\r
+  #\r
+  movl   ASM_PFX(TempRamInitApi), %eax\r
+  #\r
+  # Should never return\r
+  #\r
+  jmp     . #'$'\r
+\r
+#\r
+# ROM-based Global-Descriptor Table for the PEI Phase\r
+#\r
+.align 16\r
+#\r
+# GDT[0]: 000h: Null entry, never used.\r
+#\r
+.equ   NULL_SEL, . - GDT_BASE         # Selector [0]\r
+GDT_BASE: \r
+BootGdtTable:   \r
+        .long   0\r
+        .long   0\r
+#\r
+# Linear code segment descriptor\r
+#\r
+.equ     LINEAR_CODE_SEL, . - GDT_BASE         # Selector [08h]\r
+        .word   0xFFFF                      # limit 0FFFFh\r
+        .word   0                           # base 0\r
+        .byte   0\r
+        .byte   0x9B                        # present, ring 0, data, expand-up, not-writable\r
+        .byte   0xCF                        # page-granular, 32-bit\r
+        .byte   0\r
+#\r
+# System data segment descriptor\r
+#\r
+.equ    SYS_DATA_SEL, . - GDT_BASE         # Selector [010h]\r
+        .word   0xFFFF                      # limit 0FFFFh\r
+        .word   0                           # base 0\r
+        .byte   0\r
+        .byte   0x93                        # present, ring 0, data, expand-up, not-writable\r
+        .byte   0xCF                        # page-granular, 32-bit\r
+        .byte   0\r
+\r
+.equ            GDT_SIZE, . - BootGdtTable  # Size, in bytes\r
+\r
+#\r
+# GDT Descriptor\r
+#\r
+GdtDesc:                                     # GDT descriptor\r
+       .word    GDT_SIZE - 1               \r
+       .long    BootGdtTable        \r
+\r
+ProtectedModeEntryLinearAddress:\r
+ProtectedModeEntryLinearOffset:\r
+       .long    ProtectedModeEntryPoint\r
+       .word    LINEAR_CODE_SEL\r
diff --git a/IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/Ia32/SecCarInit.asm b/IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/Ia32/SecCarInit.asm
new file mode 100644 (file)
index 0000000..31296e0
--- /dev/null
@@ -0,0 +1,51 @@
+;; @file\r
+;  SEC CAR function\r
+;\r
+; Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
+; This program and the accompanying materials\r
+; are licensed and made available under the terms and conditions of the BSD License\r
+; which accompanies this distribution.  The full text of the license may be found at\r
+; http://opensource.org/licenses/bsd-license.php.\r
+;\r
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+;;\r
+\r
+;\r
+; Define assembler characteristics\r
+;\r
+.586p\r
+.xmm\r
+.model flat, c\r
+\r
+RET_ESI  MACRO\r
+\r
+  movd    esi, mm7                      ; move ReturnAddress from MM7 to ESI\r
+  jmp     esi\r
+\r
+ENDM\r
+\r
+.code \r
+\r
+;-----------------------------------------------------------------------------\r
+;\r
+;  Section:     SecCarInit\r
+;\r
+;  Description: This function initializes the Cache for Data, Stack, and Code\r
+;\r
+;-----------------------------------------------------------------------------\r
+SecCarInit    PROC    NEAR    PUBLIC\r
+\r
+  ;\r
+  ; Set up CAR\r
+  ;\r
+\r
+  xor    eax, eax\r
+\r
+SecCarInitExit:\r
+\r
+  RET_ESI\r
+\r
+SecCarInit    ENDP\r
+\r
+END\r
diff --git a/IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/Ia32/SecCarInit.s b/IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/Ia32/SecCarInit.s
new file mode 100644 (file)
index 0000000..7bd40df
--- /dev/null
@@ -0,0 +1,37 @@
+#------------------------------------------------------------------------------\r
+#\r
+# Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
+# This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution.  The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php.\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+# Abstract:\r
+#\r
+#  SEC CAR function\r
+#\r
+#------------------------------------------------------------------------------\r
+\r
+#-----------------------------------------------------------------------------\r
+#\r
+#  Section:     SecCarInit\r
+#\r
+#  Description: This function initializes the Cache for Data, Stack, and Code\r
+#\r
+#-----------------------------------------------------------------------------\r
+ASM_GLOBAL ASM_PFX(SecCarInit)\r
+ASM_PFX(SecCarInit):\r
+\r
+  #\r
+  # Set up CAR\r
+  #\r
+\r
+  xor     %eax, %eax\r
+\r
+SecCarInitExit:\r
+\r
+  movd       %mm7, %esi                      #RET_ESI\r
+  jmp        *%esi\r
diff --git a/IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/PlatformSecLibNull.c b/IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/PlatformSecLibNull.c
new file mode 100644 (file)
index 0000000..7bb95a9
--- /dev/null
@@ -0,0 +1,33 @@
+/** @file\r
+  Null instance of Platform Sec Lib.\r
+\r
+  Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php.\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <PiPei.h>\r
+#include <Library/FspCommonLib.h>\r
+\r
+/**\r
+  This function check the signture of UPD.\r
+\r
+  @param[in]  ApiIdx           Internal index of the FSP API.\r
+  @param[in]  ApiParam         Parameter of the FSP API.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+FspUpdSignatureCheck (\r
+  IN UINT32   ApiIdx,\r
+  IN VOID     *ApiParam\r
+  )\r
+{\r
+  return EFI_SUCCESS;\r