AppPkg/Applications/chipsec/cpu.h
#ifndef CPU_H
#define CPU_H
//#ifndef _WIN64 TODO: remove
#if 0
#define _eflags( eflags ) __asm \
{ \
__asm push eax \
__asm pushfd \
__asm pop eax \
__asm mov eflags, eax \
__asm pop eax \
}
#endif
#if defined(_M_AMD64)
typedef UINT64 CPU_REG_TYPE;
#elif defined(_M_IX86)
typedef UINT32 CPU_REG_TYPE;
#else
#error "Architecture not supported"
#endif
/*
* External Assembly Functions
*/
// -- Access to CPU MSRs
extern void _rdmsr( unsigned int msr_num, unsigned int* msr_lo, unsigned int* msr_hi );
extern void _wrmsr( unsigned int msr_num, unsigned int msr_hi, unsigned int msr_lo );
// -- Access to PCI CFG space
extern void WritePCIByte ( unsigned int pci_reg, unsigned short cfg_data_port, unsigned char byte_value );
extern void WritePCIWord ( unsigned int pci_reg, unsigned short cfg_data_port, unsigned short word_value );
extern void WritePCIDword ( unsigned int pci_reg, unsigned short cfg_data_port, unsigned int dword_value );
extern unsigned char ReadPCIByte ( unsigned int pci_reg, unsigned short cfg_data_port );
extern unsigned short ReadPCIWord ( unsigned int pci_reg, unsigned short cfg_data_port );
extern unsigned int ReadPCIDword( unsigned int pci_reg, unsigned short cfg_data_port );
// -- Access to Port I/O
extern unsigned int ReadPortDword ( unsigned short port_num );
extern unsigned short ReadPortWord ( unsigned short port_num );
extern unsigned char ReadPortByte ( unsigned short port_num );
extern void WritePortDword( unsigned int out_value, unsigned short port_num );
extern void WritePortWord ( unsigned short out_value, unsigned short port_num );
extern void WritePortByte ( unsigned char out_value, unsigned short port_num );
// -- Access to CPU Descriptor tables
extern void _store_idtr( void* desc_address );
extern void _load_idtr ( void* desc_address );
extern void _store_gdtr( void* desc_address );
extern void _store_ldtr( void* desc_address );
// general purprose
extern int usleep(int microseconds);
// -- Interrupts
//extern void __stdcall _swsmi( UINT32 smi_code_data, CPU_REG_TYPE rax_value, CPU_REG_TYPE rbx_value, CPU_REG_TYPE rcx_value, CPU_REG_TYPE rdx_value, CPU_REG_TYPE rsi_value, CPU_REG_TYPE rdi_value );
// --
// -- MSR definitions
// --
#define MSR_IA32_BIOS_UPDT_TRIG 0x79
#define MSR_IA32_BIOS_SIGN_ID 0x8b
// -- CPU Descriptor tables
typedef enum {
CPU_DT_CODE_IDTR = 0x0,
CPU_DT_CODE_GDTR = 0x1,
CPU_DT_CODE_LDTR = 0x2,
} DTR_CODE;
#pragma pack(1)
typedef struct _DESCRIPTOR_TABLE_RECORD {
UINT16 limit;
//UINT32 base_hi;
//UINT32 base_lo;
UINT32 base;
} DESCRIPTOR_TABLE_RECORD, *PDESCRIPTOR_TABLE_RECORD;
#pragma pack()
#endif // CPU_H