Newer
Older
AMI-Aptio-BIOS-Reversed / TrEEPei / TrEEPei.h
@Ajax Dong Ajax Dong 2 days ago 11 KB Init
/**
 * TrEEPei.h - TrEE (TCG Resource Extended Environment) PEI Module
 *
 * Module: TrEEPei.efi (PEI TPM Driver)
 * Index:  0387
 * SHA256: 398419b1597f9f8019c6bdd0a25168e09ff0e7c90129804ff02380f28215d943
 * Arch:   IA32 (32-bit PEI)
 * Base:   0xFFE0DE28
 * Size:   0x98E0
 * Source: e:\hs\AmiModulePkg\TCG2\Common\TcgPei\TrEEPei.c
 *         e:\hs\AmiModulePkg\TCG2\CRB_lib\Tpm20CRBLib.c
 *
 * This module handles TPM 2.0 discovery, initialization, command transmit
 * (TIS/CRB), hashing (SHA-1/SHA-256/SHA-384/SHA-512), and TCG event log
 * creation during the PEI phase.
 */

#ifndef __TREEPEI_H__
#define __TREEPEI_H__

#include <UEFI.h>
#include <PEI.h>

/*============================================================================
 * TPM 2.0 Constants
 *============================================================================*/

#define TPM_CRB_REG_BASE            0xFED40000

#define TPM2_ST_NO_SESSIONS         0x8001
#define TPM2_ST_SESSIONS            0x8002

#define TPM2_CC_Startup             0x0144
#define TPM2_CC_SelfTest            0x0143
#define TPM2_CC_HierarchyControl    0x0122
#define TPM2_CC_PCR_Extend          0x0185
#define TPM2_CC_HashSequenceStart   0x0186
#define TPM2_CC_HashSequenceUpdate  0x0187
#define TPM2_CC_HashSequenceComplete 0x0188

#define TPM_ALG_SHA1                0x0004
#define TPM_ALG_SHA256              0x000B
#define TPM_ALG_SHA384              0x000C
#define TPM_ALG_SHA512              0x0012

#define TPM_IFACE_NONE              0
#define TPM_IFACE_TIS               1
#define TPM_IFACE_CRB               2

#define TPM_CRB_CMD_BUFFER_SIZE     0x0280
#define TPM_CRB_RSP_BUFFER_SIZE     0x0280

#define TIS_TIMEOUT_A               7500
#define TIS_TIMEOUT_B               30000
#define TIS_TIMEOUT_C               30000
#define TIS_TIMEOUT_D               30000

#define CRB_TIMEOUT_CMD_READY       15000
#define CRB_TIMEOUT_IDLE            15000

/*============================================================================
 * TPM 2.0 Structures
 *============================================================================*/

#pragma pack(push, 1)

typedef struct {
  UINT16  Tag;
  UINT32  CommandSize;
  UINT32  CommandCode;
} TPM2_COMMAND_HEADER;

typedef struct {
  UINT16  Tag;
  UINT32  ResponseSize;
  UINT32  ResponseCode;
} TPM2_RESPONSE_HEADER;

typedef struct {
  TPM2_COMMAND_HEADER  Header;
  UINT16               StartupType;
} TPM2_STARTUP_COMMAND;

typedef struct {
  TPM2_COMMAND_HEADER  Header;
  UINT8                FullTest;
} TPM2_SELFTEST_COMMAND;

typedef struct {
  TPM2_COMMAND_HEADER  Header;
  UINT32               PCRIndex;
} TPM2_PCR_EXTEND_COMMAND;

typedef struct {
  TPM2_COMMAND_HEADER  Header;
  UINT16               HashAlg;
} TPM2_HASH_SEQUENCE_START_COMMAND;

typedef struct {
  UINT16  HashAlg;
  UINT8   Digest[64];  /* max 64 bytes for SHA-512 */
} TPMT_HA;

#pragma pack(pop)

/*============================================================================
 * TrEE PEI PPI Structure
 *============================================================================*/

typedef struct _TREE_PEI_PPI TREE_PEI_PPI;

typedef
UINT32
(EFIAPI *TREE_PEI_GET_INTERFACE_INFO)(
  TREE_PEI_PPI  *This,
  UINT32        *InterfaceVersion,
  UINT32        *InterfaceFlags
  );

