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