Home | History | Annotate | Download | only in Protocol
      1 /** @file
      2   This file declares the SMM CPU Save State protocol, which provides the processor
      3   save-state information for IA-32 and Itanium processors.
      4 
      5 Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
      6 This program and the accompanying materials are licensed and made available under
      7 the terms and conditions of the BSD License that accompanies this distribution.
      8 The full text of the license may be found at
      9 http://opensource.org/licenses/bsd-license.php.
     10 
     11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14   @par Revision Reference:
     15   This Protocol is defined in Framework of EFI SMM Core Interface Spec
     16   Version 0.91.
     17 **/
     18 
     19 #ifndef _SMM_CPU_SAVE_STATE_H_
     20 #define _SMM_CPU_SAVE_STATE_H_
     21 
     22 #define EFI_SMM_CPU_SAVE_STATE_PROTOCOL_GUID \
     23   { \
     24     0x21f302ad, 0x6e94, 0x471b, {0x84, 0xbc, 0xb1, 0x48, 0x0, 0x40, 0x3a, 0x1d} \
     25   }
     26 
     27 typedef struct _EFI_SMM_CPU_SAVE_STATE_PROTOCOL  EFI_SMM_CPU_SAVE_STATE_PROTOCOL;
     28 
     29 #define EFI_SMM_MIN_REV_ID_x64  0x30006
     30 
     31 #pragma pack (1)
     32 
     33 ///
     34 /// CPU save-state strcuture for IA32 and X64.
     35 ///
     36 /// This struct declaration does not exctly match the Framework SMM CIS 0.91 because the
     37 /// union in the Framework SMM CIS 0.91 contains an unnamed union member that causes build
     38 /// breaks on many compilers with high warning levels.  Instead, the UINT8 Reserved[0x200]
     39 /// field has been moved into EFI_SMM_CPU_STATE32.  This maintains binary compatibility for
     40 /// the layout and also maintains source comaptibility for access of all fields in this
     41 /// union.
     42 ///
     43 /// This struct declaration does not exctly match the Framework SMM CIS 0.91 because
     44 /// the Framework SMM CIS 0.91 uses ASM_XXX for base types in this structure.  These
     45 /// have been changed to use the base types defined in the UEFI Specification.
     46 ///
     47 typedef struct {
     48   UINT8   Reserved[0x200];
     49   UINT8   Reserved1[0xf8];  // fe00h
     50   UINT32  SMBASE;           // fef8h
     51   UINT32  SMMRevId;         // fefch
     52   UINT16  IORestart;        // ff00h
     53   UINT16  AutoHALTRestart;  // ff02h
     54   UINT32  IEDBASE;          // ff04h
     55   UINT8   Reserved2[0x98];  // ff08h
     56   UINT32  IOMemAddr;        // ffa0h
     57   UINT32  IOMisc;           // ffa4h
     58   UINT32  _ES;
     59   UINT32  _CS;
     60   UINT32  _SS;
     61   UINT32  _DS;
     62   UINT32  _FS;
     63   UINT32  _GS;
     64   UINT32  _LDTBase;
     65   UINT32  _TR;
     66   UINT32  _DR7;
     67   UINT32  _DR6;
     68   UINT32  _EAX;
     69   UINT32  _ECX;
     70   UINT32  _EDX;
     71   UINT32  _EBX;
     72   UINT32  _ESP;
     73   UINT32  _EBP;
     74   UINT32  _ESI;
     75   UINT32  _EDI;
     76   UINT32  _EIP;
     77   UINT32  _EFLAGS;
     78   UINT32  _CR3;
     79   UINT32  _CR0;
     80 } EFI_SMM_CPU_STATE32;
     81 
     82 ///
     83 /// This struct declaration does not exctly match the Framework SMM CIS 0.91 because
     84 /// the Framework SMM CIS 0.91 uses ASM_XXX for base types in this structure.  These
     85 /// have been changed to use the base types defined in the UEFI Specification.
     86 ///
     87 typedef struct {
     88   UINT8   Reserved1[0x1d0];  // fc00h
     89   UINT32  GdtBaseHiDword;    // fdd0h
     90   UINT32  LdtBaseHiDword;    // fdd4h
     91   UINT32  IdtBaseHiDword;    // fdd8h
     92   UINT8   Reserved2[0xc];    // fddch
     93   UINT64  IO_EIP;            // fde8h
     94   UINT8   Reserved3[0x50];   // fdf0h
     95   UINT32  _CR4;              // fe40h
     96   UINT8   Reserved4[0x48];   // fe44h
     97   UINT32  GdtBaseLoDword;    // fe8ch
     98   UINT32  GdtLimit;          // fe90h
     99   UINT32  IdtBaseLoDword;    // fe94h
    100   UINT32  IdtLimit;          // fe98h
    101   UINT32  LdtBaseLoDword;    // fe9ch
    102   UINT32  LdtLimit;          // fea0h
    103   UINT32  LdtInfo;           // fea4h
    104   UINT8   Reserved5[0x50];   // fea8h
    105   UINT32  SMBASE;            // fef8h
    106   UINT32  SMMRevId;          // fefch
    107   UINT16  AutoHALTRestart;   // ff00h
    108   UINT16  IORestart;         // ff02h
    109   UINT32  IEDBASE;           // ff04h
    110   UINT8   Reserved6[0x14];   // ff08h
    111   UINT64  _R15;              // ff1ch
    112   UINT64  _R14;
    113   UINT64  _R13;
    114   UINT64  _R12;
    115   UINT64  _R11;
    116   UINT64  _R10;
    117   UINT64  _R9;
    118   UINT64  _R8;
    119   UINT64  _RAX;              // ff5ch
    120   UINT64  _RCX;
    121   UINT64  _RDX;
    122   UINT64  _RBX;
    123   UINT64  _RSP;
    124   UINT64  _RBP;
    125   UINT64  _RSI;
    126   UINT64  _RDI;
    127   UINT64  IOMemAddr;         // ff9ch
    128   UINT32  IOMisc;            // ffa4h
    129   UINT32  _ES;               // ffa8h
    130   UINT32  _CS;
    131   UINT32  _SS;
    132   UINT32  _DS;
    133   UINT32  _FS;
    134   UINT32  _GS;
    135   UINT32  _LDTR;             // ffc0h
    136   UINT32  _TR;
    137   UINT64  _DR7;              // ffc8h
    138   UINT64  _DR6;
    139   UINT64  _RIP;              // ffd8h
    140   UINT64  IA32_EFER;         // ffe0h
    141   UINT64  _RFLAGS;           // ffe8h
    142   UINT64  _CR3;              // fff0h
    143   UINT64  _CR0;              // fff8h
    144 } EFI_SMM_CPU_STATE64;
    145 
    146 ///
    147 /// Union of CPU save-state strcutures for IA32 and X64.
    148 ///
    149 /// This union declaration does not exctly match the Framework SMM CIS 0.91 because the
    150 /// union in the Framework SMM CIS 0.91 contains an unnamed union member that causes build
    151 /// breaks on many compilers with high warning levels.  Instead, the UINT8 Reserved[0x200]
    152 /// field has been moved into EFI_SMM_CPU_STATE32.  This maintains binary compatibility for
    153 /// the layout and also maintains source comaptibility for access of all fields in this
    154 /// union.
    155 ///
    156 typedef union  {
    157   EFI_SMM_CPU_STATE32  x86;
    158   EFI_SMM_CPU_STATE64  x64;
    159 } EFI_SMM_CPU_STATE;
    160 
    161 #pragma pack ()
    162 
    163 ///
    164 /// Provides a programatic means to access SMM save state.
    165 ///
    166 struct _EFI_SMM_CPU_SAVE_STATE_PROTOCOL {
    167   ///
    168   /// Reference to a list of save states.
    169   ///
    170   EFI_SMM_CPU_STATE  **CpuSaveState;
    171 };
    172 
    173 extern EFI_GUID gEfiSmmCpuSaveStateProtocolGuid;
    174 
    175 #endif
    176