typedef
UINT32
(EFIAPI *TREE_PEI_TRANSMIT)(
  TREE_PEI_PPI  *This,
  UINT8         InterfaceType,
  VOID          *CommandBuffer,
  UINT32        *CommandSize
  );

typedef
UINT32
(EFIAPI *TREE_PEI_HASH_SEQUENCE_EXTEND)(
  TREE_PEI_PPI  *This,
  UINT32        Operation,
  UINT64        *LogLocation,
  UINT32        *TcgLog,
  UINT8         *OutInterfaceType
  );

struct _TREE_PEI_PPI {
  UINT64                        Signature;
  TREE_PEI_GET_INTERFACE_INFO   GetInterfaceInfo;
  TREE_PEI_TRANSMIT             Transmit;
  TREE_PEI_HASH_SEQUENCE_EXTEND HashSequenceExtend;
};

/*============================================================================
 * Module Global Variables
 *============================================================================*/

extern volatile UINT8   InterfaceType;       /* 0xFFE174E4 */
extern volatile UINT32  dword_FFE174E0;      /* TCG log HOB pointer */
extern volatile UINT64  qword_FFE174E8;      /* TCG log HOB base */
extern UINT8            byte_FFE174DC;       /* TPM interface type byte */

/*============================================================================
 * Function Declarations
 *============================================================================*/

/* --- Module Entry --- */
EFI_STATUS
EFIAPI
_ModuleEntryPoint(
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE *SystemTable
  );

/* --- PEI Entry & Init --- */
INT32
TrEEPeiEntry(
  INT32   SystemTable,
  INT32  *PeiServices
  );

INT32
TrEEPeiInstallPpi(
  INT32  *PpiDescriptor
  );

INT32
ProcessTpmSupportDisabled(
  VOID  *This
  );

/* --- TPM Device Detection --- */
UINT8
Tpm20IsSupportedVidDid(
  VOID
  );

UINT8
Tpm20IsPresent(
  VOID
  );

UINT8
Tpm20GetInterfaceType(
  VOID
  );

UINT8
Tpm20GetDeviceType(
  VOID
  );

UINT8
Tpm20ProbeMemory(
  VOID
  );

/* --- Interface Selection --- */
INT32
SelectAndLockInterface(
  INT32  SystemTable,
  UINT8  DesiredInterface
  );

INT32
Tpm20GetDeviceInfo(
  INT32    a1,
  UINT32  *Info1,
  UINT32  *Info2
  );

/* --- TrEE PPI --- */
INT32
TrEEGetInterfaceInfo(
  TREE_PEI_PPI  *This,
  UINT32        *InterfaceVersion,
  UINT32        *InterfaceFlags
  );

/* --- TPM Command Init --- */
INT32
Tpm20CmdInit(
  UINT32  CommandCode,
  INT32   a2,
  UINT8  *ResponseBuf,
  UINT8  *WorkBuf
  );

/* --- CRB Transmit --- */
UINT32
TrEECRBPeiTransmit(
  INT32    a1,
  UINT8    a2,
  INT32    a3,
  UINT32  *a4
  );

INT32
TrEECRBTransmitInner(
  INT32   a1,
  UINT8  *CmdBuffer,
  UINT32  CmdSize,
  UINT8   a4,
  INT32   a5
  );

INT32
TrEECRBTransfer(
  INT32   a1,
  INT32   a2,
  INT32   a3,
  INT32   a4,
  INT32   a5,
  INT32   a6,
  INT32  *Src,
  UINT8  *ResponseBuf
  );

/* --- CRB Memory Access --- */
UINT8
CrbMemoryBlockRead(
  UINT8  *Dst,
  INT32   Size,
  UINT8  *Src
  );

UINT8
CrbMemoryBlockWrite(
  INT32   Dst,
  INT32   Size,
  UINT8  *Src
  );

UINT8
CrbGetIdleFlag(
  VOID
  );

UINT8
CrbCheckStatus(
  UINT32  *CrbStatus
  );

INT32
CrbWaitCmdReady(
  VOID  *CrbRegs
  );

INT32
CrbWaitIdle(
  VOID  *CrbRegs
  );

