611 lines
16 KiB
C
611 lines
16 KiB
C
/** @file
|
|
This file contains function definitions that can determine
|
|
the TXT capabilities of a platform during PEI and perform
|
|
certain specific platform tasks that are required for TXT
|
|
during PEI.
|
|
|
|
@copyright
|
|
INTEL CONFIDENTIAL
|
|
Copyright 1999 - 2020 Intel Corporation.
|
|
|
|
The source code contained or described herein and all documents related to the
|
|
source code ("Material") are owned by Intel Corporation or its suppliers or
|
|
licensors. Title to the Material remains with Intel Corporation or its suppliers
|
|
and licensors. The Material may contain trade secrets and proprietary and
|
|
confidential information of Intel Corporation and its suppliers and licensors,
|
|
and is protected by worldwide copyright and trade secret laws and treaty
|
|
provisions. No part of the Material may be used, copied, reproduced, modified,
|
|
published, uploaded, posted, transmitted, distributed, or disclosed in any way
|
|
without Intel's prior express written permission.
|
|
|
|
No license under any patent, copyright, trade secret or other intellectual
|
|
property right is granted to or conferred upon you by disclosure or delivery
|
|
of the Materials, either expressly, by implication, inducement, estoppel or
|
|
otherwise. Any license under such intellectual property rights must be
|
|
express and approved by Intel in writing.
|
|
|
|
Unless otherwise agreed by Intel in writing, you may not remove or alter
|
|
this notice or any other notice embedded in Materials by Intel or
|
|
Intel's suppliers or licensors in any way.
|
|
|
|
This file contains an 'Intel Peripheral Driver' and is uniquely identified as
|
|
"Intel Reference Module" and is licensed for Intel CPUs and chipsets under
|
|
the terms of your license agreement with Intel or your vendor. This file may
|
|
be modified by the user, subject to additional terms of the license agreement.
|
|
|
|
@par Specification
|
|
**/
|
|
|
|
#ifndef _TXT_PEI_LIB_H_
|
|
#define _TXT_PEI_LIB_H_
|
|
|
|
#include <Library/PeiServicesLib.h>
|
|
#include <Library/DebugLib.h>
|
|
#include <Library/HobLib.h>
|
|
#include <Library/BaseMemoryLib.h>
|
|
#include <Library/IoLib.h>
|
|
#include <Library/TimerLib.h>
|
|
#include "Txt.h"
|
|
#include <CpuRegs.h>
|
|
#include <TxtInfoHob.h>
|
|
#include <Ppi/SiPolicy.h>
|
|
#include <Ppi/TpmInitialized.h>
|
|
#include <Library/PchCycleDecodingLib.h>
|
|
|
|
#define APIC_SPURIOUS_VECTOR_REGISTER 0xF0 ///< Offset of local APIC register
|
|
#define BASE_ADDR_MASK 0xFFFFF000 ///< Local APIC base address mask
|
|
|
|
#define TEST_PATTERN 0x5A5A5A5A
|
|
//
|
|
// EDI parameter sent to SCHECK function
|
|
//
|
|
#define COLD_BOOT_PATH 0
|
|
#define S3_RESUME_PATH 1
|
|
///
|
|
/// Chipset register
|
|
///
|
|
#define TXT_OPT_IN_VMX_AND_SMX_MSR_VALUE 0xFF03
|
|
|
|
///
|
|
/// ACM Header
|
|
///
|
|
#define ACM_HEADER_VERSION_3 (3 << 16)
|
|
#define ACM_PKCS_1_5_RSA_SIGNATURE_SHA256_SIZE 256
|
|
#define ACM_PKCS_1_5_RSA_SIGNATURE_SHA384_SIZE 384
|
|
|
|
#pragma pack (push, 1)
|
|
typedef struct _ACM_HEADER {
|
|
UINT32 ModuleType; ///< Module type
|
|
UINT32 HeaderLen; ///< 4 4 Header length (in multiples of four bytes) (161 for version 0.0)
|
|
UINT32 HeaderVersion; ///< 8 4 Module format version
|
|
UINT32 ModuleId; ///< 12 4 Module release identifier
|
|
UINT32 ModuleVendor; ///< 16 4 Module vendor identifier
|
|
UINT32 Date; ///< 20 4 Creation date (BCD format: year.month.day)
|
|
UINT32 Size; ///< 24 4 Module size (in multiples of four bytes)
|
|
UINT16 AcmSvn; ///< 28 2 ACM-SVN Number
|
|
UINT16 SeSvn; ///< 30 2 SE-SVN number
|
|
UINT32 CodeControl; ///< 32 4 Authenticated code control flags
|
|
UINT32 ErrorEntryPoint; ///< 36 4 Error response entry point offset (bytes)
|
|
UINT32 GdtLimit; ///< 40 4 GDT limit (defines last byte of GDT)
|
|
UINT32 GdtBasePtr; ///< 44 4 GDT base pointer offset (bytes)
|
|
UINT32 SegSel; ///< 48 4 Segment selector initializer
|
|
UINT32 EntryPoint; ///< 52 4 Authenticated code entry point offset (bytes)
|
|
UINT32 Reserved2[16]; ///< 56 64 Reserved for future extensions
|
|
UINT32 KeySize; ///< 120 4 Module public key size less the exponent (in multiples of four bytes - 64 for version 0.0)
|
|
UINT32 ScratchSize; ///< 124 4 Scratch field size (in multiples of four bytes - 2 * KeySize + 15 for version 0.0)
|
|
} ACM_HEADER;
|
|
#pragma pack (pop)
|
|
|
|
#pragma pack (push, 1)
|
|
typedef struct {
|
|
EFI_GUID Guid;
|
|
UINT8 ChipsetAcmType;
|
|
UINT8 AitVersion;
|
|
UINT16 AitLength;
|
|
UINT32 ChipsetIdList;
|
|
UINT32 OsSinitTblVer;
|
|
UINT32 MinMleHeaderVer;
|
|
UINT32 SinitCaps;
|
|
UINT8 SinitVersion;
|
|
UINT8 AitRevision[3];
|
|
UINT32 ProcessorIdList;
|
|
UINT32 TpmInfoList;
|
|
} ACM_INFO_TABLE;
|
|
#pragma pack (pop)
|
|
|
|
///
|
|
/// TXT PEI Context
|
|
///
|
|
typedef struct _TXT_PEI_LIB_CONTEXT {
|
|
CONST EFI_PEI_SERVICES **PeiServices; ///< PeiServices pointer
|
|
ACM_HEADER *BiosAcmBase; ///< Pointer to Bios ACM Base which is the ACM header
|
|
UINT32 BiosAcmSize; ///< BiosAc.bin size
|
|
VOID *ApStartup; ///< ApStartup Address
|
|
UINT32 Ia32ApicBase; ///< ApicBase Address
|
|
TXT_INFO_HOB *Hob; ///< Txt Info HOB
|
|
} TXT_PEI_LIB_CONTEXT;
|
|
|
|
/**
|
|
Processor Signature Structure
|
|
**/
|
|
typedef struct _PSS {
|
|
UINT32 signature; ///< PSS Processor Signature
|
|
UINT32 procFlags; ///< PSS Processor Flags (Platform ID)
|
|
UINT32 checksum; ///< PSS Checksum
|
|
} PSS;
|
|
|
|
/**
|
|
Execute SCLEAN through BIOS ACM
|
|
**/
|
|
VOID
|
|
LaunchBiosAcmSclean (
|
|
VOID
|
|
);
|
|
|
|
|
|
/**
|
|
Execute CLEAR SECRETS through BIOS ACM
|
|
**/
|
|
VOID
|
|
LaunchBiosAcmClearSecrets (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Execute ACHECK through BIOS ACM
|
|
**/
|
|
VOID
|
|
LaunchBiosAcmAcheck (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Issue a cpu-only reset through PCH and PORTCF9
|
|
**/
|
|
VOID
|
|
DoCpuReset (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Issue a HOST reset through PCH and PORTCF9
|
|
**/
|
|
VOID
|
|
DoHostReset (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Function is called in memory present environment on S3 resume
|
|
path. Saves contents of all MTRRs into table plus some registers.
|
|
|
|
@param[in] ApCfg - Base address of BIOS ACM location
|
|
**/
|
|
|
|
VOID
|
|
SaveApConfig (
|
|
UINT64 *ApCfg
|
|
);
|
|
|
|
/**
|
|
Function is called in memory present environment on S3 resume path.
|
|
Saves contents of all MTRRs into table plus some registers.
|
|
|
|
@param[in] BiosAcAddr - Point to BiosAc address in flash
|
|
**/
|
|
VOID
|
|
LaunchBiosAcm (
|
|
IN UINT64 *BiosAcAddr,
|
|
IN UINT64 Function,
|
|
IN UINT64 BootMode
|
|
);
|
|
|
|
/**
|
|
Dispatch APs to execute *Function with parameter pointed by *Param
|
|
|
|
@param[in] (*Function) - Address of Function to be executed by APs
|
|
@param[in] Param - Function parameter to be passed to
|
|
**/
|
|
VOID
|
|
StartupAllAPs (
|
|
VOID (*Function)(VOID *Param),
|
|
UINT64 *Param
|
|
);
|
|
|
|
/**
|
|
Initial AP configuration for SCHECK on S3 resume
|
|
|
|
@param[in] Param - Function parameter to be passed to
|
|
**/
|
|
VOID
|
|
DoApInit (
|
|
VOID *Param
|
|
);
|
|
|
|
/**
|
|
Put All APs into Wait-for-SIPI state
|
|
**/
|
|
VOID
|
|
PutApsInWfs (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Restore MTRR registers
|
|
|
|
@param[in] ApCfg - Point to the MTRR buffer
|
|
**/
|
|
VOID
|
|
RestoreMtrrProgramming (
|
|
UINT64 *ApCfg
|
|
);
|
|
|
|
/**
|
|
Restore APs' registers
|
|
|
|
@param[in] ApCfg - Point to APs' registers buffer
|
|
**/
|
|
VOID
|
|
RestoreApConfig (
|
|
void *ApCfg
|
|
);
|
|
|
|
/**
|
|
Initializes values passed to AP
|
|
|
|
@param[in] pctx - A pointer to an initialized TXT PEI Context data structure
|
|
**/
|
|
VOID
|
|
PrepareApParams (
|
|
IN TXT_INFO_HOB *TxtInfoHob
|
|
);
|
|
|
|
/**
|
|
This routine initializes and collects all PPIs and data required
|
|
by the routines in this file.
|
|
|
|
@param[in] pctx - A pointer to an initialized TXT PEI Context data structure
|
|
|
|
@exception EFI_UNSUPPORTED - If any of the required PPIs or data are unavailable
|
|
@retval EFI_SUCCESS - In all cases not listed above
|
|
**/
|
|
EFI_STATUS
|
|
InitializeTxtPeiLib (
|
|
IN TXT_INFO_HOB **TxtInfoHob
|
|
);
|
|
|
|
/**
|
|
Determines whether or not the current processor is TXT Capable.
|
|
|
|
@retval TRUE - If the current processor supports TXT
|
|
@retval FALSE - If the current processor does not support TXT
|
|
**/
|
|
BOOLEAN
|
|
IsTxtProcessor (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Determines whether or not the current chipset is TXT Capable.
|
|
|
|
@param[in] pctx - A pointer to an initialized TXT PEI Context data structure
|
|
|
|
@retval TRUE - If the current chipset supports TXT
|
|
@retval FALSE - If the current chipset doesn't supports TXT
|
|
**/
|
|
BOOLEAN
|
|
IsTxtChipset (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Determines whether or not POISON bit is set in status register
|
|
|
|
@retval TRUE - If the TPM reset bit is asserted.
|
|
@retval FALSE - If the TPM reset bit is unasserted.
|
|
**/
|
|
BOOLEAN
|
|
IsTxtResetSet (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Determines whether or not SECRETS.STS bit is set in E2STS status register
|
|
|
|
@retval TRUE - If the LT.SECRETS.STS bit is asserted.
|
|
@retval FALSE - If the LT.SECRETS.STS bit is unasserted.
|
|
**/
|
|
BOOLEAN
|
|
IsTxtSecretsSet (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Determines whether or not the platform has executed an TXT launch by
|
|
examining the TPM Establishment bit.
|
|
|
|
@param[in] pctx - A pointer to an initialized TXT PEI Context data structure
|
|
|
|
@retval TRUE - If the TPM establishment bit is asserted.
|
|
@retval FALSE - If the TPM establishment bit is unasserted.
|
|
**/
|
|
BOOLEAN
|
|
TxtIsEstablishmentBitAsserted (
|
|
IN TXT_INFO_HOB *TxtInfoHob
|
|
);
|
|
|
|
/**
|
|
Determines whether or not the platform has encountered an error during
|
|
a sleep or power-off state.
|
|
|
|
@retval TRUE - If the TXT_WAKE_ERROR bit is asserted.
|
|
@retval FALSE - If the TXT_WAKE_ERROR bit is unasserted.
|
|
**/
|
|
BOOLEAN
|
|
IsTxtWakeError (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Determines whether or not the platform memory has been locked
|
|
|
|
@retval TRUE - If memroy is locked
|
|
@retval FALSE - If memory is unlocked
|
|
**/
|
|
BOOLEAN
|
|
IsMemoryLocked (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
@param[in] pctx - A pointer to an initialized TXT PEI Context data structure
|
|
|
|
@retval TRUE - If TXT is enabled by platform setting
|
|
@retval FALSE - If TXT is disabled by platform setting
|
|
**/
|
|
BOOLEAN
|
|
IsTxtEnabled (
|
|
IN TXT_INFO_HOB *TxtInfoHob
|
|
);
|
|
|
|
/**
|
|
Determines whether Alias Check Request is enabled by platform setting
|
|
|
|
@param[in] pctx - A pointer to an initialized TXT PEI Context data structure
|
|
|
|
@retval TRUE - If ACHECK REQUEST is enabled by platform setting
|
|
@retval FALSE - If ACHECK REQUEST is disabled by platform setting
|
|
**/
|
|
BOOLEAN
|
|
IsAcheckRequested (
|
|
IN TXT_INFO_HOB *TxtInfoHob
|
|
);
|
|
|
|
/**
|
|
Determines ACM is matched to chipset or not
|
|
|
|
@param[in] pctx - A pointer to an initialized TXT PEI Context data structure
|
|
@param[in] BiosAcmBase - A pointer to BIOS ACM location
|
|
|
|
@retval TRUE - BIOS ACM is matched to chipset
|
|
@retval FALSE - BIOS ACM is NOT matched to chipset
|
|
**/
|
|
BOOLEAN
|
|
CheckTxtAcmMatch (
|
|
ACM_HEADER *BiosAcmBase
|
|
);
|
|
|
|
/**
|
|
Clear Sleep Type register.
|
|
|
|
@param[in] pctx - A pointer to an initialized TXT PEI Context data structure
|
|
|
|
@retval EFI_SUCCESS - Always
|
|
**/
|
|
EFI_STATUS
|
|
ClearSlpTyp (
|
|
IN TXT_INFO_HOB *TxtInfoHob
|
|
);
|
|
|
|
/**
|
|
Issue a Global Reset
|
|
**/
|
|
VOID
|
|
IssueGlobalReset(
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Invokes the SCLEAN/ACHECK function from the TXT BIOS ACM.
|
|
1. Clearing of sleep type is necessary because SCLEAN/ACHECK destroys memory
|
|
context, so S3 after it is run and system is reset is impossible. We
|
|
do it here since there is no any indication that can sustain reset
|
|
for any other module to do it on our behalf.
|
|
2. APs are initialized before calling of SCLEAN/ACHECK
|
|
3. SCLEAN/ACHECK function is invoked.
|
|
|
|
@param[in] pctx - A pointer to an initialized TXT PEI Context data structure
|
|
@param[in] func - Acm function to be launch
|
|
|
|
@retval EFI_SUCCESS - Always.
|
|
**/
|
|
EFI_STATUS
|
|
DoAcmLaunch (
|
|
IN TXT_INFO_HOB *TxtInfoHob,
|
|
IN UINT8 func
|
|
);
|
|
|
|
/**
|
|
Determines presence of TPM in system
|
|
|
|
@param[in] pctx - Point to TXT_PEI_LIB_CONTEXT structure
|
|
|
|
@retval EFI_SUCCESS - If the TPM is present.
|
|
@retval EFI_NOT_FOUND - If the TPM is not present.
|
|
**/
|
|
EFI_STATUS
|
|
IsTpmPresent (
|
|
IN TXT_INFO_HOB *TxtInfoHob
|
|
);
|
|
|
|
/**
|
|
Parses Hob list for TXT Info HOB
|
|
|
|
@param[in] pctx - A pointer to an initialized TXT PEI Context data structure
|
|
|
|
@retval EFI_SUCCESS - If TXT Info Hob is found
|
|
@retval EFI_NOT_FOUND - If TXT Info Hob is not found
|
|
**/
|
|
EFI_STATUS
|
|
CreateTxtInfoHob (
|
|
IN TXT_INFO_HOB **TxtInfoHob
|
|
);
|
|
|
|
/**
|
|
Launching of SCHECK function from the TXT BIOS ACM.
|
|
|
|
@param[in] pctx - A pointer to an initialized TXT PEI Context data structure
|
|
|
|
@retval EFI_SUCCESS - Always.
|
|
**/
|
|
EFI_STATUS
|
|
DoPeiLaunchAcm (
|
|
IN EFI_PEI_SERVICES **PeiServices,
|
|
IN TXT_INFO_HOB *TxtInfoHob,
|
|
IN UINT64 Function,
|
|
IN UINT64 BootMode
|
|
);
|
|
|
|
/**
|
|
Disable or restore possible SMI sources before or after SCHECK on S3 resume.
|
|
|
|
@param[in] TxtContextDataPtr - A pointer to an initialized TXT PEI Context data structure
|
|
@param[in] SavedSmiSourcesVariablesPointer - Saved SMI source Variable
|
|
@param[in] Operation
|
|
- Boolean value telling what operation is requested:
|
|
- TRUE: save and then disable possible SMI sources.
|
|
- FALSE: restore original SMI settings.
|
|
|
|
@retval EFI_SUCCESS - Always.
|
|
**/
|
|
EFI_STATUS
|
|
DisableSmiSources (
|
|
IN TXT_INFO_HOB *TxtInfoHob,
|
|
IN UINT64* SavedSmiSourcesVariablesPointer,
|
|
IN BOOLEAN Operation
|
|
);
|
|
|
|
/**
|
|
Unlock memory when security is set and TxT is not enabled
|
|
|
|
@param[in] pctx - A pointer to an initialized TXT PEI Context data structure
|
|
|
|
@retval EFI_SUCCESS - Complete memory unlock
|
|
@exception EFI_UNSUPPORTED - CPU doesn't support TxT.
|
|
**/
|
|
EFI_STATUS
|
|
TxtUnlockMemory (
|
|
IN TXT_INFO_HOB *TxtInfoHob
|
|
);
|
|
|
|
/**
|
|
Fix up pointers since they are located in real memory now.
|
|
|
|
@param[in] PeiServices General purpose services available to every PEIM.
|
|
@param[in] NotifyDescriptor The notification structure this PEIM registered on install.
|
|
@param[in] Ppi The memory discovered PPI. Not used.
|
|
|
|
@retval EFI_SUCCESS The function completed successfully.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
DprUpdate (
|
|
IN TXT_INFO_HOB *TxtInfoHob
|
|
);
|
|
|
|
|
|
/**
|
|
Allocates 1 MB of 1MB-aligned memory for use as TXT Device Memory. Records
|
|
the location of TXT Device Memory in TXT Chipset registers and then adds
|
|
programming instructions for these registers into BootScript.
|
|
|
|
@param[in] TxtInfoHob - A pointer to TXT PEI HOB data structure
|
|
|
|
@retval EFI_SUCCESS TXT Device memory has been successfully initialized.
|
|
@retval EFI_ERROR TXT Device memory not awailable.
|
|
**/
|
|
|
|
|
|
EFI_STATUS
|
|
SetupTxtDeviceMemory (
|
|
IN TXT_INFO_HOB *TxtInfoHob,
|
|
IN UINTN CpuCount
|
|
);
|
|
|
|
|
|
/**
|
|
Initialize Txt feature
|
|
**/
|
|
EFI_STATUS
|
|
TxtInit (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
This is AliasCheck entry point for MRC call. The routine checks for an TXT
|
|
capable platform and determines whether ACHECK should be run. If so,
|
|
it launches the BIOS ACM to run ACHECK (which will reset the platform).
|
|
The AliasCheck routine is in peitxtlib.
|
|
|
|
@exception EFI_UNSUPPORTED - If the platform is not TXT capable.
|
|
@retval EFI_SUCCESS - In all other cases not listed above.
|
|
**/
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
AliasCheck (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
This is ClearSecretsBit entry point for MRC call.
|
|
|
|
@exception EFI_UNSUPPORTED - If the platform is not TXT capable.
|
|
@retval EFI_SUCCESS - In all other cases not listed above.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
ClearSecretsBit (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Set Power Down Request.
|
|
|
|
@param[in] PdrSrc Power down type
|
|
0 - No Power Down Request
|
|
1 - MRC requested Power Down due to scrubbing failure
|
|
2 - BIOS setup requested power down
|
|
3 - Power down through MOR interface
|
|
|
|
@exception EFI_UNSUPPORTED - If the platform is not TXT capable.
|
|
@retval EFI_SUCCESS - In all other cases not listed above.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
SetPowerDownRequest (
|
|
UINT8 PdrSrc
|
|
);
|
|
|
|
/**
|
|
This provides TXT status information from S_ACM.
|
|
|
|
@retval TRUE - If Bit 30 of LT_SPAD is set by S-ACM , otherwise FALSE
|
|
**/
|
|
BOOLEAN
|
|
IsBptTxtPassed (
|
|
VOID
|
|
);
|
|
|
|
#endif
|