/** @file
Protocol used to report CPU information
Copyright (c) 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef _CPU_INFO_H_
#define _CPU_INFO_H_
#include
typedef struct _CPU_INFO_PROTOCOL CPU_INFO_PROTOCOL;
extern EFI_GUID gCpuInfoProtocolGuid;
//
// DXE_CPU_INFO_PROTOCOL revisions
//
#define CPU_INFO_PROTOCOL_REVISION 1
//
// Processor feature definitions.
//
#define TXT_SUPPORT BIT0
#define VMX_SUPPORT BIT1
#define XD_SUPPORT BIT2
#define DCA_SUPPORT BIT3
#define X2APIC_SUPPORT BIT4
#define AES_SUPPORT BIT5
#define HT_SUPPORT BIT6
#define DEBUG_SUPPORT BIT7
#define DEBUG_LOCK_SUPPORT BIT8
#define PROC_TRACE_SUPPORT BIT9
#define HDC_SUPPORT BIT10
#pragma pack(1)
///
/// Cache descriptor information
///
typedef struct {
UINT8 Desc; ///< Cache Descriptor
UINT8 Level; ///< Cache Level
UINT8 Type; ///< Cache Type. 0: Data, 1: Instruction, 3: Unified
UINT32 Size; ///< Cache Size.
UINT16 Associativity; ///< Cache Ways of Associativity.
} CACHE_DESCRIPTOR_INFO;
///
/// Processor information
///
typedef struct {
UINT32 CpuSignature; ///< Processor signature and version information.
UINT64 Features; ///< Features availability in the CPU based on reading ECX after doing Asmcpuid(EAX=1).
CHAR8 *BrandString; ///< Processor Brand String.
UINT8 NumSupportedCores; ///< Total Number of Supported Cores in CPU Package. If Dual core, 2 cores.
UINT8 NumSupportedThreadsPerCore; ///< Number of Supported Threads per Core.
UINT8 NumCores; ///< Number of Enabled or Active Cores.
UINT8 NumHts; ///< Number of Enabled Threads per Core. This will be 1 or 2.
UINT32 IntendedFreq; ///< Maximum non turbo ratio in MHz
UINT32 ActualFreq; ///< Actual frequency in MHz
UINT32 Voltage; ///< Current operating voltage.
CACHE_DESCRIPTOR_INFO *CacheInfo; ///< Cache descriptor information.
UINT8 MaxCacheSupported; ///< Maximum cache supported.
UINT8 SmmbaseSwSmiNumber; ///< Software SMI Number from Smbase.
UINT16 NumberOfPStates; ///< Number of P-States.
} CPU_INFO;
///
/// This HOB is data structure representing two different address location in SMRAM to hold SMRAM CPU DATA.
///
typedef struct {
EFI_PHYSICAL_ADDRESS LockBoxData; ///< First location (address) of SMRAM CPU DATA.
EFI_PHYSICAL_ADDRESS SmramCpuData; ///< Second location (Address) of SMRAM CPU DATA.
UINT64 LockBoxSize; ///< Size of SMRAM CPU DATA.
} SMRAM_CPU_INFO;
///
/// SGX Information
///
typedef struct {
UINT64 SgxSinitNvsData; ///< Sinit SE SVN Version saved and passed back in next boot
} SGX_INFO;
#pragma pack()
///
/// This protocol provides information about the common features available in this CPU.
///
struct _CPU_INFO_PROTOCOL {
/**
Revision for the protocol structure.
Any backwards compatible changes to this protocol will result in an update in the revision number.
Major changes will require publication of a new protocol
Revision 1:
- Initial version
**/
UINT8 Revision;
/**
CPU Supported Feature.
- BIT0: If set then processor supports TXT.
- BIT1: If set then processor supports virtual mode extensions.
- BIT2: If set then processor supports execute disable bit.
- BIT3: If set then processor supports DCA.
- BIT4: If set then processor supports X2APIC.
- BIT5: If set then processor supports Advanced Encryption Standard.
- BIT6: If set then processor supports hyperthreading.
- BIT7: If set then processor supports debug interface.
- BIT8: If set then processor supports debug interface lock.
- BIT9: If set then processor supports processor trace.
- BIT10: If Set then processor supports supports HDC.
**/
UINT64 CpuCommonFeatures;
CPU_INFO *CpuInfo; ///< Processor Basic Information
SMRAM_CPU_INFO *SmramCpuInfo; ///< SMRAM CPU Information
SGX_INFO *SgxInfo; ///< SGX Information
};
#endif