]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Foundation/Framework/Protocol/SmmBase/SmmBase.h
Update the copyright notice format
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Framework / Protocol / SmmBase / SmmBase.h
CommitLineData
3eb9473e 1/*++\r
2\r
f57387d5
HT
3Copyright (c) 1999 - 2006, Intel Corporation. All rights reserved.<BR>\r
4This program and the accompanying materials\r
3eb9473e 5are licensed and made available under the terms and conditions of the BSD License\r
6which accompanies this distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12\r
13Module Name:\r
14\r
15 SmmBase.h\r
16\r
17Abstract:\r
18\r
19 This file defines SMM Base abstraction protocol defined by the SMM Architecture\r
20 Specification. This is the base level of compatiblity for SMM drivers.\r
21\r
22--*/\r
23\r
24#ifndef _SMM_BASE_H_\r
25#define _SMM_BASE_H_\r
26\r
27#include EFI_PROTOCOL_DEFINITION (DevicePath)\r
28\r
29#define EFI_SMM_BASE_PROTOCOL_GUID \\r
30 { \\r
7ccf38a3 31 0x1390954D, 0xda95, 0x4227, {0x93, 0x28, 0x72, 0x82, 0xc2, 0x17, 0xda, 0xa8} \\r
3eb9473e 32 }\r
33\r
34#define EFI_SMM_CPU_IO_GUID \\r
35 { \\r
7ccf38a3 36 0x5f439a0b, 0x45d8, 0x4682, {0xa4, 0xf4, 0xf0, 0x57, 0x6b, 0x51, 0x34, 0x41} \\r
3eb9473e 37 }\r
38\r
39#define SMM_COMMUNICATE_HEADER_GUID \\r
40 { \\r
7ccf38a3 41 0xF328E36C, 0x23B6, 0x4a95, {0x85, 0x4B, 0x32, 0xE1, 0x95, 0x34, 0xCD, 0x75} \\r
3eb9473e 42 }\r
43\r
44//\r
45// SMM Base specification constant and types\r
46//\r
47#define SMM_SMST_SIGNATURE EFI_SIGNATURE_32 ('S', 'M', 'S', 'T')\r
48#define EFI_SMM_SYSTEM_TABLE_REVISION (0 << 16) | (0x09)\r
49\r
50EFI_FORWARD_DECLARATION (EFI_SMM_BASE_PROTOCOL);\r
51EFI_FORWARD_DECLARATION (EFI_SMM_CPU_IO_INTERFACE);\r
52EFI_FORWARD_DECLARATION (EFI_SMM_CPU_SAVE_STATE);\r
53EFI_FORWARD_DECLARATION (EFI_SMM_OPTIONAL_FP_SAVE_STATE);\r
54EFI_FORWARD_DECLARATION (EFI_SMM_SYSTEM_TABLE);\r
55\r
56//\r
57// *******************************************************\r
58// EFI_SMM_IO_WIDTH\r
59// *******************************************************\r
60//\r
61typedef enum {\r
62 SMM_IO_UINT8 = 0,\r
63 SMM_IO_UINT16 = 1,\r
64 SMM_IO_UINT32 = 2,\r
65 SMM_IO_UINT64 = 3\r
66} EFI_SMM_IO_WIDTH;\r
67\r
68//\r
69// *******************************************************\r
70// EFI_SMM_IO_ACCESS\r
71// *******************************************************\r
72//\r
73typedef\r
74EFI_STATUS\r
75(EFIAPI *EFI_SMM_CPU_IO) (\r
76 IN EFI_SMM_CPU_IO_INTERFACE * This,\r
77 IN EFI_SMM_IO_WIDTH Width,\r
78 IN UINT64 Address,\r
79 IN UINTN Count,\r
80 IN OUT VOID *Buffer\r
81 );\r
82\r
83typedef struct {\r
84 EFI_SMM_CPU_IO Read;\r
85 EFI_SMM_CPU_IO Write;\r
86} EFI_SMM_IO_ACCESS;\r
87\r
5d46191d 88struct _EFI_SMM_CPU_IO_INTERFACE {\r
3eb9473e 89 EFI_SMM_IO_ACCESS Mem;\r
90 EFI_SMM_IO_ACCESS Io;\r
5d46191d 91};\r
3eb9473e 92\r
93typedef\r
94EFI_STATUS\r
95(EFIAPI *EFI_SMMCORE_ALLOCATE_POOL) (\r
96 IN EFI_MEMORY_TYPE PoolType,\r
97 IN UINTN Size,\r
98 OUT VOID **Buffer\r
99 );\r
100\r
101typedef\r
102EFI_STATUS\r
103(EFIAPI *EFI_SMMCORE_FREE_POOL) (\r
104 IN VOID *Buffer\r
105 );\r
106\r
107typedef\r
108EFI_STATUS\r
109(EFIAPI *EFI_SMMCORE_ALLOCATE_PAGES) (\r
110 IN EFI_ALLOCATE_TYPE Type,\r
111 IN EFI_MEMORY_TYPE MemoryType,\r
112 IN UINTN NumberOfPages,\r
113 OUT EFI_PHYSICAL_ADDRESS * Memory\r
114 );\r
115\r
116typedef\r
117EFI_STATUS\r
118(EFIAPI *EFI_SMMCORE_FREE_PAGES) (\r
119 IN EFI_PHYSICAL_ADDRESS Memory,\r
120 IN UINTN NumberOfPages\r
121 );\r
122\r
123typedef\r
124VOID\r
125(EFIAPI *EFI_AP_PROCEDURE) (\r
126 IN VOID *Buffer\r
127 );\r
128\r
129typedef\r
130EFI_STATUS\r
131(EFIAPI *EFI_SMM_STARTUP_THIS_AP) (\r
132 IN EFI_AP_PROCEDURE Procedure,\r
133 IN UINTN CpuNumber,\r
134 IN OUT VOID *ProcArguments OPTIONAL\r
135 );\r
136\r
5d46191d 137struct _EFI_SMM_CPU_SAVE_STATE {\r
3eb9473e 138 UINT8 Reserved1[248];\r
139 UINT32 SMBASE;\r
140 UINT32 SMMRevId;\r
141 UINT16 IORestart;\r
142 UINT16 AutoHALTRestart;\r
143 UINT8 Reserved2[164];\r
144 UINT32 ES;\r
145 UINT32 CS;\r
146 UINT32 SS;\r
147 UINT32 DS;\r
148 UINT32 FS;\r
149 UINT32 GS;\r
150 UINT32 LDTBase;\r
151 UINT32 TR;\r
152 UINT32 DR7;\r
153 UINT32 DR6;\r
154 UINT32 EAX;\r
155 UINT32 ECX;\r
156 UINT32 EDX;\r
157 UINT32 EBX;\r
158 UINT32 ESP;\r
159 UINT32 EBP;\r
160 UINT32 ESI;\r
161 UINT32 EDI;\r
162 UINT32 EIP;\r
163 UINT32 EFLAGS;\r
164 UINT32 CR3;\r
165 UINT32 CR0;\r
5d46191d 166};\r
3eb9473e 167\r
168typedef struct {\r
169 UINT8 Reserved19[760]; // FC00\r
170 UINT32 SMBASE; // FEF8\r
171 UINT32 REVID; // FEFC\r
172 UINT16 HALT_RESTART; // FF00\r
173 UINT16 IO_RESTART; // FF02\r
174 UINT32 Reserved17[22]; // FF58, 54, 50, 4c, 48, 44, 40, 3c, 38, 34, 30, 2c, 28, 24, 20, 1c, 18, 14, 10, 0c, 08, 04\r
175 UINT32 EAX; // FF5C\r
176 UINT32 Reserved16; // FF60\r
177 UINT32 ECX; // FF64\r
178 UINT32 Reserved15; // FF68\r
179 UINT32 EDX; // FF6C\r
180 UINT32 Reserved14; // FF70\r
181 UINT32 EBX; // FF74\r
182 UINT32 Reserved13; // FF78\r
183 UINT32 ESP; // FF7C\r
184 UINT32 Reserved12; // FF80\r
185 UINT32 EBP; // FF84\r
186 UINT32 Reserved11; // FF88\r
187 UINT32 ESI; // FF8C\r
188 UINT32 Reserved9; // FF90\r
189 UINT32 EDI; // FF94\r
190 UINT32 Reserved8; // FF98\r
191 UINT32 IO_MEM_ADDR; // FF9C\r
192 UINT32 Reserved7; // FFA0\r
193 UINT32 IO_MISC; // FFA4\r
194 UINT32 ES_SEL; // FFA8\r
195 UINT32 CS_SEL; // FFAC\r
196 UINT32 SS_SEL; // FFB0\r
197 UINT32 DS_SEL; // FFB4\r
198 UINT32 FS_SEL; // FFB8\r
199 UINT32 GS_SEL; // FFBC\r
200 UINT32 LDTR_SEL; // FFC0\r
201 UINT32 TR_SEL; // FFC4\r
202 UINT32 DR7; // FFC8\r
203 UINT32 Reserved6; // FFCC\r
204 UINT32 DR6; // FFD0\r
205 UINT32 Reserved5; // FFD4\r
206 UINT32 EIP; // FFD8\r
207 UINT32 Reserved4; // FFDC\r
208 UINT32 EFER; // FFE0\r
209 UINT32 Reserved3; // FFE4\r
210 UINT32 EFLAGS; // FFE8\r
211 UINT32 Reserved2; // FFEC\r
212 UINT32 CR3; // FFF0\r
213 UINT32 Reserved1; // FFF4\r
214 UINT32 CR0; // FFF8\r
215 UINT32 Reserved0; // FFFC\r
216} EFI_SMM_CPU_CT_SAVE_STATE;\r
217\r
218typedef struct {\r
219 UINT8 Reserved26[464]; // FC00 - FDCF\r
220 UINT32 GdtrUpperBase; // FDD0\r
221 UINT32 LdtrUpperBase; // FDD4\r
222 UINT32 IdtrUpperBase; // FDD8\r
223 UINT32 Reserved25; // FDDC - FDDF\r
224 UINT64 IoRdi; // FDE0\r
225 UINT64 IoRip; // FDE8\r
226 UINT64 IoRcx; // FDF0\r
227 UINT64 IoRsi; // FDF8\r
228 UINT8 Reserved24[64]; // FE00 - FE3F\r
229 UINT64 Cr4; // FE40\r
230 UINT8 Reserved23[68]; // FE48 - FE8B\r
231 UINT32 GdtrBase; // FE8C\r
232 UINT32 Reserved22; // FE90\r
233 UINT32 IdtrBase; // FE94\r
234 UINT32 Reserved21; // FE98\r
235 UINT32 LdtrBase; // FE9C\r
236 UINT32 Reserved20; // FEA0\r
237 UINT8 Reserved19[84]; // FEA4 - FEF7\r
238 UINT32 Smbase; // FEF8\r
239 UINT32 RevId; // FEFC\r
240 UINT16 IoRestart; // FF00\r
241 UINT16 HaltRestart; // FF02\r
242 UINT8 Reserved18[24]; // FF04 - FF1B\r
243 UINT32 R15; // FF1C\r
244 UINT32 Reserved17; // FE20\r
245 UINT32 R14; // FF24\r
246 UINT32 Reserved16; // FE28\r
247 UINT32 R13; // FF2C\r
248 UINT32 Reserved15; // FE30\r
249 UINT32 R12; // FF34\r
250 UINT32 Reserved14; // FE38\r
251 UINT32 R11; // FF3C\r
252 UINT32 Reserved13; // FE40\r
253 UINT32 R10; // FF44\r
254 UINT32 Reserved12; // FE48\r
255 UINT32 R9; // FF4C\r
256 UINT32 Reserved11; // FE50\r
257 UINT32 R8; // FF54\r
258 UINT32 Reserved10; // FE58\r
259 UINT32 Rax; // FF5C\r
260 UINT32 Reserved9; // FE60\r
261 UINT32 Rcx; // FF64\r
262 UINT32 Reserved8; // FE68\r
263 UINT32 Rdx; // FF6C\r
264 UINT32 Reserved7; // FE70\r
265 UINT32 Rbx; // FF74\r
266 UINT32 Reserved6; // FE78\r
267 UINT32 Rsp; // FF7C\r
268 UINT32 Reserved5; // FE80\r
269 UINT32 Rbp; // FF84\r
270 UINT32 Reserved4; // FE88\r
271 UINT32 Rsi; // FF8C\r
272 UINT32 Reserved3; // FE90\r
273 UINT32 Rdi; // FF94\r
274 UINT32 Reserved2; // FE98\r
275 UINT32 IoMemAddr; // FF9C\r
276 UINT32 Reserved1; // FEA0\r
277 UINT32 IoMiscInfo; // FFA4\r
278 UINT32 EsSel; // FFA8\r
279 UINT32 CsSel; // FFAC\r
280 UINT32 SsSel; // FFB0\r
281 UINT32 DsSel; // FFB4\r
282 UINT32 FsSel; // FFB8\r
283 UINT32 GsSel; // FFBC\r
284 UINT32 LdtrSel; // FFC0\r
285 UINT32 TrSel; // FFC4\r
286 UINT64 Dr7; // FFC8\r
287 UINT64 Dr6; // FFD0\r
288 UINT32 Rip; // FFD8\r
289 UINT32 Reserved0; // FFDC\r
290 UINT64 Efr; // FFE0\r
291 UINT64 RFlags; // FFE8\r
292 UINT64 Cr3; // FFF0\r
293 UINT64 Cr0; // FFF8\r
294} EFI_SMM_CPU_MEROM_SAVE_STATE;\r
295\r
296\r
297typedef struct {\r
298 UINT8 Reserved14[0x228]; // FC00-FE28\r
299 UINT32 IO_EIP; // FE28\r
300 UINT8 Reserved13[0x14]; // FE2C-FE40\r
301 UINT32 CR4; // FE40\r
302 UINT8 Reserved12[0x48]; // FE44-FE8C\r
303 UINT32 GDT_BASE; // FE8C\r
304 UINT8 Reserved11[0xC]; // FE90-FE9C\r
305 UINT32 LDT_BASE; // FE9C\r
306 UINT8 Reserved10[0x58]; // FEA0-FEF8\r
307 UINT32 SMBASE;\r
308 UINT32 REVID;\r
309 UINT16 IO_RESTART;\r
310 UINT16 HALT_RESTART;\r
311 UINT8 Reserved9[0xA4];\r
312\r
313 UINT16 ES;\r
314 UINT16 Reserved8;\r
315 UINT16 CS;\r
316 UINT16 Reserved7;\r
317 UINT16 SS;\r
318 UINT16 Reserved6;\r
319 UINT16 DS;\r
320 UINT16 Reserved5;\r
321 UINT16 FS;\r
322 UINT16 Reserved4;\r
323 UINT16 GS;\r
324 UINT16 Reserved3;\r
325 UINT32 Reserved2;\r
326 UINT16 TR;\r
327 UINT16 Reserved1;\r
328 UINT32 DR7;\r
329 UINT32 DR6;\r
330 UINT32 EAX;\r
331 UINT32 ECX;\r
332 UINT32 EDX;\r
333 UINT32 EBX;\r
334 UINT32 ESP;\r
335 UINT32 EBP;\r
336 UINT32 ESI;\r
337 UINT32 EDI;\r
338 UINT32 EIP;\r
339 UINT32 EFLAGS;\r
340 UINT32 CR3;\r
341 UINT32 CR0;\r
342} EFI_SMM_CPU_CT_NOT_ENABLED_SAVE_STATE;\r
343\r
5d46191d 344struct _EFI_SMM_OPTIONAL_FP_SAVE_STATE {\r
3eb9473e 345 UINT16 Fcw;\r
346 UINT16 Fsw;\r
347 UINT16 Ftw;\r
348 UINT16 Opcode;\r
349 UINT32 Eip;\r
350 UINT16 Cs;\r
351 UINT16 Rsvd1;\r
352 UINT32 DataOffset;\r
353 UINT16 Ds;\r
354 UINT8 Rsvd2[10];\r
355 UINT8 St0Mm0[10], Rsvd3[6];\r
356 UINT8 St0Mm1[10], Rsvd4[6];\r
357 UINT8 St0Mm2[10], Rsvd5[6];\r
358 UINT8 St0Mm3[10], Rsvd6[6];\r
359 UINT8 St0Mm4[10], Rsvd7[6];\r
360 UINT8 St0Mm5[10], Rsvd8[6];\r
361 UINT8 St0Mm6[10], Rsvd9[6];\r
362 UINT8 St0Mm7[10], Rsvd10[6];\r
363 UINT8 Rsvd11[22 * 16];\r
5d46191d 364};\r
3eb9473e 365\r
366typedef struct _EFI_SMM_OPTIONAL_FP_SAVE_STATE32 {\r
367 UINT16 Fcw;\r
368 UINT16 Fsw;\r
369 UINT16 Ftw;\r
370 UINT16 Opcode;\r
371 UINT32 Eip;\r
372 UINT16 Cs;\r
373 UINT16 Rsvd1;\r
374 UINT32 DataOffset;\r
375 UINT16 Ds;\r
376 UINT8 Reserved2[10];\r
377 UINT8 St0Mm0[10], Rsvd3[6];\r
378 UINT8 St1Mm1[10], Rsvd4[6];\r
379 UINT8 St2Mm2[10], Rsvd5[6];\r
380 UINT8 St3Mm3[10], Rsvd6[6];\r
381 UINT8 St4Mm4[10], Rsvd7[6];\r
382 UINT8 St5Mm5[10], Rsvd8[6];\r
383 UINT8 St6Mm6[10], Rsvd9[6];\r
384 UINT8 St7Mm7[10], Rsvd10[6];\r
385 UINT8 Xmm0[16];\r
386 UINT8 Xmm1[16];\r
387 UINT8 Xmm2[16];\r
388 UINT8 Xmm3[16];\r
389 UINT8 Xmm4[16];\r
390 UINT8 Xmm5[16];\r
391 UINT8 Xmm6[16];\r
392 UINT8 Xmm7[16];\r
393 UINT8 Rsvd11[14 * 16];\r
394} EFI_SMM_OPTIONAL_FP_SAVE_STATE32;\r
395\r
396typedef struct _EFI_SMM_OPTIONAL_FP_SAVE_STATE64 {\r
397 UINT16 Fcw;\r
398 UINT16 Fsw;\r
399 UINT16 Ftw;\r
400 UINT16 Opcode;\r
401 UINT64 Rip;\r
402 UINT64 DataOffset;\r
403 UINT8 Rsvd1[8];\r
404 UINT8 St0Mm0[10], Rsvd2[6];\r
405 UINT8 St1Mm1[10], Rsvd3[6];\r
406 UINT8 St2Mm2[10], Rsvd4[6];\r
407 UINT8 St3Mm3[10], Rsvd5[6];\r
408 UINT8 St4Mm4[10], Rsvd6[6];\r
409 UINT8 St5Mm5[10], Rsvd7[6];\r
410 UINT8 St6Mm6[10], Rsvd8[6];\r
411 UINT8 St7Mm7[10], Rsvd9[6];\r
412 UINT8 Xmm0[16];\r
413 UINT8 Xmm1[16];\r
414 UINT8 Xmm2[16];\r
415 UINT8 Xmm3[16];\r
416 UINT8 Xmm4[16];\r
417 UINT8 Xmm5[16];\r
418 UINT8 Xmm6[16];\r
419 UINT8 Xmm7[16];\r
420 UINT8 Xmm8[16];\r
421 UINT8 Xmm9[16];\r
422 UINT8 Xmm10[16];\r
423 UINT8 Xmm11[16];\r
424 UINT8 Xmm12[16];\r
425 UINT8 Xmm13[16];\r
426 UINT8 Xmm14[16];\r
427 UINT8 Xmm15[16];\r
428 UINT8 Rsvd10[6 * 16];\r
429} EFI_SMM_OPTIONAL_FP_SAVE_STATE64;\r
430\r
431struct _EFI_SMM_SYSTEM_TABLE;\r
432\r
433typedef\r
434EFI_STATUS\r
435(EFIAPI *EFI_SMM_INSTALL_CONFIGURATION_TABLE) (\r
436 IN EFI_SMM_SYSTEM_TABLE * SystemTable,\r
437 IN EFI_GUID * Guid,\r
438 IN VOID *Table,\r
439 IN UINTN TableSize\r
440 )\r
441/*++\r
442\r
443 Routine Description:\r
444 The SmmInstallConfigurationTable() function is used to maintain the list \r
445 of configuration tables that are stored in the System Management System \r
446 Table. The list is stored as an array of (GUID, Pointer) pairs. The list \r
447 must be allocated from pool memory with PoolType set to EfiRuntimeServicesData.\r
448\r
449 Arguments:\r
450 SystemTable - A pointer to the SMM System Table.\r
451 Guid - A pointer to the GUID for the entry to add, update, or remove.\r
452 Table - A pointer to the buffer of the table to add. \r
453 TableSize - The size of the table to install.\r
454\r
455 Returns:\r
456 EFI_SUCCESS - The (Guid, Table) pair was added, updated, or removed.\r
457 EFI_INVALID_PARAMETER - Guid is not valid.\r
458 EFI_NOT_FOUND - An attempt was made to delete a non-existent entry.\r
459 EFI_OUT_OF_RESOURCES - There is not enough memory available to complete the operation. \r
460\r
461--*/\r
462;\r
463\r
464//\r
465// System Management System Table (SMST)\r
466//\r
5d46191d 467struct _EFI_SMM_SYSTEM_TABLE {\r
3eb9473e 468 EFI_TABLE_HEADER Hdr;\r
469\r
470 CHAR16 *SmmFirmwareVendor;\r
471 UINT32 SmmFirmwareRevision;\r
472\r
473 EFI_SMM_INSTALL_CONFIGURATION_TABLE SmmInstallConfigurationTable;\r
474\r
475 //\r
476 // I/O Services\r
477 //\r
478 EFI_GUID EfiSmmCpuIoGuid;\r
479 EFI_SMM_CPU_IO_INTERFACE SmmIo;\r
480\r
481 //\r
482 // Runtime memory service\r
483 //\r
484 EFI_SMMCORE_ALLOCATE_POOL SmmAllocatePool;\r
485 EFI_SMMCORE_FREE_POOL SmmFreePool;\r
486 EFI_SMMCORE_ALLOCATE_PAGES SmmAllocatePages;\r
487 EFI_SMMCORE_FREE_PAGES SmmFreePages;\r
488\r
489 //\r
490 // MP service\r
491 //\r
492 EFI_SMM_STARTUP_THIS_AP SmmStartupThisAp;\r
493\r
494 //\r
495 // CPU information records\r
496 //\r
497 UINTN CurrentlyExecutingCpu;\r
498 UINTN NumberOfCpus;\r
499 EFI_SMM_CPU_SAVE_STATE *CpuSaveState;\r
500 EFI_SMM_OPTIONAL_FP_SAVE_STATE *CpuOptionalFloatingPointState;\r
501\r
502 //\r
503 // Extensibility table\r
504 //\r
505 UINTN NumberOfTableEntries;\r
506 EFI_CONFIGURATION_TABLE *SmmConfigurationTable;\r
507\r
5d46191d 508};\r
3eb9473e 509\r
510//\r
511// SMM Handler Definition\r
512//\r
513#define EFI_HANDLER_SUCCESS 0x0000\r
514#define EFI_HANDLER_CRITICAL_EXIT 0x0001\r
515#define EFI_HANDLER_SOURCE_QUIESCED 0x0002\r
516#define EFI_HANDLER_SOURCE_PENDING 0x0003\r
517\r
518//\r
519// Structure of Communicate Buffer\r
520//\r
521typedef struct {\r
522 EFI_GUID HeaderGuid;\r
523 UINTN MessageLength;\r
524 UINT8 Data[1];\r
525} EFI_SMM_COMMUNICATE_HEADER;\r
526\r
527typedef\r
528EFI_STATUS\r
529(EFIAPI *EFI_SMM_HANDLER_ENTRY_POINT) (\r
530 IN EFI_HANDLE SmmImageHandle,\r
531 IN OUT VOID *CommunicationBuffer OPTIONAL,\r
532 IN OUT UINTN *SourceSize OPTIONAL\r
533 );\r
534\r
535typedef\r
536EFI_STATUS\r
537(EFIAPI *EFI_SMM_CALLBACK_ENTRY_POINT) (\r
538 IN EFI_HANDLE SmmImageHandle,\r
539 IN OUT VOID *CommunicationBuffer OPTIONAL,\r
540 IN OUT UINTN *SourceSize OPTIONAL\r
541 );\r
542\r
543typedef struct {\r
544 EFI_HANDLE SmmHandler;\r
545 EFI_DEVICE_PATH_PROTOCOL *HandlerDevicePath;\r
546} EFI_HANDLER_DESCRIPTOR;\r
547\r
548//\r
549// SMM Base Protocol Definition\r
550//\r
551typedef\r
552EFI_STATUS\r
553(EFIAPI *EFI_SMM_REGISTER_HANDLER) (\r
554 IN EFI_SMM_BASE_PROTOCOL * This,\r
555 IN EFI_DEVICE_PATH_PROTOCOL * FilePath,\r
556 IN VOID *SourceBuffer OPTIONAL,\r
557 IN UINTN SourceSize,\r
558 OUT EFI_HANDLE * ImageHandle,\r
559 IN BOOLEAN LegacyIA32Binary OPTIONAL\r
560 )\r
561/*++\r
562\r
563 Routine Description:\r
564 Register a given driver into SMRAM. This is the equivalent of performing\r
565 the LoadImage/StartImage into System Management Mode.\r
566\r
567 Arguments:\r
568 This - Protocol instance pointer.\r
569 SourceBuffer - Optional source buffer in case of the image file\r
570 being in memory.\r
571 SourceSize - Size of the source image file, if in memory.\r
572 ImageHandle - Pointer to the handle that reflects the driver \r
573 loaded into SMM.\r
574 LegacyIA32Binary - The binary image to load is legacy 16 bit code.\r
575\r
576 Returns:\r
577 EFI_SUCCESS - The operation was successful.\r
578 EFI_OUT_OF_RESOURCES - There were no additional SMRAM resources to load the handler\r
579 EFI_UNSUPPORTED - This platform does not support 16-bit handlers.\r
580 EFI_UNSUPPORTED - In runtime.\r
581 EFI_INVALID_PARAMETER - The handlers was not the correct image type\r
582\r
583--*/\r
584;\r
585\r
586typedef\r
587EFI_STATUS\r
588(EFIAPI *EFI_SMM_UNREGISTER_HANDLER) (\r
589 IN EFI_SMM_BASE_PROTOCOL * This,\r
590 IN EFI_HANDLE ImageHandle\r
591 )\r
592/*++\r
593\r
594 Routine Description:\r
595 Remove a given driver SMRAM. This is the equivalent of performing\r
596 the UnloadImage System Management Mode.\r
597\r
598 Arguments:\r
599 This - Protocol instance pointer.\r
600 ImageHandle - Pointer to the handle that reflects the driver \r
601 loaded into SMM.\r
602\r
603 Returns:\r
604 EFI_SUCCESS - The operation was successful\r
605 EFI_INVALID_PARAMETER - The handler did not exist\r
606 EFI_UNSUPPORTED - In runtime.\r
607\r
608--*/\r
609;\r
610\r
611typedef\r
612EFI_STATUS\r
613(EFIAPI *EFI_SMM_COMMUNICATE) (\r
614 IN EFI_SMM_BASE_PROTOCOL * This,\r
615 IN EFI_HANDLE ImageHandle,\r
616 IN OUT VOID *CommunicationBuffer,\r
617 IN OUT UINTN *SourceSize\r
618 )\r
619/*++\r
620\r
621 Routine Description:\r
622 The SMM Inter-module Communicate Service Communicate() function \r
623 provides a services to send/received messages from a registered \r
624 EFI service. The BASE protocol driver is responsible for doing \r
625 any of the copies such that the data lives in boot-service accessible RAM.\r
626\r
627 Arguments:\r
628 This - Protocol instance pointer.\r
629 ImageHandle - Pointer to the handle that reflects the driver \r
630 loaded into SMM.\r
631 CommunicationBuffer - Pointer to the buffer to convey into SMRAM.\r
632 SourceSize - Size of the contents of buffer..\r
633\r
634 Returns:\r
635 EFI_SUCCESS - The message was successfully posted\r
636 EFI_INVALID_PARAMETER - The buffer was NULL\r
637\r
638--*/\r
639;\r
640\r
641typedef\r
642EFI_STATUS\r
643(EFIAPI *EFI_SMM_CALLBACK_SERVICE) (\r
644 IN EFI_SMM_BASE_PROTOCOL * This,\r
645 IN EFI_HANDLE SmmImageHandle,\r
646 IN EFI_SMM_CALLBACK_ENTRY_POINT CallbackAddress,\r
647 IN BOOLEAN MakeLast OPTIONAL,\r
648 IN BOOLEAN FloatingPointSave OPTIONAL\r
649 )\r
650/*++\r
651\r
652 Routine Description:\r
653 Register a callback to execute within SMM. \r
654 This allows receipt of messages created with the Boot Service COMMUNICATE.\r
655\r
656 Arguments:\r
657 This - Protocol instance pointer.\r
658 CallbackAddress - Address of the callback service\r
659 MakeFirst - If present, will stipulate that the handler is posted \r
660 to be the first module executed in the dispatch table.\r
661 MakeLast - If present, will stipulate that the handler is posted \r
662 to be last executed in the dispatch table.\r
663 FloatingPointSave - This is an optional parameter which informs the \r
664 EFI_SMM_ACCESS_PROTOCOL Driver core if it needs to save \r
665 the floating point register state. If any of the handlers \r
666 require this, then the state will be saved for all of the handlers.\r
667\r
668 Returns:\r
669 EFI_SUCCESS - The operation was successful\r
670 EFI_OUT_OF_RESOURCES - Not enough space in the dispatch queue\r
671 EFI_UNSUPPORTED - In runtime.\r
672 EFI_UNSUPPORTED - Not in SMM.\r
673\r
674--*/\r
675;\r
676\r
677typedef\r
678EFI_STATUS\r
679(EFIAPI *EFI_SMM_ALLOCATE_POOL) (\r
680 IN EFI_SMM_BASE_PROTOCOL * This,\r
681 IN EFI_MEMORY_TYPE PoolType,\r
682 IN UINTN Size,\r
683 OUT VOID **Buffer\r
684 )\r
685/*++\r
686\r
687 Routine Description:\r
688 The SmmAllocatePool() function allocates a memory region of Size bytes from memory of \r
689 type PoolType and returns the address of the allocated memory in the location referenced \r
690 by Buffer. This function allocates pages from EFI SMRAM Memory as needed to grow the \r
691 requested pool type. All allocations are eight-byte aligned.\r
692\r
693 Arguments:\r
694 This - Protocol instance pointer.\r
695 PoolType - The type of pool to allocate. \r
696 The only supported type is EfiRuntimeServicesData; \r
697 the interface will internally map this runtime request to SMRAM.\r
698 Size - The number of bytes to allocate from the pool.\r
699 Buffer - A pointer to a pointer to the allocated buffer if the call \r
700 succeeds; undefined otherwise.\r
701\r
702 Returns:\r
703 EFI_SUCCESS - The requested number of bytes was allocated.\r
704 EFI_OUT_OF_RESOURCES - The pool requested could not be allocated.\r
705 EFI_INVALID_PARAMETER - PoolType was invalid.\r
706 EFI_UNSUPPORTED - In runtime.\r
707\r
708--*/\r
709;\r
710\r
711typedef\r
712EFI_STATUS\r
713(EFIAPI *EFI_SMM_FREE_POOL) (\r
714 IN EFI_SMM_BASE_PROTOCOL * This,\r
715 IN VOID *Buffer\r
716 )\r
717/*++\r
718\r
719 Routine Description:\r
720 The SmmFreePool() function returns the memory specified by Buffer to the system. \r
721 On return, the memory's type is EFI SMRAM Memory. The Buffer that is freed must \r
722 have been allocated by SmmAllocatePool().\r
723\r
724 Arguments:\r
725 This - Protocol instance pointer.\r
726 Buffer - Pointer to the buffer allocation.\r
727\r
728 Returns:\r
729 EFI_SUCCESS - The memory was returned to the system.\r
730 EFI_INVALID_PARAMETER - Buffer was invalid.\r
731 EFI_UNSUPPORTED - In runtime.\r
732\r
733--*/\r
734;\r
735\r
736typedef\r
737EFI_STATUS\r
738(EFIAPI *EFI_SMM_INSIDE_OUT) (\r
739 IN EFI_SMM_BASE_PROTOCOL * This,\r
740 OUT BOOLEAN *InSmm\r
741 )\r
742/*++\r
743\r
744 Routine Description:\r
745 This routine tells caller if execution context is SMM or not.\r
746\r
747 Arguments:\r
748 This - Protocol instance pointer.\r
749\r
750 Returns:\r
751 EFI_SUCCESS - The operation was successful\r
752\r
753--*/\r
754;\r
755\r
756typedef\r
757EFI_STATUS\r
758(EFIAPI *EFI_SMM_GET_SMST_LOCATION) (\r
759 IN EFI_SMM_BASE_PROTOCOL * This,\r
760 IN OUT EFI_SMM_SYSTEM_TABLE **Smst\r
761 )\r
762/*++\r
763\r
764 Routine Description:\r
765 The GetSmstLocation() function returns the locatin of the System Management \r
766 Service Table. The use of the API is such that a driver can discover the \r
767 location of the SMST in its entry point and then cache it in some driver \r
768 global variable so that the SMST can be invoked in subsequent callbacks.\r
769\r
770 Arguments:\r
771 This - Protocol instance pointer.\r
772 Smst - Pointer to the SMST.\r
773\r
774 Returns:\r
775 EFI_SUCCESS - The operation was successful\r
776 EFI_INVALID_PARAMETER - Smst was invalid. \r
777 EFI_UNSUPPORTED - Not in SMM.\r
778\r
779--*/\r
780;\r
781\r
5d46191d 782struct _EFI_SMM_BASE_PROTOCOL {\r
3eb9473e 783 EFI_SMM_REGISTER_HANDLER Register;\r
784 EFI_SMM_UNREGISTER_HANDLER UnRegister;\r
785 EFI_SMM_COMMUNICATE Communicate;\r
786 EFI_SMM_CALLBACK_SERVICE RegisterCallback;\r
787 EFI_SMM_INSIDE_OUT InSmm;\r
788 EFI_SMM_ALLOCATE_POOL SmmAllocatePool;\r
789 EFI_SMM_FREE_POOL SmmFreePool;\r
790 EFI_SMM_GET_SMST_LOCATION GetSmstLocation;\r
5d46191d 791};\r
3eb9473e 792\r
793extern EFI_GUID gEfiSmmBaseProtocolGuid;\r
794extern EFI_GUID gEfiSmmCpuIoGuid;\r
795extern EFI_GUID gEfiSmmCommunicateHeaderGuid;\r
796\r
797#endif\r