17947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney/** @file 27947da3cccb5dfc973fe9ad9d814477ed978aea1Michael KinneyIA-32 processor specific header file to enable SMM profile. 37947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney 47947da3cccb5dfc973fe9ad9d814477ed978aea1Michael KinneyCopyright (c) 2012 - 2015, Intel Corporation. All rights reserved.<BR> 57947da3cccb5dfc973fe9ad9d814477ed978aea1Michael KinneyThis program and the accompanying materials 67947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinneyare licensed and made available under the terms and conditions of the BSD License 77947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinneywhich accompanies this distribution. The full text of the license may be found at 87947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinneyhttp://opensource.org/licenses/bsd-license.php 97947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney 107947da3cccb5dfc973fe9ad9d814477ed978aea1Michael KinneyTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 117947da3cccb5dfc973fe9ad9d814477ed978aea1Michael KinneyWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 127947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney 137947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney**/ 147947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney 157947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney#ifndef _SMM_PROFILE_ARCH_H_ 167947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney#define _SMM_PROFILE_ARCH_H_ 177947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney 187947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney#pragma pack (1) 197947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney 207947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinneytypedef struct _MSR_DS_AREA_STRUCT { 217947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT32 BTSBufferBase; 227947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT32 BTSIndex; 237947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT32 BTSAbsoluteMaximum; 247947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT32 BTSInterruptThreshold; 257947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT32 PEBSBufferBase; 267947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT32 PEBSIndex; 277947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT32 PEBSAbsoluteMaximum; 287947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT32 PEBSInterruptThreshold; 297947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT32 PEBSCounterReset[4]; 307947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT32 Reserved; 317947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney} MSR_DS_AREA_STRUCT; 327947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney 337947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinneytypedef struct _BRANCH_TRACE_RECORD { 347947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT32 LastBranchFrom; 357947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT32 LastBranchTo; 367947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT32 Rsvd0 : 4; 377947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT32 BranchPredicted : 1; 387947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT32 Rsvd1 : 27; 397947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney} BRANCH_TRACE_RECORD; 407947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney 417947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinneytypedef struct _PEBS_RECORD { 427947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT32 Eflags; 437947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT32 LinearIP; 447947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT32 Eax; 457947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT32 Ebx; 467947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT32 Ecx; 477947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT32 Edx; 487947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT32 Esi; 497947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT32 Edi; 507947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT32 Ebp; 517947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT32 Esp; 527947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney} PEBS_RECORD; 537947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney 547947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney#pragma pack () 557947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney 567947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney#define PHYSICAL_ADDRESS_MASK ((1ull << 32) - SIZE_4KB) 577947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney 587947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney/** 597947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney Update page table to map the memory correctly in order to make the instruction 607947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney which caused page fault execute successfully. And it also save the original page 617947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney table to be restored in single-step exception. 32-bit firmware does not need it. 627947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney 637947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney @param PageTable PageTable Address. 647947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney @param PFAddress The memory address which caused page fault exception. 657947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney @param CpuIndex The index of the processor. 667947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney @param ErrorCode The Error code of exception. 677947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney @param IsValidPFAddress The flag indicates if SMM profile data need be added. 687947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney 697947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney**/ 707947da3cccb5dfc973fe9ad9d814477ed978aea1Michael KinneyVOID 717947da3cccb5dfc973fe9ad9d814477ed978aea1Michael KinneyRestorePageTableAbove4G ( 727947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT64 *PageTable, 737947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINT64 PFAddress, 747947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINTN CpuIndex, 757947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney UINTN ErrorCode, 767947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney BOOLEAN *IsValidPFAddress 777947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney ); 787947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney 797947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney/** 807947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney Create SMM page table for S3 path. 817947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney 827947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney**/ 837947da3cccb5dfc973fe9ad9d814477ed978aea1Michael KinneyVOID 847947da3cccb5dfc973fe9ad9d814477ed978aea1Michael KinneyInitSmmS3Cr3 ( 857947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney VOID 867947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney ); 877947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney 887947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney/** 897947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney Allocate pages for creating 4KB-page based on 2MB-page when page fault happens. 907947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney 917947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney**/ 927947da3cccb5dfc973fe9ad9d814477ed978aea1Michael KinneyVOID 937947da3cccb5dfc973fe9ad9d814477ed978aea1Michael KinneyInitPagesForPFHandler ( 947947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney VOID 957947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney ); 967947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney 977947da3cccb5dfc973fe9ad9d814477ed978aea1Michael Kinney#endif // _SMM_PROFILE_ARCH_H_ 98