1/** @file
2SMM profile internal header file.
3
4Copyright (c) 2012 - 2016, Intel Corporation. All rights reserved.<BR>
5This program and the accompanying materials
6are licensed and made available under the terms and conditions of the BSD License
7which accompanies this distribution.  The full text of the license may be found at
8http://opensource.org/licenses/bsd-license.php
9
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13**/
14
15#ifndef _SMM_PROFILE_INTERNAL_H_
16#define _SMM_PROFILE_INTERNAL_H_
17
18#include <Guid/GlobalVariable.h>
19#include <Guid/Acpi.h>
20#include <Protocol/SmmReadyToLock.h>
21#include <Library/UefiRuntimeServicesTableLib.h>
22#include <Library/DxeServicesTableLib.h>
23#include <Library/CpuLib.h>
24#include <IndustryStandard/Acpi.h>
25
26#include "SmmProfileArch.h"
27
28//
29// Configure the SMM_PROFILE DTS region size
30//
31#define SMM_PROFILE_DTS_SIZE       (4 * 1024 * 1024) // 4M
32
33#define MAX_PF_PAGE_COUNT           0x2
34
35#define PEBS_RECORD_NUMBER          0x2
36
37#define MAX_PF_ENTRY_COUNT          10
38
39//
40// This MACRO just enable unit test for the profile
41// Please disable it.
42//
43
44#define IA32_PF_EC_P                (1u << 0)
45#define IA32_PF_EC_WR               (1u << 1)
46#define IA32_PF_EC_US               (1u << 2)
47#define IA32_PF_EC_RSVD             (1u << 3)
48#define IA32_PF_EC_ID               (1u << 4)
49
50#define SMM_PROFILE_NAME            L"SmmProfileData"
51
52//
53// CPU generic definition
54//
55#define   CPUID1_EDX_XD_SUPPORT      0x100000
56#define   MSR_EFER                   0xc0000080
57#define   MSR_EFER_XD                0x800
58
59#define   CPUID1_EDX_BTS_AVAILABLE   0x200000
60
61#define   DR6_SINGLE_STEP            0x4000
62#define   RFLAG_TF                   0x100
63
64#define MSR_DEBUG_CTL                0x1D9
65#define   MSR_DEBUG_CTL_LBR          0x1
66#define   MSR_DEBUG_CTL_TR           0x40
67#define   MSR_DEBUG_CTL_BTS          0x80
68#define   MSR_DEBUG_CTL_BTINT        0x100
69#define MSR_DS_AREA                  0x600
70
71typedef struct {
72  EFI_PHYSICAL_ADDRESS   Base;
73  EFI_PHYSICAL_ADDRESS   Top;
74} MEMORY_RANGE;
75
76typedef struct {
77  MEMORY_RANGE   Range;
78  BOOLEAN        Present;
79  BOOLEAN        Nx;
80} MEMORY_PROTECTION_RANGE;
81
82typedef struct {
83  UINT64  HeaderSize;
84  UINT64  MaxDataEntries;
85  UINT64  MaxDataSize;
86  UINT64  CurDataEntries;
87  UINT64  CurDataSize;
88  UINT64  TsegStart;
89  UINT64  TsegSize;
90  UINT64  NumSmis;
91  UINT64  NumCpus;
92} SMM_PROFILE_HEADER;
93
94typedef struct {
95  UINT64  SmiNum;
96  UINT64  CpuNum;
97  UINT64  ApicId;
98  UINT64  ErrorCode;
99  UINT64  Instruction;
100  UINT64  Address;
101  UINT64  SmiCmd;
102} SMM_PROFILE_ENTRY;
103
104extern SMM_S3_RESUME_STATE       *mSmmS3ResumeState;
105extern UINTN                     gSmiExceptionHandlers[];
106extern BOOLEAN                   mXdSupported;
107extern UINTN                     *mPFEntryCount;
108extern UINT64                    (*mLastPFEntryValue)[MAX_PF_ENTRY_COUNT];
109extern UINT64                    *(*mLastPFEntryPointer)[MAX_PF_ENTRY_COUNT];
110
111//
112// Internal functions
113//
114
115/**
116  Update IDT table to replace page fault handler and INT 1 handler.
117
118**/
119VOID
120InitIdtr (
121  VOID
122  );
123
124/**
125  Check if the memory address will be mapped by 4KB-page.
126
127  @param  Address  The address of Memory.
128
129**/
130BOOLEAN
131IsAddressSplit (
132  IN EFI_PHYSICAL_ADDRESS   Address
133  );
134
135/**
136  Check if the memory address will be mapped by 4KB-page.
137
138  @param  Address  The address of Memory.
139  @param  Nx       The flag indicates if the memory is execute-disable.
140
141**/
142BOOLEAN
143IsAddressValid (
144  IN EFI_PHYSICAL_ADDRESS   Address,
145  IN BOOLEAN                *Nx
146  );
147
148/**
149  Page Fault handler for SMM use.
150
151**/
152VOID
153SmiDefaultPFHandler (
154  VOID
155  );
156
157/**
158  Clear TF in FLAGS.
159
160  @param  SystemContext    A pointer to the processor context when
161                           the interrupt occurred on the processor.
162
163**/
164VOID
165ClearTrapFlag (
166  IN OUT EFI_SYSTEM_CONTEXT   SystemContext
167  );
168
169#endif // _SMM_PROFILE_H_
170