1e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/** @file
2e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  The internal header file includes the common header files, defines
3e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  internal structure and functions used by SmmCore module.
4e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
563aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng  Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.<BR>
6e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  This program and the accompanying materials are licensed and made available
7e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  under the terms and conditions of the BSD License which accompanies this
8e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  distribution.  The full text of the license may be found at
9e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  http://opensource.org/licenses/bsd-license.php
10e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
11e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
14e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
15e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
16e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#ifndef _SMM_CORE_H_
17e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#define _SMM_CORE_H_
18e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
19e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#include <PiSmm.h>
20e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
21e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#include <Protocol/DxeSmmReadyToLock.h>
22e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#include <Protocol/SmmReadyToLock.h>
2346ece1ff4f097678ddd3609ccb104a22c0bae469jyao#include <Protocol/SmmEndOfDxe.h>
24e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#include <Protocol/CpuIo2.h>
25e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#include <Protocol/SmmCommunication.h>
26e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#include <Protocol/SmmAccess2.h>
27e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#include <Protocol/FirmwareVolume2.h>
28e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#include <Protocol/LoadedImage.h>
29e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#include <Protocol/DevicePath.h>
30e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#include <Protocol/Security.h>
31bc2dfdbcfc11dc785f0cc0ad2f519a63b98f88bclgao#include <Protocol/Security2.h>
3253ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng#include <Protocol/SmmExitBootServices.h>
3353ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng#include <Protocol/SmmLegacyBoot.h>
3453ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng#include <Protocol/SmmReadyToBoot.h>
35e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
36e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#include <Guid/Apriori.h>
37e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#include <Guid/EventGroup.h>
38e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#include <Guid/EventLegacyBios.h>
3984edd20bd0756ef5719835498d4283435d6b5e77Star Zeng#include <Guid/ZeroGuid.h>
4084edd20bd0756ef5719835498d4283435d6b5e77Star Zeng#include <Guid/MemoryProfile.h>
41e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
42e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#include <Library/BaseLib.h>
43e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#include <Library/BaseMemoryLib.h>
44e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#include <Library/PeCoffLib.h>
45e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#include <Library/CacheMaintenanceLib.h>
46e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#include <Library/DebugLib.h>
47e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#include <Library/ReportStatusCodeLib.h>
48e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#include <Library/MemoryAllocationLib.h>
49e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#include <Library/DevicePathLib.h>
50e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#include <Library/UefiLib.h>
513c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen#include <Library/UefiBootServicesTableLib.h>
523c447c2760b3438a6d5ff0a7f2dbd580526452e5jchen#include <Library/PcdLib.h>
53495797c5578e88cd1a769e918502cf426f08d6b0rsun#include <Library/SmmCorePlatformHookLib.h>
54495797c5578e88cd1a769e918502cf426f08d6b0rsun#include <Library/PerformanceLib.h>
55c2cb08df473b9269bace69e21266218fcc817703lgao#include <Library/TimerLib.h>
563720ee6d32219fd67d391f53f2cb812dc197a86bJeff Fan#include <Library/HobLib.h>
57842b1242d19225bb6d6146861d3418a5c9549175Yao, Jiewen#include <Library/SmmMemLib.h>
58e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
59e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#include "PiSmmCorePrivateData.h"
60e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
61e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney//
62e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney// Used to build a table of SMI Handlers that the SMM Core registers
63e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney//
64e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneytypedef struct {
65e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  EFI_SMM_HANDLER_ENTRY_POINT2  Handler;
66e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  EFI_GUID                      *HandlerType;
67e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  EFI_HANDLE                    DispatchHandle;
68e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  BOOLEAN                       UnRegister;
69e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney} SMM_CORE_SMI_HANDLERS;
70e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
71e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney//
72e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney// Structure for recording the state of an SMM Driver
73e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney//
74e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#define EFI_SMM_DRIVER_ENTRY_SIGNATURE SIGNATURE_32('s', 'd','r','v')
75e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
76e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneytypedef struct {
77e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  UINTN                           Signature;
78e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  LIST_ENTRY                      Link;             // mDriverList
79e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
80e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  LIST_ENTRY                      ScheduledLink;    // mScheduledQueue
81e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
82e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  EFI_HANDLE                      FvHandle;
83e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  EFI_GUID                        FileName;
84e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  EFI_DEVICE_PATH_PROTOCOL        *FvFileDevicePath;
85e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  EFI_FIRMWARE_VOLUME2_PROTOCOL   *Fv;
86e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
87e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  VOID                            *Depex;
88e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  UINTN                           DepexSize;
89e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
90e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  BOOLEAN                         Before;
91e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  BOOLEAN                         After;
92e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  EFI_GUID                        BeforeAfterGuid;
93e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
94e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  BOOLEAN                         Dependent;
95e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  BOOLEAN                         Scheduled;
96e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  BOOLEAN                         Initialized;
97e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  BOOLEAN                         DepexProtocolError;
98e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
99e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  EFI_HANDLE                      ImageHandle;
100e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  EFI_LOADED_IMAGE_PROTOCOL       *LoadedImage;
101e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  //
102e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  // Image EntryPoint in SMRAM
103e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  //
104e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  PHYSICAL_ADDRESS                ImageEntryPoint;
105e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  //
106e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  // Image Buffer in SMRAM
107e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  //
108e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  PHYSICAL_ADDRESS                ImageBuffer;
109e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  //
110e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  // Image Page Number
111e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  //
112e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  UINTN                           NumberOfPage;
113e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney} EFI_SMM_DRIVER_ENTRY;
114e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
115e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#define EFI_HANDLE_SIGNATURE            SIGNATURE_32('h','n','d','l')
116e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
117e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney///
118e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/// IHANDLE - contains a list of protocol handles
119e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney///
120e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneytypedef struct {
121e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  UINTN               Signature;
122e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// All handles list of IHANDLE
123e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  LIST_ENTRY          AllHandles;
124e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// List of PROTOCOL_INTERFACE's for this handle
125e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  LIST_ENTRY          Protocols;
126e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  UINTN               LocateRequest;
127e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney} IHANDLE;
128e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
129e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#define ASSERT_IS_HANDLE(a)  ASSERT((a)->Signature == EFI_HANDLE_SIGNATURE)
130e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
131e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#define PROTOCOL_ENTRY_SIGNATURE        SIGNATURE_32('p','r','t','e')
132e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
133e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney///
134e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/// PROTOCOL_ENTRY - each different protocol has 1 entry in the protocol
135e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/// database.  Each handler that supports this protocol is listed, along
136e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/// with a list of registered notifies.
137e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney///
138e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneytypedef struct {
139e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  UINTN               Signature;
140e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// Link Entry inserted to mProtocolDatabase
141e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  LIST_ENTRY          AllEntries;
142e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// ID of the protocol
143e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  EFI_GUID            ProtocolID;
144e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// All protocol interfaces
145e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  LIST_ENTRY          Protocols;
146e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// Registerd notification handlers
147e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  LIST_ENTRY          Notify;
148e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney} PROTOCOL_ENTRY;
149e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
150e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#define PROTOCOL_INTERFACE_SIGNATURE  SIGNATURE_32('p','i','f','c')
151e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
152e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney///
153e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/// PROTOCOL_INTERFACE - each protocol installed on a handle is tracked
154e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/// with a protocol interface structure
155e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney///
156e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneytypedef struct {
157e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  UINTN                       Signature;
158e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// Link on IHANDLE.Protocols
159e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  LIST_ENTRY                  Link;
160e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// Back pointer
161e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IHANDLE                     *Handle;
162e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// Link on PROTOCOL_ENTRY.Protocols
163e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  LIST_ENTRY                  ByProtocol;
164e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// The protocol ID
165e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  PROTOCOL_ENTRY              *Protocol;
166e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// The interface value
167e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  VOID                        *Interface;
168e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney} PROTOCOL_INTERFACE;
169e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
170e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#define PROTOCOL_NOTIFY_SIGNATURE       SIGNATURE_32('p','r','t','n')
171e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
172e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney///
173e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/// PROTOCOL_NOTIFY - used for each register notification for a protocol
174e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney///
175e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneytypedef struct {
176e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  UINTN               Signature;
177e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  PROTOCOL_ENTRY      *Protocol;
178e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// All notifications for this protocol
179e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  LIST_ENTRY          Link;
180e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// Notification function
181e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  EFI_SMM_NOTIFY_FN   Function;
182e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  /// Last position notified
183e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  LIST_ENTRY          *Position;
184e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney} PROTOCOL_NOTIFY;
185e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
186e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney//
187e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney// SMM Core Global Variables
188e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney//
189e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyextern SMM_CORE_PRIVATE_DATA  *gSmmCorePrivate;
190e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyextern EFI_SMM_SYSTEM_TABLE2  gSmmCoreSmst;
191e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyextern LIST_ENTRY             gHandleList;
1923c447c2760b3438a6d5ff0a7f2dbd580526452e5jchenextern EFI_PHYSICAL_ADDRESS   gLoadModuleAtFixAddressSmramBase;
193e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
194e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
195e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Called to initialize the memory service.
196e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
197e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param   SmramRangeCount       Number of SMRAM Regions
198e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param   SmramRanges           Pointer to SMRAM Descriptors
199e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
200e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
201e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyVOID
202e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmmInitializeMemoryServices (
203e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN UINTN                 SmramRangeCount,
204e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN EFI_SMRAM_DESCRIPTOR  *SmramRanges
205e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
206e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
207e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
208e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  The SmmInstallConfigurationTable() function is used to maintain the list
209e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  of configuration tables that are stored in the System Management System
210e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Table.  The list is stored as an array of (GUID, Pointer) pairs.  The list
211e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  must be allocated from pool memory with PoolType set to EfiRuntimeServicesData.
212e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
213e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  SystemTable      A pointer to the SMM System Table (SMST).
214e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Guid             A pointer to the GUID for the entry to add, update, or remove.
215e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Table            A pointer to the buffer of the table to add.
216e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  TableSize        The size of the table to install.
217e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
218e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_SUCCESS           The (Guid, Table) pair was added, updated, or removed.
219e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_INVALID_PARAMETER Guid is not valid.
220e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_NOT_FOUND         An attempt was made to delete a non-existent entry.
221e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_OUT_OF_RESOURCES  There is not enough memory available to complete the operation.
222e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
223e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
224e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFI_STATUS
225e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFIAPI
226e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmmInstallConfigurationTable (
227e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN  CONST EFI_SMM_SYSTEM_TABLE2  *SystemTable,
228e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN  CONST EFI_GUID              *Guid,
229e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN  VOID                        *Table,
230e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN  UINTN                       TableSize
231e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
232e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
233e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
234e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Wrapper function to SmmInstallProtocolInterfaceNotify.  This is the public API which
235e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Calls the private one which contains a BOOLEAN parameter for notifications
236e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
237e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  UserHandle             The handle to install the protocol handler on,
238e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                                 or NULL if a new handle is to be allocated
239e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Protocol               The protocol to add to the handle
240e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  InterfaceType          Indicates whether Interface is supplied in
241e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                                 native form.
242e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Interface              The interface for the protocol being added
243e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
244e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @return Status code
245e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
246e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
247e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFI_STATUS
248e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFIAPI
249e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmmInstallProtocolInterface (
250e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN OUT EFI_HANDLE     *UserHandle,
251e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN EFI_GUID           *Protocol,
252e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN EFI_INTERFACE_TYPE InterfaceType,
253e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN VOID               *Interface
254e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
255e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
256e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
257e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Allocates pages from the memory map.
258e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
259e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Type                   The type of allocation to perform
260e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  MemoryType             The type of memory to turn the allocated pages
261e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                                 into
262e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  NumberOfPages          The number of pages to allocate
263e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Memory                 A pointer to receive the base allocated memory
264e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                                 address
265e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
266e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_INVALID_PARAMETER  Parameters violate checking rules defined in spec.
267e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_NOT_FOUND          Could not allocate pages match the requirement.
268e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_OUT_OF_RESOURCES   No enough pages to allocate.
269e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_SUCCESS            Pages successfully allocated.
270e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
271e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
272e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFI_STATUS
273e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFIAPI
274e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmmAllocatePages (
275e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN      EFI_ALLOCATE_TYPE         Type,
276e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN      EFI_MEMORY_TYPE           MemoryType,
277e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN      UINTN                     NumberOfPages,
278e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  OUT     EFI_PHYSICAL_ADDRESS      *Memory
279e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
280e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
281e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
28284edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  Allocates pages from the memory map.
28384edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
28484edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @param  Type                   The type of allocation to perform
28584edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @param  MemoryType             The type of memory to turn the allocated pages
28684edd20bd0756ef5719835498d4283435d6b5e77Star Zeng                                 into
28784edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @param  NumberOfPages          The number of pages to allocate
28884edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @param  Memory                 A pointer to receive the base allocated memory
28984edd20bd0756ef5719835498d4283435d6b5e77Star Zeng                                 address
29084edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
29184edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @retval EFI_INVALID_PARAMETER  Parameters violate checking rules defined in spec.
29284edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @retval EFI_NOT_FOUND          Could not allocate pages match the requirement.
29384edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @retval EFI_OUT_OF_RESOURCES   No enough pages to allocate.
29484edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @retval EFI_SUCCESS            Pages successfully allocated.
29584edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
29684edd20bd0756ef5719835498d4283435d6b5e77Star Zeng**/
29784edd20bd0756ef5719835498d4283435d6b5e77Star ZengEFI_STATUS
29884edd20bd0756ef5719835498d4283435d6b5e77Star ZengEFIAPI
29984edd20bd0756ef5719835498d4283435d6b5e77Star ZengSmmInternalAllocatePages (
30084edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  IN      EFI_ALLOCATE_TYPE         Type,
30184edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  IN      EFI_MEMORY_TYPE           MemoryType,
30284edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  IN      UINTN                     NumberOfPages,
30384edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  OUT     EFI_PHYSICAL_ADDRESS      *Memory
30484edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  );
30584edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
30684edd20bd0756ef5719835498d4283435d6b5e77Star Zeng/**
307e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Frees previous allocated pages.
308e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
309e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Memory                 Base address of memory being freed
310e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  NumberOfPages          The number of pages to free
311e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
312e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_NOT_FOUND          Could not find the entry that covers the range
313e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_INVALID_PARAMETER  Address not aligned
314e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @return EFI_SUCCESS            Pages successfully freed.
315e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
316e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
317e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFI_STATUS
318e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFIAPI
319e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmmFreePages (
320e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN      EFI_PHYSICAL_ADDRESS      Memory,
321e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN      UINTN                     NumberOfPages
322e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
323e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
324e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
32584edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  Frees previous allocated pages.
32684edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
32784edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @param  Memory                 Base address of memory being freed
32884edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @param  NumberOfPages          The number of pages to free
32984edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
33084edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @retval EFI_NOT_FOUND          Could not find the entry that covers the range
33184edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @retval EFI_INVALID_PARAMETER  Address not aligned
33284edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @return EFI_SUCCESS            Pages successfully freed.
33384edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
33484edd20bd0756ef5719835498d4283435d6b5e77Star Zeng**/
33584edd20bd0756ef5719835498d4283435d6b5e77Star ZengEFI_STATUS
33684edd20bd0756ef5719835498d4283435d6b5e77Star ZengEFIAPI
33784edd20bd0756ef5719835498d4283435d6b5e77Star ZengSmmInternalFreePages (
33884edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  IN      EFI_PHYSICAL_ADDRESS      Memory,
33984edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  IN      UINTN                     NumberOfPages
34084edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  );
34184edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
34284edd20bd0756ef5719835498d4283435d6b5e77Star Zeng/**
343e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Allocate pool of a particular type.
344e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
345e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  PoolType               Type of pool to allocate
346e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Size                   The amount of pool to allocate
347e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Buffer                 The address to return a pointer to the allocated
348e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                                 pool
349e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
350e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_INVALID_PARAMETER  PoolType not valid
351e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_OUT_OF_RESOURCES   Size exceeds max pool size or allocation failed.
352e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_SUCCESS            Pool successfully allocated.
353e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
354e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
355e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFI_STATUS
356e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFIAPI
357e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmmAllocatePool (
358e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN      EFI_MEMORY_TYPE           PoolType,
359e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN      UINTN                     Size,
360e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  OUT     VOID                      **Buffer
361e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
362e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
363e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
36484edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  Allocate pool of a particular type.
36584edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
36684edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @param  PoolType               Type of pool to allocate
36784edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @param  Size                   The amount of pool to allocate
36884edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @param  Buffer                 The address to return a pointer to the allocated
36984edd20bd0756ef5719835498d4283435d6b5e77Star Zeng                                 pool
37084edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
37184edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @retval EFI_INVALID_PARAMETER  PoolType not valid
37284edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @retval EFI_OUT_OF_RESOURCES   Size exceeds max pool size or allocation failed.
37384edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @retval EFI_SUCCESS            Pool successfully allocated.
37484edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
37584edd20bd0756ef5719835498d4283435d6b5e77Star Zeng**/
37684edd20bd0756ef5719835498d4283435d6b5e77Star ZengEFI_STATUS
37784edd20bd0756ef5719835498d4283435d6b5e77Star ZengEFIAPI
37884edd20bd0756ef5719835498d4283435d6b5e77Star ZengSmmInternalAllocatePool (
37984edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  IN      EFI_MEMORY_TYPE           PoolType,
38084edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  IN      UINTN                     Size,
38184edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  OUT     VOID                      **Buffer
38284edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  );
38384edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
38484edd20bd0756ef5719835498d4283435d6b5e77Star Zeng/**
385e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Frees pool.
386e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
387e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Buffer                 The allocated pool entry to free
388e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
389e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_INVALID_PARAMETER  Buffer is not a valid value.
390e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_SUCCESS            Pool successfully freed.
391e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
392e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
393e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFI_STATUS
394e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFIAPI
395e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmmFreePool (
396e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN      VOID                      *Buffer
397e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
398e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
399e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
40084edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  Frees pool.
40184edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
40284edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @param  Buffer                 The allocated pool entry to free
40384edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
40484edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @retval EFI_INVALID_PARAMETER  Buffer is not a valid value.
40584edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @retval EFI_SUCCESS            Pool successfully freed.
40684edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
40784edd20bd0756ef5719835498d4283435d6b5e77Star Zeng**/
40884edd20bd0756ef5719835498d4283435d6b5e77Star ZengEFI_STATUS
40984edd20bd0756ef5719835498d4283435d6b5e77Star ZengEFIAPI
41084edd20bd0756ef5719835498d4283435d6b5e77Star ZengSmmInternalFreePool (
41184edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  IN      VOID                      *Buffer
41284edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  );
41384edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
41484edd20bd0756ef5719835498d4283435d6b5e77Star Zeng/**
415e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Installs a protocol interface into the boot services environment.
416e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
417e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  UserHandle             The handle to install the protocol handler on,
418e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                                 or NULL if a new handle is to be allocated
419e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Protocol               The protocol to add to the handle
420e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  InterfaceType          Indicates whether Interface is supplied in
421e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                                 native form.
422e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Interface              The interface for the protocol being added
423e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Notify                 indicates whether notify the notification list
424e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                                 for this protocol
425e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
426e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_INVALID_PARAMETER  Invalid parameter
427e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_OUT_OF_RESOURCES   No enough buffer to allocate
428e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_SUCCESS            Protocol interface successfully installed
429e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
430e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
431e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFI_STATUS
432e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmmInstallProtocolInterfaceNotify (
433e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN OUT EFI_HANDLE     *UserHandle,
434e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN EFI_GUID           *Protocol,
435e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN EFI_INTERFACE_TYPE InterfaceType,
436e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN VOID               *Interface,
437e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN BOOLEAN            Notify
438e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
439e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
440e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
441e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Uninstalls all instances of a protocol:interfacer from a handle.
442e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  If the last protocol interface is remove from the handle, the
443e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  handle is freed.
444e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
445e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  UserHandle             The handle to remove the protocol handler from
446e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Protocol               The protocol, of protocol:interface, to remove
447e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Interface              The interface, of protocol:interface, to remove
448e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
449e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_INVALID_PARAMETER  Protocol is NULL.
450e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_SUCCESS            Protocol interface successfully uninstalled.
451e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
452e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
453e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFI_STATUS
454e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFIAPI
455e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmmUninstallProtocolInterface (
456e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN EFI_HANDLE       UserHandle,
457e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN EFI_GUID         *Protocol,
458e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN VOID             *Interface
459e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
460e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
461e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
462e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Queries a handle to determine if it supports a specified protocol.
463e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
464e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  UserHandle             The handle being queried.
465e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Protocol               The published unique identifier of the protocol.
466e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Interface              Supplies the address where a pointer to the
467e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                                 corresponding Protocol Interface is returned.
468e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
469e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @return The requested protocol interface for the handle
470e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
471e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
472e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFI_STATUS
473e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFIAPI
474e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmmHandleProtocol (
475e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN EFI_HANDLE       UserHandle,
476e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN EFI_GUID         *Protocol,
477e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  OUT VOID            **Interface
478e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
479e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
480e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
481e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Add a new protocol notification record for the request protocol.
482e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
483e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Protocol               The requested protocol to add the notify
484e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                                 registration
485e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Function               Points to the notification function
486e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Registration           Returns the registration record
487e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
488e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_INVALID_PARAMETER  Invalid parameter
489e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_SUCCESS            Successfully returned the registration record
490e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                                 that has been added
491e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
492e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
493e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFI_STATUS
494e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFIAPI
495e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmmRegisterProtocolNotify (
496e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN  CONST EFI_GUID              *Protocol,
497e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN  EFI_SMM_NOTIFY_FN           Function,
498e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  OUT VOID                        **Registration
499e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
500e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
501e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
502e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Locates the requested handle(s) and returns them in Buffer.
503e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
504e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  SearchType             The type of search to perform to locate the
505e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                                 handles
506e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Protocol               The protocol to search for
507e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  SearchKey              Dependant on SearchType
508e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  BufferSize             On input the size of Buffer.  On output the
509e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                                 size of data returned.
510e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Buffer                 The buffer to return the results in
511e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
512e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_BUFFER_TOO_SMALL   Buffer too small, required buffer size is
513e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                                 returned in BufferSize.
514e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_INVALID_PARAMETER  Invalid parameter
515e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_SUCCESS            Successfully found the requested handle(s) and
516e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                                 returns them in Buffer.
517e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
518e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
519e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFI_STATUS
520e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFIAPI
521e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmmLocateHandle (
522e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN EFI_LOCATE_SEARCH_TYPE   SearchType,
523e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN EFI_GUID                 *Protocol   OPTIONAL,
524e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN VOID                     *SearchKey  OPTIONAL,
525e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN OUT UINTN                *BufferSize,
526e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  OUT EFI_HANDLE              *Buffer
527e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
528e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
529e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
530e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Return the first Protocol Interface that matches the Protocol GUID. If
531e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Registration is pasased in return a Protocol Instance that was just add
532e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  to the system. If Retistration is NULL return the first Protocol Interface
533e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  you find.
534e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
535e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Protocol               The protocol to search for
536e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Registration           Optional Registration Key returned from
537e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                                 RegisterProtocolNotify()
538e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Interface              Return the Protocol interface (instance).
539e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
540e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_SUCCESS            If a valid Interface is returned
541e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_INVALID_PARAMETER  Invalid parameter
542e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_NOT_FOUND          Protocol interface not found
543e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
544e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
545e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFI_STATUS
546e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFIAPI
547e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmmLocateProtocol (
548e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN  EFI_GUID  *Protocol,
549e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN  VOID      *Registration OPTIONAL,
550e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  OUT VOID      **Interface
551e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
552e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
553e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
554e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Manage SMI of a particular type.
555e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
556e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  HandlerType    Points to the handler type or NULL for root SMI handlers.
557e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Context        Points to an optional context buffer.
558e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  CommBuffer     Points to the optional communication buffer.
559e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  CommBufferSize Points to the size of the optional communication buffer.
560e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
561e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_SUCCESS                        Interrupt source was processed successfully but not quiesced.
562e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_INTERRUPT_PENDING              One or more SMI sources could not be quiesced.
563e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_WARN_INTERRUPT_SOURCE_PENDING  Interrupt source was not handled or quiesced.
564e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_WARN_INTERRUPT_SOURCE_QUIESCED Interrupt source was handled and quiesced.
565e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
566e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
567e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFI_STATUS
568e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFIAPI
569e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmiManage (
570e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN     CONST EFI_GUID           *HandlerType,
571e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN     CONST VOID               *Context         OPTIONAL,
572e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN OUT VOID                     *CommBuffer      OPTIONAL,
573e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN OUT UINTN                    *CommBufferSize  OPTIONAL
574e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
575e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
576e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
577e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Registers a handler to execute within SMM.
578e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
579e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Handler        Handler service funtion pointer.
580e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  HandlerType    Points to the handler type or NULL for root SMI handlers.
581e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  DispatchHandle On return, contains a unique handle which can be used to later unregister the handler function.
582e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
583e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_SUCCESS           Handler register success.
584e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_INVALID_PARAMETER Handler or DispatchHandle is NULL.
585e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
586e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
587e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFI_STATUS
588e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFIAPI
589e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmiHandlerRegister (
590e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN   EFI_SMM_HANDLER_ENTRY_POINT2   Handler,
591e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN   CONST EFI_GUID                 *HandlerType  OPTIONAL,
592e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  OUT  EFI_HANDLE                     *DispatchHandle
593e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
594e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
595e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
596e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Unregister a handler in SMM.
597e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
598e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  DispatchHandle  The handle that was specified when the handler was registered.
599e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
600e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_SUCCESS           Handler function was successfully unregistered.
601e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval EFI_INVALID_PARAMETER DispatchHandle does not refer to a valid handle.
602e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
603e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
604e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFI_STATUS
605e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFIAPI
606e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmiHandlerUnRegister (
607e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN  EFI_HANDLE                      DispatchHandle
608e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
609e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
610e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
611e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  This function is the main entry point for an SMM handler dispatch
612e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  or communicate-based callback.
613e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
614e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  DispatchHandle  The unique handle assigned to this handler by SmiHandlerRegister().
615e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Context         Points to an optional handler context which was specified when the handler was registered.
616e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  CommBuffer      A pointer to a collection of data in memory that will
617e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                          be conveyed from a non-SMM environment into an SMM environment.
618e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  CommBufferSize  The size of the CommBuffer.
619e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
620e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @return Status Code
621e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
622e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
623e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFI_STATUS
624e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFIAPI
625e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmmDriverDispatchHandler (
626e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN     EFI_HANDLE               DispatchHandle,
627e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN     CONST VOID               *Context,        OPTIONAL
628e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN OUT VOID                     *CommBuffer,     OPTIONAL
629e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN OUT UINTN                    *CommBufferSize  OPTIONAL
630e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
631e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
632e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
633e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  This function is the main entry point for an SMM handler dispatch
634e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  or communicate-based callback.
635e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
636e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  DispatchHandle  The unique handle assigned to this handler by SmiHandlerRegister().
637e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Context         Points to an optional handler context which was specified when the handler was registered.
638e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  CommBuffer      A pointer to a collection of data in memory that will
639e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                          be conveyed from a non-SMM environment into an SMM environment.
640e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  CommBufferSize  The size of the CommBuffer.
641e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
642e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @return Status Code
643e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
644e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
645e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFI_STATUS
646e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFIAPI
647e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmmLegacyBootHandler (
648e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN     EFI_HANDLE               DispatchHandle,
649e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN     CONST VOID               *Context,        OPTIONAL
650e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN OUT VOID                     *CommBuffer,     OPTIONAL
651e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN OUT UINTN                    *CommBufferSize  OPTIONAL
652e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
653e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
654e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
655e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  This function is the main entry point for an SMM handler dispatch
656e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  or communicate-based callback.
657e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
658e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  DispatchHandle  The unique handle assigned to this handler by SmiHandlerRegister().
659e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Context         Points to an optional handler context which was specified when the handler was registered.
660e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  CommBuffer      A pointer to a collection of data in memory that will
661e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                          be conveyed from a non-SMM environment into an SMM environment.
662e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  CommBufferSize  The size of the CommBuffer.
663e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
664e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @return Status Code
665e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
666e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
667e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFI_STATUS
668e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFIAPI
669e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmmReadyToLockHandler (
670e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN     EFI_HANDLE               DispatchHandle,
671e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN     CONST VOID               *Context,        OPTIONAL
672e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN OUT VOID                     *CommBuffer,     OPTIONAL
673e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN OUT UINTN                    *CommBufferSize  OPTIONAL
674e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
675e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
676e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
67746ece1ff4f097678ddd3609ccb104a22c0bae469jyao  This function is the main entry point for an SMM handler dispatch
67846ece1ff4f097678ddd3609ccb104a22c0bae469jyao  or communicate-based callback.
67946ece1ff4f097678ddd3609ccb104a22c0bae469jyao
68046ece1ff4f097678ddd3609ccb104a22c0bae469jyao  @param  DispatchHandle  The unique handle assigned to this handler by SmiHandlerRegister().
68146ece1ff4f097678ddd3609ccb104a22c0bae469jyao  @param  Context         Points to an optional handler context which was specified when the handler was registered.
68246ece1ff4f097678ddd3609ccb104a22c0bae469jyao  @param  CommBuffer      A pointer to a collection of data in memory that will
68346ece1ff4f097678ddd3609ccb104a22c0bae469jyao                          be conveyed from a non-SMM environment into an SMM environment.
68446ece1ff4f097678ddd3609ccb104a22c0bae469jyao  @param  CommBufferSize  The size of the CommBuffer.
68546ece1ff4f097678ddd3609ccb104a22c0bae469jyao
68646ece1ff4f097678ddd3609ccb104a22c0bae469jyao  @return Status Code
68746ece1ff4f097678ddd3609ccb104a22c0bae469jyao
68846ece1ff4f097678ddd3609ccb104a22c0bae469jyao**/
68946ece1ff4f097678ddd3609ccb104a22c0bae469jyaoEFI_STATUS
69046ece1ff4f097678ddd3609ccb104a22c0bae469jyaoEFIAPI
69146ece1ff4f097678ddd3609ccb104a22c0bae469jyaoSmmEndOfDxeHandler (
69246ece1ff4f097678ddd3609ccb104a22c0bae469jyao  IN     EFI_HANDLE               DispatchHandle,
69346ece1ff4f097678ddd3609ccb104a22c0bae469jyao  IN     CONST VOID               *Context,        OPTIONAL
69446ece1ff4f097678ddd3609ccb104a22c0bae469jyao  IN OUT VOID                     *CommBuffer,     OPTIONAL
69546ece1ff4f097678ddd3609ccb104a22c0bae469jyao  IN OUT UINTN                    *CommBufferSize  OPTIONAL
69646ece1ff4f097678ddd3609ccb104a22c0bae469jyao  );
69746ece1ff4f097678ddd3609ccb104a22c0bae469jyao
69846ece1ff4f097678ddd3609ccb104a22c0bae469jyao/**
69953ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng  This function is the main entry point for an SMM handler dispatch
70053ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng  or communicate-based callback.
70153ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng
70253ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng  @param  DispatchHandle  The unique handle assigned to this handler by SmiHandlerRegister().
70353ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng  @param  Context         Points to an optional handler context which was specified when the handler was registered.
70453ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng  @param  CommBuffer      A pointer to a collection of data in memory that will
70553ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng                          be conveyed from a non-SMM environment into an SMM environment.
70653ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng  @param  CommBufferSize  The size of the CommBuffer.
70753ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng
70853ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng  @return Status Code
70953ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng
71053ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng**/
71153ec4d7f98a6af8b00c891c3f13791967e52b6a3Star ZengEFI_STATUS
71253ec4d7f98a6af8b00c891c3f13791967e52b6a3Star ZengEFIAPI
71353ec4d7f98a6af8b00c891c3f13791967e52b6a3Star ZengSmmExitBootServicesHandler (
71453ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng  IN     EFI_HANDLE               DispatchHandle,
71553ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng  IN     CONST VOID               *Context,        OPTIONAL
71653ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng  IN OUT VOID                     *CommBuffer,     OPTIONAL
71753ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng  IN OUT UINTN                    *CommBufferSize  OPTIONAL
71853ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng  );
71953ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng
72053ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng/**
72153ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng  This function is the main entry point for an SMM handler dispatch
72253ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng  or communicate-based callback.
72353ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng
72453ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng  @param  DispatchHandle  The unique handle assigned to this handler by SmiHandlerRegister().
72553ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng  @param  Context         Points to an optional handler context which was specified when the handler was registered.
72653ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng  @param  CommBuffer      A pointer to a collection of data in memory that will
72753ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng                          be conveyed from a non-SMM environment into an SMM environment.
72853ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng  @param  CommBufferSize  The size of the CommBuffer.
72953ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng
73053ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng  @return Status Code
73153ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng
73253ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng**/
73353ec4d7f98a6af8b00c891c3f13791967e52b6a3Star ZengEFI_STATUS
73453ec4d7f98a6af8b00c891c3f13791967e52b6a3Star ZengEFIAPI
73553ec4d7f98a6af8b00c891c3f13791967e52b6a3Star ZengSmmReadyToBootHandler (
73653ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng  IN     EFI_HANDLE               DispatchHandle,
73753ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng  IN     CONST VOID               *Context,        OPTIONAL
73853ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng  IN OUT VOID                     *CommBuffer,     OPTIONAL
73953ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng  IN OUT UINTN                    *CommBufferSize  OPTIONAL
74053ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng  );
74153ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng
74253ec4d7f98a6af8b00c891c3f13791967e52b6a3Star Zeng/**
743e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Place holder function until all the SMM System Table Service are available.
744e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
745e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Arg1                   Undefined
746e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Arg2                   Undefined
747e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Arg3                   Undefined
748e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Arg4                   Undefined
749e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Arg5                   Undefined
750e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
751e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @return EFI_NOT_AVAILABLE_YET
752e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
753e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
754e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFI_STATUS
755e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyEFIAPI
756e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmmEfiNotAvailableYetArg5 (
757e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  UINTN Arg1,
758e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  UINTN Arg2,
759e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  UINTN Arg3,
760e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  UINTN Arg4,
761e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  UINTN Arg5
762e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
763e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
764e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney//
765e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney//Functions used during debug buils
766e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney//
767e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
768e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
769e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Traverse the discovered list for any drivers that were discovered but not loaded
770e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  because the dependency experessions evaluated to false.
771e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
772e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
773e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyVOID
774e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmmDisplayDiscoveredNotDispatched (
775e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  VOID
776e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
777e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
778e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
779e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Add free SMRAM region for use by memory service.
780e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
781e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  MemBase                Base address of memory region.
782e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  MemLength              Length of the memory region.
783e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Type                   Memory type.
784e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Attributes             Memory region state.
785e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
786e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
787e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyVOID
788e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmmAddMemoryRegion (
789e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN      EFI_PHYSICAL_ADDRESS      MemBase,
790e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN      UINT64                    MemLength,
791e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN      EFI_MEMORY_TYPE           Type,
792e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN      UINT64                    Attributes
793e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
794e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
795e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
796e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Finds the protocol entry for the requested protocol.
797e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
798e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Protocol               The ID of the protocol
799e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Create                 Create a new entry if not found
800e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
801e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @return Protocol entry
802e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
803e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
804e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyPROTOCOL_ENTRY  *
805e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmmFindProtocolEntry (
806e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN EFI_GUID   *Protocol,
807e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN BOOLEAN    Create
808e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
809e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
810e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
811e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Signal event for every protocol in protocol entry.
812e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
813e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Prot                   Protocol interface
814e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
815e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
816e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyVOID
817e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmmNotifyProtocol (
818e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN PROTOCOL_INTERFACE   *Prot
819e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
820e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
821e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
822e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Finds the protocol instance for the requested handle and protocol.
823e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Note: This function doesn't do parameters checking, it's caller's responsibility
824e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  to pass in valid parameters.
825e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
826e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Handle                 The handle to search the protocol on
827e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Protocol               GUID of the protocol
828e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Interface              The interface for the protocol being searched
829e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
830e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @return Protocol instance (NULL: Not found)
831e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
832e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
833e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyPROTOCOL_INTERFACE *
834e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmmFindProtocolInterface (
835e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN IHANDLE        *Handle,
836e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN EFI_GUID       *Protocol,
837e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN VOID           *Interface
838e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
839e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
840e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
841e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  Removes Protocol from the protocol list (but not the handle list).
842e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
843e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Handle                 The handle to remove protocol on.
844e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Protocol               GUID of the protocol to be moved
845e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  Interface              The interface of the protocol
846e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
847e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @return Protocol Entry
848e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
849e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
850e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyPROTOCOL_INTERFACE *
851e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmmRemoveInterfaceFromProtocol (
852e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN IHANDLE        *Handle,
853e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN EFI_GUID       *Protocol,
854e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN VOID           *Interface
855e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
856e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
857e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney/**
858e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  This is the POSTFIX version of the dependency evaluator.  This code does
859e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  not need to handle Before or After, as it is not valid to call this
860fa542a1e770ac651b7a2f9e6650210465c824f7cmdkinney  routine in this case. POSTFIX means all the math is done on top of the stack.
861e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
862e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @param  DriverEntry           DriverEntry element to update.
863e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
864e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval TRUE                  If driver is ready to run.
865e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  @retval FALSE                 If driver is not ready to run or some fatal error
866e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney                                was found.
867e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
868e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney**/
869e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneyBOOLEAN
870e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinneySmmIsSchedulable (
871e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  IN  EFI_SMM_DRIVER_ENTRY   *DriverEntry
872e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney  );
873e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney
87484edd20bd0756ef5719835498d4283435d6b5e77Star Zeng//
87584edd20bd0756ef5719835498d4283435d6b5e77Star Zeng// SmramProfile
87684edd20bd0756ef5719835498d4283435d6b5e77Star Zeng//
87784edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
87884edd20bd0756ef5719835498d4283435d6b5e77Star Zeng/**
87984edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  Initialize SMRAM profile.
88084edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
88184edd20bd0756ef5719835498d4283435d6b5e77Star Zeng**/
88284edd20bd0756ef5719835498d4283435d6b5e77Star ZengVOID
88384edd20bd0756ef5719835498d4283435d6b5e77Star ZengSmramProfileInit (
88484edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  VOID
88584edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  );
88684edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
88784edd20bd0756ef5719835498d4283435d6b5e77Star Zeng/**
88884edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  Register SMM image to SMRAM profile.
88984edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
89084edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @param DriverEntry    SMM image info.
89184edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @param RegisterToDxe  Register image to DXE.
89284edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
89384edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @retval TRUE          Register success.
89484edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @retval FALSE         Register fail.
89584edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
89684edd20bd0756ef5719835498d4283435d6b5e77Star Zeng**/
89784edd20bd0756ef5719835498d4283435d6b5e77Star ZengBOOLEAN
89884edd20bd0756ef5719835498d4283435d6b5e77Star ZengRegisterSmramProfileImage (
89984edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  IN EFI_SMM_DRIVER_ENTRY   *DriverEntry,
90084edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  IN BOOLEAN                RegisterToDxe
90184edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  );
90284edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
90384edd20bd0756ef5719835498d4283435d6b5e77Star Zeng/**
90484edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  Unregister image from SMRAM profile.
90584edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
90684edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @param DriverEntry        SMM image info.
90784edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @param UnregisterToDxe    Unregister image from DXE.
90884edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
90984edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @retval TRUE              Unregister success.
91084edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @retval FALSE             Unregister fail.
91184edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
91284edd20bd0756ef5719835498d4283435d6b5e77Star Zeng**/
91384edd20bd0756ef5719835498d4283435d6b5e77Star ZengBOOLEAN
91484edd20bd0756ef5719835498d4283435d6b5e77Star ZengUnregisterSmramProfileImage (
91584edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  IN EFI_SMM_DRIVER_ENTRY   *DriverEntry,
91684edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  IN BOOLEAN                UnregisterToDxe
91784edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  );
91884edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
91984edd20bd0756ef5719835498d4283435d6b5e77Star Zeng/**
92084edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  Update SMRAM profile information.
92184edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
92284edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @param CallerAddress  Address of caller who call Allocate or Free.
92384edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @param Action         This Allocate or Free action.
92484edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @param MemoryType     Memory type.
92584edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @param Size           Buffer size.
92684edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @param Buffer         Buffer address.
92784edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
92884edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @retval TRUE          Profile udpate success.
92984edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  @retval FALSE         Profile update fail.
93084edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
93184edd20bd0756ef5719835498d4283435d6b5e77Star Zeng**/
93284edd20bd0756ef5719835498d4283435d6b5e77Star ZengBOOLEAN
93384edd20bd0756ef5719835498d4283435d6b5e77Star ZengSmmCoreUpdateProfile (
93484edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  IN EFI_PHYSICAL_ADDRESS CallerAddress,
93584edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  IN MEMORY_PROFILE_ACTION Action,
93684edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  IN EFI_MEMORY_TYPE      MemoryType, // Valid for AllocatePages/AllocatePool
93784edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  IN UINTN                Size,       // Valid for AllocatePages/FreePages/AllocatePool
93884edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  IN VOID                 *Buffer
93984edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  );
94084edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
94184edd20bd0756ef5719835498d4283435d6b5e77Star Zeng/**
94284edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  Register SMRAM profile handler.
94384edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
94484edd20bd0756ef5719835498d4283435d6b5e77Star Zeng**/
94584edd20bd0756ef5719835498d4283435d6b5e77Star ZengVOID
94684edd20bd0756ef5719835498d4283435d6b5e77Star ZengRegisterSmramProfileHandler (
94784edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  VOID
94884edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  );
94984edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
95084edd20bd0756ef5719835498d4283435d6b5e77Star Zeng/**
95184edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  SMRAM profile ready to lock callback function.
95284edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
95384edd20bd0756ef5719835498d4283435d6b5e77Star Zeng**/
95484edd20bd0756ef5719835498d4283435d6b5e77Star ZengVOID
95584edd20bd0756ef5719835498d4283435d6b5e77Star ZengSmramProfileReadyToLock (
95684edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  VOID
95784edd20bd0756ef5719835498d4283435d6b5e77Star Zeng  );
95884edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
95984edd20bd0756ef5719835498d4283435d6b5e77Star Zengextern UINTN                    mFullSmramRangeCount;
96084edd20bd0756ef5719835498d4283435d6b5e77Star Zengextern EFI_SMRAM_DESCRIPTOR     *mFullSmramRanges;
96184edd20bd0756ef5719835498d4283435d6b5e77Star Zeng
9620b256fb1dd7ca267d6e448768e519f54f97f347aYao, Jiewenextern EFI_LOADED_IMAGE_PROTOCOL  *mSmmCoreLoadedImage;
9630b256fb1dd7ca267d6e448768e519f54f97f347aYao, Jiewen
96463aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng//
96563aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng// Page management
96663aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng//
96763aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng
96863aa86b0706929df73dca614f87e5b99bb58c48bStar Zengtypedef struct {
96963aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng  LIST_ENTRY  Link;
97063aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng  UINTN       NumberOfPages;
97163aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng} FREE_PAGE_LIST;
97263aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng
97363aa86b0706929df73dca614f87e5b99bb58c48bStar Zengextern LIST_ENTRY  mSmmMemoryMap;
97463aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng
97563aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng//
97663aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng// Pool management
97763aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng//
97863aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng
97963aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng//
98063aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng// MIN_POOL_SHIFT must not be less than 5
98163aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng//
98263aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng#define MIN_POOL_SHIFT  6
98363aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng#define MIN_POOL_SIZE   (1 << MIN_POOL_SHIFT)
98463aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng
98563aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng//
98663aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng// MAX_POOL_SHIFT must not be less than EFI_PAGE_SHIFT - 1
98763aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng//
98863aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng#define MAX_POOL_SHIFT  (EFI_PAGE_SHIFT - 1)
98963aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng#define MAX_POOL_SIZE   (1 << MAX_POOL_SHIFT)
99063aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng
99163aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng//
99263aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng// MAX_POOL_INDEX are calculated by maximum and minimum pool sizes
99363aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng//
99463aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng#define MAX_POOL_INDEX  (MAX_POOL_SHIFT - MIN_POOL_SHIFT + 1)
99563aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng
99663aa86b0706929df73dca614f87e5b99bb58c48bStar Zengtypedef struct {
99763aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng  UINTN        Size;
99863aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng  BOOLEAN      Available;
99963aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng} POOL_HEADER;
100063aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng
100163aa86b0706929df73dca614f87e5b99bb58c48bStar Zengtypedef struct {
100263aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng  POOL_HEADER  Header;
100363aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng  LIST_ENTRY   Link;
100463aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng} FREE_POOL_HEADER;
100563aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng
100663aa86b0706929df73dca614f87e5b99bb58c48bStar Zengextern LIST_ENTRY  mSmmPoolLists[MAX_POOL_INDEX];
100763aa86b0706929df73dca614f87e5b99bb58c48bStar Zeng
1008e42e94041f7c71a5e2e57154bd568f3c14fd6eecmdkinney#endif
1009