UINT8
CrbGetState(
  VOID  *CrbRegs
  );

INT32
CrbSetStateCmdReady(
  VOID  *CrbRegs
  );

INT32
CrbSetStateIdle(
  VOID  *CrbRegs
  );

INT32
CrbSendCommand(
  UINT8  *CmdBuffer,
  INT32   CmdSize
  );

INT32
CrbReceiveResponse(
  UINT8  *ResponseBuf,
  INT32  *ResponseSize
  );

/* --- Transmit Layer --- */
INT32
TrEECRBTransmit(
  INT32   a1,
  INT32   n12,
  INT16  *CmdBuffer,
  INT32   n10,
  UINT8  *ResponseBuf
  );

INT32
TrEETisTransmit(
  INT32   a1,
  INT32   n12,
  INT16  *CmdBuffer,
  INT32   n10,
  UINT8  *ResponseBuf
  );

INT32
TrEETransmitTisOrCrb(
  INT32   a1,
  INT32   a2,
  UINT8   InterfaceType,
  UINT8  *Buffer,
  INT32  *Size
  );

INT32
TrEETransmitPrep(
  INT32   a1,
  INT32   a2,
  INT32   a3,
  INT32   a4,
  INT32  *a5
  );

INT32
TrEEParseResponse(
  INT32   a1,
  INT32   a2,
  INT32   a3,
  INT64   a4,
  INT32   a5,
  INT32   a6,
  INT32   a7
  );

/* --- TIS Transport --- */
INT32
Tpm20TisTransmit(
  UINT8  *CmdBuffer,
  UINT32  CmdSize,
  UINT32  a3,
  INT32   a4,
  INT32   a5
  );

INT32
Tpm20TisWriteCmd(
  UINT8  *CmdBuffer,
  UINT8  *Buffer,
  INT32   Size,
  UINT8   a4
  );

UINT32
Tpm20TisReadResponse(
  INT32   a1,
  UINT8  *ResponseBuf,
  UINT32 *ResponseSize
  );

UINT32
Tpm20TisReadFifo(
  UINT8  *Dest,
  UINT32  Size
  );

INT32
Tpm20TisWaitReady(
  VOID
  );

INT32
Tpm20CmdReadyWait(
  VOID
  );

INT32
Tpm20BurstCountWait(
  VOID
  );

INT32
Tpm20TisTimeoutWait(
  INT32  Mode
  );

/* --- Command Execution --- */
INT32
TrEEExecuteCmd(
  INT16  *CmdBuffer,
  INT32   CmdSize,
  UINT8  *ResponseBuf,
  INT32  *ResponseSize
  );

/* --- Command Building --- */
INT32
TrEESerializeCmdHeader(
  INT32  a1,
  INT32  a2
  );

INT32
TrEEBuildExtendCmd(
  INT32     a1,
  UINT32    a2,
  UINT32   *Digest
  );

/* --- Hash Sequence --- */
INT32
TrEEHashSequenceExecute(
  UINT8  *Data,
  UINT32  DataSize,
  UINT8  *Digest
  );

INT32
TrEESequenceUpdate(
  INT32     a1,
  UINT16   *Count
  );

INT32
TrEESequenceComplete(
  INT32   a1,
  UINT8  *HashOutput
  );

UINT32
TrEEHashSequenceExtend(
  INT32    a1,
  INT32    a2,
  UINT64  *LogLocation,
  UINT32  *TcgLog,
  UINT8   *OutInterfaceType
  );

/* --- TPM2 Protocol --- */
INT32
Tpm2Startup(
  VOID  *This
  );

INT32
Tpm2SelfTest(
  VOID  *This
  );

INT32
Tpm2HierarchyControl(
  INT32     a1,
  INT32     a2,
  UINT32    a3
  );

INT32
Tpm2ExtendPcr(
  VOID    *This,
  UINT32  PCRIndex,
  UINT32 *DigestList,
  UINT8   InterfaceType
  );

/* --- Hash/Log/Extend --- */
INT32
Tpm2HashLogExtendPcr(
  VOID   *This,
  UINT32  PCRIndex,
  UINT8   InterfaceType
  );

/* --- HOB --- */
INT32
TrEECreateTcgHob(
  INT32    This,
  UINT32  *HobAddr,
  INT32    HobSize,
  INT32   *OutHob
  );

