summaryrefslogtreecommitdiff
path: root/Core/EM/TCG2/TpmClearOnRollback
diff options
context:
space:
mode:
Diffstat (limited to 'Core/EM/TCG2/TpmClearOnRollback')
-rw-r--r--Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollback.c132
-rw-r--r--Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollback.cif17
-rw-r--r--Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollback.dxs75
-rw-r--r--Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollback.h69
-rw-r--r--Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollback.mak107
-rw-r--r--Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollback.sdl41
-rw-r--r--Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollbackSmiFlash.c160
-rw-r--r--Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollbackWrapperLib.c584
-rw-r--r--Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollbackWrapperLib.h198
9 files changed, 1383 insertions, 0 deletions
diff --git a/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollback.c b/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollback.c
new file mode 100644
index 0000000..2203432
--- /dev/null
+++ b/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollback.c
@@ -0,0 +1,132 @@
+//*************************************************************************
+//*************************************************************************
+//** **
+//** (C)Copyright 1985-2011, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//*************************************************************************
+//*************************************************************************
+//**********************************************************************
+// $Header: /Alaska/SOURCE/Modules/TCG2/Common/TpmClearOnRollback/TpmClearOnRollback.c 1 4/21/14 2:18p Fredericko $
+//
+// $Revision: 1 $
+//
+// $Date: 4/21/14 2:18p $
+//**********************************************************************
+// Revision History
+// ----------------
+// $Log: /Alaska/SOURCE/Modules/TCG2/Common/TpmClearOnRollback/TpmClearOnRollback.c $
+//
+// 1 4/21/14 2:18p Fredericko
+//
+// 1 10/08/13 12:06p Fredericko
+// Initial Check-In for Tpm-Next module
+//
+// 1 7/10/13 5:57p Fredericko
+// [TAG] EIP120969
+// [Category] New Feature
+// [Description] TCG (TPM20)
+//**********************************************************************
+//<AMI_FHDR_START>
+//---------------------------------------------------------------------------
+// Name: TpmClearOnRollback
+//
+//
+//
+//---------------------------------------------------------------------------
+//<AMI_FHDR_END>
+#include "TpmClearOnRollback.h"
+#include <Protocol/AmiPostMgr.h>
+#include <PPI/FwVersion.h>
+#include <Hob.h>
+#include <Token.h>
+#include <AmiHobs.h>
+
+VOID DrawMessageBox(
+ IN CHAR16 *Caption,
+ IN CHAR16 *Message
+);
+
+
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: RecoveryClearTpmBeforeFlash
+//
+// Description:
+// Process TPM clear on Rollback policy
+//
+// Input:
+// VOID
+//
+// Output:
+// VOID
+//
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+VOID RecoveryClearTpmBeforeFlash (VOID){
+ UINT8 ClearResults;
+ AMI_POST_MANAGER_PROTOCOL *TpmClearAmiPostMgr = NULL;
+ FW_VERSION Fid;
+ EFI_EVENT MyEvent;
+ FW_VERSION RecoveryFid;
+ EFI_HOB_HANDOFF_INFO_TABLE *TpmpHit;
+ EFI_GUID myGuidHob = HOB_LIST_GUID;
+ EFI_GUID TpmRecoveryHobGuid = AMI_RECOVERY_IMAGE_HOB_GUID;
+ UINT32 ProjectVersion, NewProjectVersion;
+ EFI_GUID gAmiPostManagerProtocolGuid = \
+ AMI_POST_MANAGER_PROTOCOL_GUID;
+ EFI_STATUS Status;
+
+ TpmpHit = GetEfiConfigurationTable(pST, &myGuidHob);
+ if(TpmpHit != NULL && !EFI_ERROR(FindNextHobByGuid(&TpmRecoveryHobGuid, &TpmpHit))) {
+
+ TpmGetFidFromBuffer(&RecoveryFid, (VOID *)(UINTN)((RECOVERY_IMAGE_HOB*)TpmpHit)->Address);
+ }
+
+ TpmRecoveryGetFidFromFv(&Fid);
+
+ ProjectVersion = Fid.ProjectMajorVersion[0] + Fid.ProjectMajorVersion[1] + Fid.ProjectMajorVersion[2];
+ ProjectVersion <<= 16;
+ ProjectVersion += Fid.ProjectMinorVersion[0] + Fid.ProjectMinorVersion[1] + Fid.ProjectMinorVersion[2];
+
+ NewProjectVersion = RecoveryFid.ProjectMajorVersion[0] + RecoveryFid.ProjectMajorVersion[1] + RecoveryFid.ProjectMajorVersion[2];
+ NewProjectVersion <<= 16;
+ NewProjectVersion += RecoveryFid.ProjectMinorVersion[0] + RecoveryFid.ProjectMinorVersion[1] + RecoveryFid.ProjectMinorVersion[2];
+
+ if(NewProjectVersion < ProjectVersion){
+ ClearResults = ClearTpmBeforeFlash();
+ if(ClearResults == TPM_CLEAR_RESET_REQUIRED)
+ {
+ Status = pBS->LocateProtocol(&gAmiPostManagerProtocolGuid, NULL, &TpmClearAmiPostMgr);
+ if(EFI_ERROR(Status))return;
+
+ if(TpmClearAmiPostMgr != NULL) {
+ Status = TpmClearAmiPostMgr->DisplayInfoBox(L"TPM CLEAR",\
+ L"Caution: A Reset is required to Clear the TPM for Flash Update. Enable Recovery after reset",20, &MyEvent);
+
+ FixedDelay(1000000); //10seconds delay
+ }
+
+ pRS->ResetSystem( EfiResetCold, 0, 0, NULL );
+ }
+ }
+}
+//*************************************************************************
+//*************************************************************************
+//** **
+//** (C)Copyright 1985-2010, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//*************************************************************************
+//*************************************************************************
diff --git a/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollback.cif b/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollback.cif
new file mode 100644
index 0000000..62c2814
--- /dev/null
+++ b/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollback.cif
@@ -0,0 +1,17 @@
+<component>
+ name = "TpmClearOnRollback"
+ category = ModulePart
+ LocalRoot = "Core\EM\TCG2\TpmClearOnRollback\"
+ RefName = "TpmClearOnRollback"
+[files]
+"TpmClearOnRollback.c"
+"TpmClearOnRollback.h"
+"TpmClearOnRollback.sdl"
+"TpmClearOnRollback.mak"
+"TpmClearOnRollback.dxs"
+"TpmClearOnRollbackSmiFlash.c"
+"TpmClearOnRollbackWrapperLib.c"
+"TpmClearOnRollbackWrapperLib.h"
+[parts]
+"AmiTpmClearOnRollbackProtocol"
+<endComponent>
diff --git a/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollback.dxs b/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollback.dxs
new file mode 100644
index 0000000..c5f6e32
--- /dev/null
+++ b/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollback.dxs
@@ -0,0 +1,75 @@
+//*************************************************************************
+//*************************************************************************
+//** **
+//** (C)Copyright 1985-2010, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//*************************************************************************
+//*************************************************************************
+//*************************************************************************
+//*************************************************************************
+// $Header: /Alaska/SOURCE/Modules/TCG2/Common/TpmClearOnRollback/TpmClearOnRollback.dxs 1 4/21/14 2:18p Fredericko $
+//
+// $Revision: 1 $
+//
+// $Date: 4/21/14 2:18p $
+//*************************************************************************
+// Revision History
+// ----------------
+// $Log: /Alaska/SOURCE/Modules/TCG2/Common/TpmClearOnRollback/TpmClearOnRollback.dxs $
+//
+// 1 4/21/14 2:18p Fredericko
+//
+// 1 10/08/13 12:06p Fredericko
+// Initial Check-In for Tpm-Next module
+//
+// 1 7/10/13 5:57p Fredericko
+// [TAG] EIP120969
+// [Category] New Feature
+// [Description] TCG (TPM20)
+//
+// 3 7/25/11 3:21a Fredericko
+// [TAG] EIP65177
+// [Category] Spec Update
+// [Severity] Minor
+// [Description] TCG Ppi Sec ver 1.2 update
+//
+// 2 5/20/10 8:54a Fredericko
+//
+// Included File Header
+// Included File Revision History
+// EIP 37653
+//
+//*************************************************************************
+//<AMI_FHDR_START>
+//
+// Name: TCGSmm.dxs
+//
+// Description:
+// Dependency for TcgSmm
+//
+//<AMI_FHDR_END>
+//*************************************************************************
+#include <Protocol\SmmBase2.h>
+
+DEPENDENCY_START
+ EFI_SMM_BASE2_PROTOCOL_GUID
+DEPENDENCY_END
+//*************************************************************************
+//*************************************************************************
+//*************************************************************************
+//** **
+//** (C)Copyright 1985-2010, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//*************************************************************************
diff --git a/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollback.h b/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollback.h
new file mode 100644
index 0000000..23be079
--- /dev/null
+++ b/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollback.h
@@ -0,0 +1,69 @@
+//*************************************************************************
+//*************************************************************************
+//** **
+//** (C)Copyright 1985-2011, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//*************************************************************************
+//*************************************************************************
+//**********************************************************************
+// $Header: /Alaska/SOURCE/Modules/TCG2/Common/TpmClearOnRollback/TpmClearOnRollback.h 1 4/21/14 2:18p Fredericko $
+//
+// $Revision: 1 $
+//
+// $Date: 4/21/14 2:18p $
+//**********************************************************************
+// Revision History
+// ----------------
+// $Log: /Alaska/SOURCE/Modules/TCG2/Common/TpmClearOnRollback/TpmClearOnRollback.h $
+//
+// 1 4/21/14 2:18p Fredericko
+//
+// 1 10/08/13 12:06p Fredericko
+// Initial Check-In for Tpm-Next module
+//
+// 1 7/10/13 5:57p Fredericko
+// [TAG] EIP120969
+// [Category] New Feature
+// [Description] TCG (TPM20)
+//
+//
+//**********************************************************************
+//<AMI_FHDR_START>
+//----------------------------------------------------------------------------
+//
+// Name:
+//
+// Description:
+//
+//----------------------------------------------------------------------------
+//<AMI_FHDR_END>
+#ifndef _TPM_CLEAR_ON_ROLLBACK_H
+#define _TPM_CLEAR_ON_ROLLBACK_H
+
+#include <AmiDxeLib.h>
+#include <Protocol\TcgService.h>
+#include <TCGMisc.h>
+#include <Protocol\SmmBase2.h>
+#include <Protocol\AmiTpmClearOnRollbackProtocol.h>
+#include "TpmClearOnRollbackWrapperLib.h"
+
+#endif
+//*************************************************************************
+//*************************************************************************
+//** **
+//** (C)Copyright 1985-2011, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//*************************************************************************
+//************************************************************************* \ No newline at end of file
diff --git a/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollback.mak b/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollback.mak
new file mode 100644
index 0000000..f0423be
--- /dev/null
+++ b/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollback.mak
@@ -0,0 +1,107 @@
+#*************************************************************************
+#*************************************************************************
+#** **
+#** (C)Copyright 1985-2011, American Megatrends, Inc. **
+#** **
+#** All Rights Reserved. **
+#** **
+#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+#** **
+#** Phone: (770)-246-8600 **
+#** **
+#*************************************************************************
+#*************************************************************************
+
+#**********************************************************************
+# $Header: /Alaska/SOURCE/Modules/TCG2/Common/TpmClearOnRollback/TpmClearOnRollback.mak 1 4/21/14 2:18p Fredericko $
+#
+# $Revision: 1 $
+#
+# $Date: 4/21/14 2:18p $
+#**********************************************************************
+# Revision History
+# ----------------
+# $Log: /Alaska/SOURCE/Modules/TCG2/Common/TpmClearOnRollback/TpmClearOnRollback.mak $
+#
+# 1 4/21/14 2:18p Fredericko
+#
+# 1 10/08/13 12:06p Fredericko
+# Initial Check-In for Tpm-Next module
+#
+# 2 10/03/13 2:48p Fredericko
+#
+# 1 7/10/13 5:57p Fredericko
+# [TAG] EIP120969
+# [Category] New Feature
+# [Description] TCG (TPM20)
+#
+#
+#**********************************************************************
+#<AMI_FHDR_START>
+#
+# Name:
+#
+# Description:
+#
+#<AMI_FHDR_END>
+#**********************************************************************
+all : BuildTpmClearOnRollbackWrapperLib TPMCLEARONROLLBACK
+
+TPMCLEARONROLLBACK : $(BUILD_DIR)\TpmClearOnRollback.mak TpmClearRollBackSmmBin
+
+BuildTpmClearOnRollbackWrapperLib: $(BUILD_DIR)\TpmClearOnRollback.mak TpmClearOnRollbackWrapperLibBin
+$(TpmClearOnRollbackWrapperLib): BuildTpmClearOnRollbackWrapperLib
+
+$(BUILD_DIR)\TpmClearOnRollback.mak : $(TPMCLEARONROLLBACK_DIR)\$(@B).cif $(TPMCLEARONROLLBACK_DIR)\$(@B).mak $(BUILD_RULES)
+ $(CIF2MAK) $(TPMCLEARONROLLBACK_DIR)\$(@B).cif $(CIF2MAK_DEFAULTS)
+
+TCGCLEAR_CFLAGS=$(CFLAGS) \
+ /I$(TCG_DIR)\
+ /I$(TCG_DIR)\Common\
+ /I$(PROJECT_DIR)\Include\Protocol\
+ /I$(TCG_DIR)\Protocol
+
+
+TPM_CLEAR_ON_ROLLBACK_WRAPPEER_OBJS = \
+$(BUILD_DIR)\$(TPMCLEARONROLLBACK_DIR)\TpmClearOnRollbackWrapperLib.obj
+
+TpmClearOnRollbackWrapperLibBin: $(tcgLibLite)
+ $(MAKE) /$(MAKEFLAGS) $(BUILD_DEFAULTS)\
+ /f $(BUILD_DIR)\TpmClearOnRollback.mak all\
+ "CFLAGS=$(TCGCLEAR_CFLAGS)" \
+ "OBJECTS=$(TPM_CLEAR_ON_ROLLBACK_WRAPPEER_OBJS)"\
+ TYPE=LIBRARY \
+ LIBRARY_NAME=$(TpmClearOnRollbackWrapperLib)
+
+TCGCLEAR_OBJECTS = \
+$(BUILD_DIR)\$(TPMCLEARONROLLBACK_DIR)\TpmClearOnRollbackSmiFlash.obj
+
+ReFlashBin: $(BUILD_DIR)\$(TCG)\TpmClearOnRollback.obj $(TpmClearOnRollbackWrapperLib)
+
+$(BUILD_DIR)\$(TCG)\TpmClearOnRollback.obj : $(TPMCLEARONROLLBACK_DIR)\TpmClearOnRollback.obj
+ $(CC) $(TCGCLEAR_CFLAGS) /Fo$(BUILD_DIR)\$(TCG)\TpmClearOnRollback.obj $(TPMCLEARONROLLBACK_DIR)\TpmClearOnRollback.c
+
+TpmClearRollBackSmmBin : $(TpmClearOnRollbackWrapperLib) $(AMIDXELIB)
+ $(MAKE) /$(MAKEFLAGS) $(BUILD_DEFAULTS) \
+ /f $(BUILD_DIR)\TpmClearOnRollback.mak all \
+ GUID=FD2CB3F1-9520-4c24-BCB3-2C73F0C2B7EC \
+ "CFLAGS=$(TCGCLEAR_CFLAGS)" \
+ ENTRY_POINT=TpmClearRollBackSmmInit \
+ TYPE=BS_DRIVER \
+ "OBJECTS=$(TCGCLEAR_OBJECTS)"\
+ DEPEX1=$(TPMCLEARONROLLBACK_DIR)\TpmClearOnRollback.DXS \
+ COMPRESS=1 \
+
+#*************************************************************************
+#*************************************************************************
+#** **
+#** (C)Copyright 1985-2010, American Megatrends, Inc. **
+#** **
+#** All Rights Reserved. **
+#** **
+#** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+#** **
+#** Phone: (770)-246-8600 **
+#** **
+#*************************************************************************
+#*************************************************************************
diff --git a/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollback.sdl b/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollback.sdl
new file mode 100644
index 0000000..b616dae
--- /dev/null
+++ b/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollback.sdl
@@ -0,0 +1,41 @@
+TOKEN
+ Name = "TPMCLEARONROLLBACK_SUPPORT"
+ Value = "1"
+ Help = "Main switch to enable TcgPlatformSetupPolicy support in Project"
+ TokenType = Boolean
+ TargetH = Yes
+ TargetEQU = Yes
+ TargetMAK = Yes
+ Master = Yes
+ Token = "TPM12Enabled" "!=" "0"
+End
+
+
+PATH
+ Name = "TPMCLEARONROLLBACK_DIR"
+End
+
+MODULE
+ Help = "Includes AmtPlatformPolicy.mak to Project"
+ File = "TpmClearOnRollback.mak"
+End
+
+TOKEN
+ Name = "TpmClearOnRollbackWrapperLib"
+ Value = "$(BUILD_DIR)\TpmClearOnRollbackWrapperLib.lib"
+ TokenType = Expression
+ TargetMAK = Yes
+End
+
+
+ELINK
+ Name = "RecoveryClearTpmBeforeFlash,"
+ Parent = "OemBeforeFlashUpdateList"
+ InvokeOrder = AfterParent
+End
+
+ELINK
+ Name = "$(BUILD_DIR)\TpmClearOnRollback.ffs"
+ Parent = "FV_MAIN"
+ InvokeOrder = AfterParent
+End \ No newline at end of file
diff --git a/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollbackSmiFlash.c b/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollbackSmiFlash.c
new file mode 100644
index 0000000..720940b
--- /dev/null
+++ b/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollbackSmiFlash.c
@@ -0,0 +1,160 @@
+//*************************************************************************
+//*************************************************************************
+//** **
+//** (C)Copyright 1985-2011, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//*************************************************************************
+//*************************************************************************
+//**********************************************************************
+// $Header: /Alaska/SOURCE/Modules/TCG2/Common/TpmClearOnRollback/TpmClearOnRollbackSmiFlash.c 1 4/21/14 2:18p Fredericko $
+//
+// $Revision: 1 $
+//
+// $Date: 4/21/14 2:18p $
+//**********************************************************************
+// Revision History
+// ----------------
+// $Log: /Alaska/SOURCE/Modules/TCG2/Common/TpmClearOnRollback/TpmClearOnRollbackSmiFlash.c $
+//
+// 1 4/21/14 2:18p Fredericko
+//
+// 1 10/08/13 12:06p Fredericko
+// Initial Check-In for Tpm-Next module
+//
+// 1 7/10/13 5:57p Fredericko
+// [TAG] EIP120969
+// [Category] New Feature
+// [Description] TCG (TPM20)
+//**********************************************************************
+//<AMI_FHDR_START>
+//---------------------------------------------------------------------------
+// Name:
+//
+//
+//
+//---------------------------------------------------------------------------
+//<AMI_FHDR_END>
+#include "TpmClearOnRollback.h"
+#include <Protocol/AmiPostMgr.h>
+
+CLEAR_TPM_ROLLBACK_PROTOCOL *PrivateProtocol;
+EFI_SMM_SYSTEM_TABLE2 *mSmst;
+static FW_VERSION Fid;
+
+
+UINT8 SmiFlashClearTpmBeforeFlash (){
+ return(ClearTpmBeforeFlash());
+}
+
+//**********************************************************************
+//<AMI_PHDR_START>
+//
+// Procedure: InstallTpmClearProtocolInSmm
+//
+// Description: InstallTcgSmmFlash Protocol
+//
+//
+// Input: IN EFI_HANDLE ImageHandle,
+// IN EFI_SYSTEM_TABLE *SystemTable
+//
+// Output: EFI_STATUS
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//<AMI_PHDR_END>
+//**********************************************************************
+EFI_STATUS InstallTpmClearProtocolInSmm(
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable )
+{
+ EFI_SMM_BASE2_PROTOCOL *SmmBase;
+ EFI_HANDLE Handle=NULL;
+ EFI_STATUS Status;
+ EFI_GUID TpmRollbackSmmGuid = \
+ AMI_TPM_ROLLBACK_SMM_PROTOCOL_GUID;
+
+ Status = pBS->LocateProtocol (&gEfiSmmBase2ProtocolGuid, NULL, &SmmBase);
+ if((EFI_ERROR(Status)) || (SmmBase == NULL)){
+ return Status;
+ }
+
+ Status = SmmBase->GetSmstLocation(SmmBase, &mSmst);
+ if(EFI_ERROR(Status)){
+ return Status;
+ }
+
+ Status = mSmst->SmmAllocatePool (
+ EfiRuntimeServicesData,
+ sizeof (CLEAR_TPM_ON_ROLLBACK),
+ &PrivateProtocol
+ );
+
+ if((EFI_ERROR(Status)) || (PrivateProtocol == NULL)){
+ return Status;
+ }
+
+ TpmRecoveryGetFidFromFv(&Fid);
+
+ PrivateProtocol->ClearTpmOnRollBack = (VOID *)&SmiFlashClearTpmBeforeFlash;
+
+ Status = mSmst->SmmInstallProtocolInterface( &Handle, \
+ &TpmRollbackSmmGuid, \
+ EFI_NATIVE_INTERFACE, \
+ PrivateProtocol );
+
+ return Status;
+}
+
+
+
+//****************************************************** ****************
+//<AMI_PHDR_START>
+//
+// Procedure: TpmClearRollBackSmmInit
+//
+// Description: Entry point for subcomponent
+//
+// Input: IN EFI_HANDLE ImageHandle,
+// IN EFI_SYSTEM_TABLE *SystemTable
+//
+// Output: EFI_STATUS
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//
+//<AMI_PHDR_END>
+//**********************************************************************
+EFI_STATUS TpmClearRollBackSmmInit(
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable )
+{
+ InitAmiLib( ImageHandle, SystemTable );
+
+ return InitSmmHandler( ImageHandle, SystemTable, InstallTpmClearProtocolInSmm, NULL );
+}
+
+//*************************************************************************
+//*************************************************************************
+//** **
+//** (C)Copyright 1985-2010, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//*************************************************************************
+//*************************************************************************
diff --git a/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollbackWrapperLib.c b/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollbackWrapperLib.c
new file mode 100644
index 0000000..dd71a11
--- /dev/null
+++ b/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollbackWrapperLib.c
@@ -0,0 +1,584 @@
+//*************************************************************************
+//*************************************************************************
+//** **
+//** (C)Copyright 1985-2011, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//*************************************************************************
+//*************************************************************************
+//**********************************************************************
+// $Header: /Alaska/SOURCE/Modules/TCG2/Common/TpmClearOnRollback/TpmClearOnRollbackWrapperLib.c 2 4/21/14 3:17p Fredericko $
+//
+// $Revision: 2 $
+//
+// $Date: 4/21/14 3:17p $
+//**********************************************************************
+// Revision History
+// ----------------
+// $Log: /Alaska/SOURCE/Modules/TCG2/Common/TpmClearOnRollback/TpmClearOnRollbackWrapperLib.c $
+//
+// 2 4/21/14 3:17p Fredericko
+//
+// 1 4/21/14 2:18p Fredericko
+//
+// 1 10/08/13 12:06p Fredericko
+// Initial Check-In for Tpm-Next module
+//
+// 1 7/10/13 5:57p Fredericko
+// [TAG] EIP120969
+// [Category] New Feature
+// [Description] TCG (TPM20)
+//**********************************************************************
+//<AMI_FHDR_START>
+//---------------------------------------------------------------------------
+// Name:
+//
+//
+//
+//---------------------------------------------------------------------------
+//<AMI_FHDR_END>
+#include "TpmClearOnRollback.h"
+#include "TpmClearOnRollbackWrapperLib.h"
+
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: TpmRecoveryGetFidFromFv
+//
+// Description:
+// Finds FID information in the Flash
+//
+// Input:
+//
+//
+// Output:
+//
+//
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+EFI_STATUS TpmRecoveryGetFidFromFv(
+ OUT VOID *Fid
+)
+{
+ static EFI_GUID FidFileName = FID_FFS_FILE_NAME_GUID;
+ EFI_STATUS Status;
+ EFI_HANDLE *FvHandle;
+ UINTN FvCount;
+ UINTN i;
+ UINTN BufferSize;
+ VOID *Buffer;
+
+ Status = pBS->LocateHandleBuffer(ByProtocol, &gEfiFirmwareVolume2ProtocolGuid, NULL, &FvCount, &FvHandle);
+ if (EFI_ERROR(Status))
+ return Status;
+
+ for(i = 0; i < FvCount; i++)
+ {
+ EFI_FIRMWARE_VOLUME_PROTOCOL *Fv;
+ UINT32 AuthStatus;
+ Status = pBS->HandleProtocol(FvHandle[i], &gEfiFirmwareVolume2ProtocolGuid, &Fv);
+ if (EFI_ERROR(Status))
+ continue;
+ Buffer = 0;
+ BufferSize = 0;
+ Status = Fv->ReadSection(Fv, &FidFileName, EFI_SECTION_FREEFORM_SUBTYPE_GUID, 0, &Buffer, &BufferSize, &AuthStatus);
+ TRACE((-1, "extracted section with guid %g\n", (EFI_GUID *)Buffer));
+ if (!EFI_ERROR(Status)) {
+ (UINT8 *)Buffer += sizeof(EFI_GUID);
+ MemCpy(Fid, Buffer, sizeof(FW_VERSION));
+ (UINT8 *)Buffer -= sizeof(EFI_GUID);
+ pBS->FreePool(Buffer);
+ return EFI_SUCCESS;
+ }
+ }
+ pBS->FreePool(FvHandle);
+ return EFI_NOT_FOUND;
+}
+
+
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: TpmGetFidFromBuffer
+//
+// Description:
+// Finds FID information in provided buffer
+//
+// Input:
+//
+//
+// Output:
+//
+//
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+EFI_STATUS TpmGetFidFromBuffer(
+ OUT VOID *Fid,
+ IN VOID *Buffer
+)
+{
+ static EFI_GUID FidSectionGuid = FID_FFS_FILE_SECTION_GUID;
+ UINT32 Signature;
+ UINT32 *SearchPointer;
+
+ SearchPointer = (UINT32 *)((UINT8 *)Buffer - sizeof(EFI_GUID) + FLASH_SIZE);
+ Signature = FidSectionGuid.Data1;
+
+ do {
+ if(*SearchPointer == Signature) {
+ if(!guidcmp(&FidSectionGuid, (EFI_GUID *)SearchPointer)) {
+ (UINT8 *)SearchPointer += sizeof(EFI_GUID);
+ MemCpy(Fid, SearchPointer, sizeof(FW_VERSION));
+ return EFI_SUCCESS;
+ }
+ }
+ } while(SearchPointer-- >= (UINT32 *)Buffer);
+
+ return EFI_NOT_FOUND;
+}
+
+
+
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: SendTpmCommandRecovery
+//
+// Description:
+// Generic send TPM Transaction
+//
+// Input:
+//
+//
+// Output:
+//
+//
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+EFI_STATUS SendTpmCommandRecovery(UINT8 *Cmd, UINTN CmdSize,
+ UINT8 *RetBuff, UINTN RetBuffSize)
+{
+ EFI_STATUS Status;
+ TPM_TRANSMIT_BUFFER InBuffer[1], OutBuffer[1];
+
+ InBuffer[0].Buffer = Cmd;
+ InBuffer[0].Size = CmdSize;
+ OutBuffer[0].Buffer = RetBuff;
+ OutBuffer[0].Size = RetBuffSize;
+
+ Status = TpmLibPassThrough(((TPM_1_2_REGISTERS_PTR)(UINTN)TPM_BASE_ADDRESS),
+ sizeof (InBuffer)/sizeof (*InBuffer),
+ InBuffer,
+ sizeof (OutBuffer) / sizeof (*OutBuffer),
+ OutBuffer);
+
+ return Status;
+
+}
+
+
+
+//**********************************************************************
+//<AMI_PHDR_START>
+//
+// Procedure: RecoverySetPhysicalPresence
+//
+// Description:
+//
+// Input:
+//
+// Output:
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//<AMI_PHDR_END>
+//**********************************************************************
+EFI_STATUS RecoverySetPhysicalPresence()
+{
+ EFI_STATUS Status;
+ PHYSICAL_PRESENCE_CMD PpCmd;
+ TPM_1_2_RET_HEADER retHeader;
+
+
+ PpCmd.Hdr.Tag = TPM_H2NS( TPM_TAG_RQU_COMMAND );
+ PpCmd.Hdr.ParamSize = TPM_H2NL( sizeof (PHYSICAL_PRESENCE_CMD));
+ PpCmd.Hdr.Ordinal = TPM_H2NL( TSC_ORD_PhysicalPresence );
+ PpCmd.Data = TPM_H2NS(TPM_PHYSICAL_PRESENCE_CMD_ENABLE );
+
+ MemSet(&retHeader, sizeof(TPM_1_2_RET_HEADER), 0);
+
+ Status = SendTpmCommandRecovery((UINT8 *)&PpCmd, sizeof(PHYSICAL_PRESENCE_CMD),
+ (UINT8 *)&retHeader, sizeof(TPM_1_2_RET_HEADER));
+
+ //don't care about error case on setting physical presence CMD type
+ //care about actual physical presence failure
+ MemSet(&retHeader, sizeof(TPM_1_2_RET_HEADER), 0);
+
+ PpCmd.Data = TPM_H2NS(TPM_PHYSICAL_PRESENCE_PRESENT);
+
+ Status = SendTpmCommandRecovery((UINT8 *)&PpCmd, sizeof(PHYSICAL_PRESENCE_CMD),
+ (UINT8 *)&retHeader, sizeof(TPM_1_2_RET_HEADER));
+
+ if(retHeader.RetCode == 0)
+ {
+ return EFI_SUCCESS;
+ }
+
+ return EFI_SECURITY_VIOLATION;
+
+}
+
+
+
+//**********************************************************************
+//<AMI_PHDR_START>
+//
+// Procedure: RecoveryEnableActivate
+//
+// Description:
+//
+// Input:
+//
+// Output:
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//<AMI_PHDR_END>
+//**********************************************************************
+EFI_STATUS RecoveryEnableActivate()
+{
+ EFI_STATUS Status;
+ DATA_CMD Command;
+ TPM_1_2_CMD_HEADER cmdEnable;
+ TPM_1_2_RET_HEADER retHeader;
+
+ cmdEnable.Tag = TPM_H2NS( TPM_TAG_RQU_COMMAND );
+ cmdEnable.ParamSize = TPM_H2NL( sizeof (TPM_1_2_CMD_HEADER));
+ cmdEnable.Ordinal = TPM_H2NL( TPM_ORD_PhysicalEnable );
+
+ MemSet(&retHeader, sizeof(TPM_1_2_RET_HEADER), 0);
+
+ Status = SendTpmCommandRecovery((UINT8 *)&cmdEnable, sizeof(TPM_1_2_CMD_HEADER),
+ (UINT8 *)&retHeader, sizeof(TPM_1_2_RET_HEADER));
+
+ if(!EFI_ERROR(Status) && retHeader.RetCode == 0){
+ Command.Hdr.Tag = TPM_H2NS( TPM_TAG_RQU_COMMAND );
+ Command.Hdr.ParamSize = TPM_H2NL( sizeof (DATA_CMD));
+ Command.Hdr.Ordinal = TPM_H2NL( TPM_ORD_PhysicalSetDeactivated );
+ Command.Data = 0x0;
+
+ MemSet(&retHeader, sizeof(TPM_1_2_RET_HEADER), 0);
+
+ Status = SendTpmCommandRecovery((UINT8 *)&Command, sizeof(DATA_CMD),
+ (UINT8 *)&retHeader, sizeof(TPM_1_2_RET_HEADER));
+
+ if(retHeader.RetCode == 0)
+ {
+ return EFI_SUCCESS;
+ }
+ }
+
+ return EFI_SECURITY_VIOLATION;
+
+}
+
+
+
+//**********************************************************************
+//<AMI_PHDR_START>
+//
+// Procedure: RecoverySendClearCmd
+//
+// Description:
+//
+// Input:
+//
+// Output:
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//<AMI_PHDR_END>
+//**********************************************************************
+UINT8 RecoverySendClearCmd()
+{
+ EFI_STATUS Status;
+ TPM_1_2_CMD_HEADER cmdClear;
+ TPM_1_2_RET_HEADER retHeader;
+
+ cmdClear.Tag = TPM_H2NS( TPM_TAG_RQU_COMMAND );
+ cmdClear.ParamSize = TPM_H2NL( sizeof (TPM_1_2_CMD_HEADER));
+ cmdClear.Ordinal = TPM_H2NL( TPM_ORD_ForceClear );
+
+ MemSet(&retHeader, sizeof(TPM_1_2_RET_HEADER), 0);
+
+ Status = SendTpmCommandRecovery((UINT8 *)&cmdClear, sizeof(TPM_1_2_CMD_HEADER),
+ (UINT8 *)&retHeader, sizeof(TPM_1_2_RET_HEADER));
+
+ if(retHeader.RetCode == 0)
+ {
+ return TPM_CLEAR_SUCCESSFUL;
+ }else if((retHeader.RetCode == TPM_H2NL(DISABLED))||
+ (retHeader.RetCode == TPM_H2NL(DEACTIVATED))){
+ //we need to send enable and activate command
+ //reset and then clear.
+ Status = RecoveryEnableActivate();
+
+ if(!EFI_ERROR(Status)){
+ return TPM_CLEAR_RESET_REQUIRED;
+ }
+ }
+
+ return TPM_FATAL_CONTINUE_FLASH;
+
+}
+
+
+//**********************************************************************
+//<AMI_PHDR_START>
+//
+// Procedure: RecoverySendStartUpCmd
+//
+// Description:
+//
+// Input:
+//
+// Output:
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//<AMI_PHDR_END>
+//**********************************************************************
+EFI_STATUS RecoverySendStartUpCmd()
+{
+ EFI_STATUS Status;
+ TPM_1_2_CMD_STARTUP cmdStartup;
+ TPM_1_2_RET_HEADER retHeader;
+ TPM_STARTUP_TYPE TpmSt = TPM_ST_CLEAR;
+
+ cmdStartup.Header.Tag = TPM_H2NS( TPM_TAG_RQU_COMMAND );
+ cmdStartup.Header.ParamSize = TPM_H2NL( sizeof (cmdStartup));
+ cmdStartup.Header.Ordinal = TPM_H2NL( TPM_ORD_Startup );
+ cmdStartup.StartupType = TPM_H2NS( TpmSt );
+
+ MemSet(&retHeader, sizeof(TPM_1_2_RET_HEADER), 0);
+
+ Status = SendTpmCommandRecovery((UINT8 *)&cmdStartup, sizeof(TPM_1_2_CMD_STARTUP),
+ (UINT8 *)&retHeader, sizeof(TPM_1_2_RET_HEADER));
+
+ if(retHeader.RetCode == 0)
+ {
+ return EFI_SUCCESS;
+ }
+
+ return EFI_DEVICE_ERROR;
+}
+
+
+
+//**********************************************************************
+//<AMI_PHDR_START>
+//
+// Procedure: GetCapabilityCmd
+//
+// Description:
+//
+// Input:
+//
+// Output:
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//<AMI_PHDR_END>
+//**********************************************************************
+EFI_STATUS GetCapabilityCmd(TPM_Capabilities_PermanentFlag *PermFlags)
+{
+ EFI_STATUS Status = EFI_ABORTED;
+ BOOLEAN Support = FALSE;
+ TPM_GetCapabilities_Input cmdGetCap;
+
+ cmdGetCap.Tag = TPM_H2NS( TPM_TAG_RQU_COMMAND );
+ cmdGetCap.ParamSize = TPM_H2NL( sizeof (cmdGetCap));
+
+ if(AutoSupportType()){
+ //not supported
+ return EFI_SUCCESS;
+ }else{
+ cmdGetCap.CommandCode = TPM_H2NL( TPM_ORD_GetCapability );
+ cmdGetCap.caparea = TPM_H2NL( TPM_CAP_FLAG );
+ }
+
+ cmdGetCap.subCapSize = TPM_H2NL( 4 ); // subCap is always 32bit long
+ cmdGetCap.subCap = TPM_H2NL( TPM_CAP_FLAG_PERMANENT );
+
+ Status = SendTpmCommandRecovery((UINT8 *)&cmdGetCap, sizeof(TPM_GetCapabilities_Input),
+ (UINT8 *)PermFlags, sizeof(TPM_Capabilities_PermanentFlag));
+
+ if(PermFlags->RetCode == TPM_H2NL(INVALID_POSTINIT))
+ {
+ return EFI_NOT_READY;
+ }
+
+ if(PermFlags->RetCode == 0){
+ return EFI_SUCCESS;
+ }
+
+ return EFI_DEVICE_ERROR;
+}
+
+
+
+//**********************************************************************
+//<AMI_PHDR_START>
+//
+// Procedure: GetVolatileFlags
+//
+// Description:
+//
+// Input:
+//
+// Output:
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//<AMI_PHDR_END>
+//**********************************************************************
+EFI_STATUS GetVolatileFlags(TPM_VOLATILE_FLAGS *VolatileFlags)
+{
+ EFI_STATUS Status = EFI_ABORTED;
+ BOOLEAN Support = FALSE;
+ TPM_GetCapabilities_Input cmdGetCap;
+
+ cmdGetCap.Tag = TPM_H2NS( TPM_TAG_RQU_COMMAND );
+ cmdGetCap.ParamSize = TPM_H2NL( sizeof (cmdGetCap));
+
+ if(AutoSupportType()){
+ return EFI_SUCCESS;
+ }else{
+ cmdGetCap.CommandCode = TPM_H2NL( TPM_ORD_GetCapability );
+ cmdGetCap.caparea = TPM_H2NL( TPM_CAP_FLAG );
+ }
+
+ cmdGetCap.subCapSize = TPM_H2NL( 4 ); // subCap is always 32bit long
+ cmdGetCap.subCap = TPM_H2NL( TPM_CAP_FLAG_VOLATILE );
+
+ Status = SendTpmCommandRecovery((UINT8 *)&cmdGetCap, sizeof(TPM_GetCapabilities_Input),
+ (UINT8 *)VolatileFlags, sizeof(TPM_VOLATILE_FLAGS));
+
+ if(VolatileFlags->RetCode == TPM_H2NL(INVALID_POSTINIT))
+ {
+ return EFI_NOT_READY;
+ }
+
+ if(VolatileFlags->RetCode == 0){
+ return EFI_SUCCESS;
+ }
+
+ return EFI_DEVICE_ERROR;
+}
+
+
+
+//**********************************************************************
+//<AMI_PHDR_START>
+//
+// Procedure: ClearTpmBeforeFlash
+//
+// Description:
+//
+// Input:
+//
+// Output:
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//<AMI_PHDR_END>
+//**********************************************************************
+UINT8 ClearTpmBeforeFlash()
+{
+ TPM_Capabilities_PermanentFlag PermFlags;
+ UINT8 Result=0;
+ EFI_STATUS Status;
+ TPM_VOLATILE_FLAGS TpmVolatileFlags;
+
+ if(AutoSupportType())return TPM_CLEAR_SUCCESSFUL;
+
+ Status = IsTpmPresent((TPM_1_2_REGISTERS_PTR)( UINTN ) TPM_BASE_ADDRESS);
+ if(EFI_ERROR(Status)){
+ return TPM_CLEAR_SUCCESSFUL;
+ }
+
+ //else we have a TPM need to process to clear
+ TisRequestLocality((TPM_1_2_REGISTERS_PTR)( UINTN ) TPM_BASE_ADDRESS);
+
+ Status = GetCapabilityCmd(&PermFlags);
+ if(Status == EFI_NOT_READY)
+ {
+ Status = RecoverySendStartUpCmd();
+ if(EFI_ERROR(Status))
+ {
+ return TPM_FATAL_CONTINUE_FLASH;
+ }
+ }
+
+ if(EFI_ERROR(Status))return TPM_FATAL_CONTINUE_FLASH;
+
+ Status = RecoverySetPhysicalPresence();
+ if(!EFI_ERROR(Status))
+ {
+ Status = GetVolatileFlags(&TpmVolatileFlags);
+ if(!EFI_ERROR(Status)){
+ if(TpmVolatileFlags.physicalPresenceLock){
+ //we need to go into manufacturing mode\special mode
+ //to skip physical presence lock; Return we failed
+ //to clear TPM and flashing should be discontinued.
+ return TPM_FATAL_DISCONTINUE_FLASH;
+ }
+ }
+ Result = RecoverySendClearCmd();
+ }else{
+ if(EFI_ERROR(Status))return TPM_FATAL_CONTINUE_FLASH;
+ }
+
+ TisReleaseLocality((TPM_1_2_REGISTERS_PTR)( UINTN ) TPM_BASE_ADDRESS);
+
+ return Result;
+}
+//*************************************************************************
+//*************************************************************************
+//** **
+//** (C)Copyright 1985-2010, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//*************************************************************************
+//*************************************************************************
diff --git a/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollbackWrapperLib.h b/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollbackWrapperLib.h
new file mode 100644
index 0000000..5c32d15
--- /dev/null
+++ b/Core/EM/TCG2/TpmClearOnRollback/TpmClearOnRollbackWrapperLib.h
@@ -0,0 +1,198 @@
+//*************************************************************************
+//*************************************************************************
+//** **
+//** (C)Copyright 1985-2011, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//*************************************************************************
+//*************************************************************************
+//**********************************************************************
+// $Header: /Alaska/SOURCE/Modules/TCG2/Common/TpmClearOnRollback/TpmClearOnRollbackWrapperLib.h 1 4/21/14 2:18p Fredericko $
+//
+// $Revision: 1 $
+//
+// $Date: 4/21/14 2:18p $
+//**********************************************************************
+// Revision History
+// ----------------
+// $Log: /Alaska/SOURCE/Modules/TCG2/Common/TpmClearOnRollback/TpmClearOnRollbackWrapperLib.h $
+//
+// 1 4/21/14 2:18p Fredericko
+//
+// 1 10/08/13 12:06p Fredericko
+// Initial Check-In for Tpm-Next module
+//
+// 1 7/10/13 5:57p Fredericko
+// [TAG] EIP120969
+// [Category] New Feature
+// [Description] TCG (TPM20)
+//
+//
+//**********************************************************************
+//<AMI_FHDR_START>
+//----------------------------------------------------------------------------
+//
+// Name:
+//
+// Description:
+//
+//----------------------------------------------------------------------------
+//<AMI_FHDR_END>
+#ifndef _TPM_CLEAR_ON_ROLLBACK_WRAPPER_H
+#define _TPM_CLEAR_ON_ROLLBACK_WRAPPER_H
+
+#include <AmiDxeLib.h>
+#include <Protocol\TcgService.h>
+#include <TCGMisc.h>
+#include <Protocol\SmmBase2.h>
+#include <Protocol\AmiTpmClearOnRollbackProtocol.h>
+#include <PPI/FwVersion.h>
+#include <Hob.h>
+#include <Token.h>
+#include <AmiHobs.h>
+
+#define FID_FFS_FILE_NAME_GUID \
+ { 0x3fd1d3a2, 0x99f7, 0x420b, 0xbc, 0x69, 0x8b, 0xb1, 0xd4, 0x92, 0xa3, 0x32 }
+
+#define FID_FFS_FILE_SECTION_GUID \
+ { 0x2EBE0275, 0x6458, 0x4AF9, 0x91, 0xED, 0xD3, 0xF4, 0xED, 0xB1, 0x00, 0xAA }
+
+#define TPM_BASE_ADDRESS 0xfed40000
+#define BASE 0x0
+#define INVALID_POSTINIT ((TPM_RESULT) (BASE + 38))
+#define DISABLED ((TPM_RESULT) (BASE + 7))
+#define DEACTIVATED ((TPM_RESULT) (BASE + 6))
+
+#define TPM_H2NS( x ) \
+ (((UINT16)(x) << 8) | ((UINT16)(x) >> 8))
+#define TPM_H2NL( x ) \
+ (UINT32)((((UINT32)(x)) >> 24) \
+ | (((x) >> 8) & 0xff00) \
+ | ((x) << 24) \
+ | (((x) & 0xff00) << 8))
+
+#define TPM_N2HS( x ) TPM_H2NS( x )
+#define TPM_N2HL( x ) TPM_H2NL( x )
+
+#pragma pack(1)
+
+typedef struct _TPM_1_2_REGISTERS {
+ UINT8 Access; // 0
+ UINT8 Reserved1[7]; // 1
+ UINT32 IntEnable; // 8
+ UINT8 IntVector; // 0ch
+ UINT8 Reserved2[3]; // 0dh
+ UINT32 IntSts; // 10h
+ UINT32 IntfCapability; // 14h
+ UINT8 Sts; // 18h
+ UINT16 BurstCount; // 19h
+ UINT8 Reserved3[9];
+ UINT32 DataFifo; // 24h
+ UINT8 Reserved4[0xed8]; // 28h
+ UINT16 Vid; // 0f00h
+ UINT16 Did; // 0f02h
+ UINT8 Rid; // 0f04h
+ UINT8 TcgDefined[0x7b]; // 0f05h
+ UINT32 LegacyAddress1; // 0f80h
+ UINT32 LegacyAddress1Ex; // 0f84h
+ UINT32 LegacyAddress2; // 0f88h
+ UINT32 LegacyAddress2Ex; // 0f8ch
+ UINT8 VendorDefined[0x70];// 0f90h
+} TPM_1_2_REGISTERS;
+
+typedef volatile TPM_1_2_REGISTERS *TPM_1_2_REGISTERS_PTR;
+
+typedef struct _TPM_TRANSMIT_BUFFER {
+ VOID *Buffer;
+ UINTN Size;
+} TPM_TRANSMIT_BUFFER;
+
+typedef struct _TPM_1_2_CMD_HEADER
+{
+ TPM_TAG Tag;
+ UINT32 ParamSize;
+ TPM_COMMAND_CODE Ordinal;
+} TPM_1_2_CMD_HEADER;
+
+typedef struct _TPM_1_2_RET_HEADER
+{
+ TPM_TAG Tag;
+ UINT32 ParamSize;
+ TPM_RESULT RetCode;
+} TPM_1_2_RET_HEADER;
+
+typedef struct _TPM_1_2_CMD_STARTUP
+{
+ TPM_1_2_CMD_HEADER Header;
+ TPM_STARTUP_TYPE StartupType;
+} TPM_1_2_CMD_STARTUP;
+
+typedef struct _PHYSICAL_PRESENCE_CMD{
+ TPM_1_2_CMD_HEADER Hdr;
+ UINT16 Data;
+} PHYSICAL_PRESENCE_CMD;
+
+typedef struct _DATA_CMD{
+ TPM_1_2_CMD_HEADER Hdr;
+ UINT8 Data;
+} DATA_CMD;
+
+#pragma pack()
+
+EFI_STATUS
+__stdcall IsTpmPresent (
+ IN TPM_1_2_REGISTERS_PTR TpmReg );
+
+EFI_STATUS
+__stdcall TisReleaseLocality (
+ IN TPM_1_2_REGISTERS_PTR TpmReg );
+
+EFI_STATUS
+__stdcall TisRequestLocality (
+ IN TPM_1_2_REGISTERS_PTR TpmReg );
+
+EFI_STATUS
+__stdcall TpmLibPassThrough (
+ IN TPM_1_2_REGISTERS_PTR TpmReg,
+ IN UINTN NoInputBuffers,
+ IN TPM_TRANSMIT_BUFFER *InputBuffers,
+ IN UINTN NoOutputBuffers,
+ IN OUT TPM_TRANSMIT_BUFFER *OutputBuffers );
+
+BOOLEAN
+__stdcall AutoSupportType ();
+
+EFI_STATUS TpmRecoveryGetFidFromFv(
+ OUT VOID *Fid
+);
+
+EFI_STATUS TpmGetFidFromBuffer(
+ OUT VOID *Fid,
+ IN VOID *Buffer
+);
+
+UINT8 ClearTpmBeforeFlash();
+
+void
+__stdcall
+FixedDelay(UINT32 dCount);
+
+#endif
+//*************************************************************************
+//*************************************************************************
+//** **
+//** (C)Copyright 1985-2011, American Megatrends, Inc. **
+//** **
+//** All Rights Reserved. **
+//** **
+//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 **
+//** **
+//** Phone: (770)-246-8600 **
+//** **
+//*************************************************************************
+//************************************************************************* \ No newline at end of file