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