/* --- Hashing --- */
VOID
Sha1Init(
  VOID  *Context
  );

VOID
Sha1Update(
  VOID        *Context,
  const UINT8 *Data,
  UINT32       DataSize
  );

VOID
Sha1Final(
  VOID  *Context,
  UINT8 *Digest
  );

VOID
Sha256Hash(
  INT32   Data,
  UINT16  Count
  );

INT32
Sha1UpdateInternal(
  INT32   a1,
  UINT8  *Src,
  UINT32  Size
  );

INT32
Sha1FinalInternal(
  VOID   *Context,
  UINT8  *Digest
  );

INT32
Sha256FinalInternal(
  INT32   a1,
  UINT8  *Digest
  );

INT32
Sha256HashAll(
  UINT32 *Size,
  UINT8  *Digest
  );

INT32
Sha384UpdateInternal(
  UINT8  *a1,
  UINT8  *Src,
  UINT32  Size
  );

INT32
Sha384FinalInternal(
  INT32  a1,
  INT32  a2
  );

INT32
Sha1HashAllInternal(
  UINT32  Size,
  UINT8  *Digest
  );

INT32
Sha384HashAllInternal(
  INT32    a1,
  UINT32   Size,
  UINT8   *Digest
  );

INT32
Sha512HashAllInternal(
  INT32    a1,
  UINT32   Size,
  UINT8   *Digest
  );

/* --- Hash Dispatch --- */
INT32
Tpm20HashAllSha1(
  VOID  *Context
  );

INT32
Tpm20HashAllSha256(
  VOID  *Context
  );

INT32
Tpm20HashAllSha384(
  VOID  *Context
  );

/* --- Digest Helpers --- */
UINT32
Tpm20MapHashAlg(
  UINT8  *HashAlg,
  UINT32  MapType
  );

UINT32
Tpm20GetHashFromDigest(
  UINT8  *Dest,
  UINT32  Source,
  UINT32  Size
  );

INT32
Tpm20CopyDigest(
  INT32  a1,
  UINT32 a2
  );

/* --- PPI Helpers --- */
INT32
Tpm20GetPpi(
  VOID  *Context
  );

INT32
Tpm20NotifyPpi(
  INT32  Context
  );

INT32
GetPpiDescriptor(
  VOID   *Guid,
  VOID  **Descriptor
  );

/* --- Global State --- */
UINT8
GetGlobalState(
  VOID
  );

VOID
SetGlobalState(
  UINT8  State
  );

UINT32
GetGlobalState2(
  VOID
  );

/* --- Progress / Debug --- */
VOID
Tpm20ProgressLog(
  UINT32  Phase,
  UINT32  EventId
  );

VOID
DebugPrint(
  UINT32       ErrorLevel,
  const CHAR8 *Format,
  ...
  );

VOID
DebugAssert(
  INT32   FileName,
  INT32   LineNumber,
  INT32   Description
  );

/* --- Memory --- */
INT32
CopyMemChecked(
  UINT8       *Dst,
  const UINT8 *Src,
  UINT32       Count
  );

INT32
AllocatePool(
  VOID   *Buffer,
  UINT32  Size
  );

INT32
ReallocatePool(
  VOID   *OldBuffer,
  UINT32  OldSize,
  UINT32  NewSize
  );

VOID
GetBootServicesTable(
  VOID
  );

INT32
GetDebugLib(
  VOID
  );

/* --- Utilities --- */
UINT32
SwapBytes32(
  UINT32  Value
  );

UINT16
SwapBytes16(
  UINT16  Value
  );

UINT8
ReadUnaligned8(
  UINT8  *Pointer
  );

VOID
WriteUnaligned8(
  UINT8  *Pointer,
  UINT8   Value
  );

UINT16
ReadUnaligned16(
  VOID  *Pointer
  );

VOID
WriteUnaligned32(
  VOID   *Pointer,
  UINT32  Value
  );

UINT64
RightRotate64(
  UINT64  Value,
  UINT8   Shift
  );

CHAR8
HIBYTE_w(
  UINT16  Value
  );

INT32
TpmReturnUnsupported(
  VOID
  );

#endif /* __TREEPEI_H__ */