Home | History | Annotate | Download | only in SmmCpuState
      1 /*++
      2 
      3 Copyright (c) 2005, 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   CpuSaveState.h
     16 
     17 Abstract:
     18 
     19   Define data structures used by EFI_SMM_CPU_SAVE_STATE protocol.
     20 
     21 Revision History
     22 
     23 ++*/
     24 
     25 #ifndef _CPUSAVESTATE_H_
     26 #define _CPUSAVESTATE_H_
     27 
     28 typedef unsigned char               ASM_UINT8;
     29 typedef ASM_UINT8                   ASM_BOOL;
     30 typedef unsigned short              ASM_UINT16;
     31 typedef unsigned long               ASM_UINT32;
     32 
     33 #ifdef _H2INC
     34 typedef double                      ASM_UINT64;
     35 #else
     36 typedef UINT64                      ASM_UINT64;
     37 #endif
     38 
     39 #ifndef __GNUC__
     40 #pragma pack (push)
     41 #pragma pack (1)
     42 #endif
     43 
     44 typedef struct _EFI_SMM_CPU_STATE32 {
     45   ASM_UINT8                         Reserved1[0xf8];        // fe00h
     46   ASM_UINT32                        SMBASE;                 // fef8h
     47   ASM_UINT32                        SMMRevId;               // fefch
     48   ASM_UINT16                        IORestart;              // ff00h
     49   ASM_UINT16                        AutoHALTRestart;        // ff02h
     50   ASM_UINT32                        IEDBASE;                // ff04h
     51   ASM_UINT8                         Reserved2[0x98];        // ff08h
     52   ASM_UINT32                        IOMemAddr;              // ffa0h
     53   ASM_UINT32                        IOMisc;                 // ffa4h
     54   ASM_UINT32                        _ES;
     55   ASM_UINT32                        _CS;
     56   ASM_UINT32                        _SS;
     57   ASM_UINT32                        _DS;
     58   ASM_UINT32                        _FS;
     59   ASM_UINT32                        _GS;
     60   ASM_UINT32                        _LDTBase;
     61   ASM_UINT32                        _TR;
     62   ASM_UINT32                        _DR7;
     63   ASM_UINT32                        _DR6;
     64   ASM_UINT32                        _EAX;
     65   ASM_UINT32                        _ECX;
     66   ASM_UINT32                        _EDX;
     67   ASM_UINT32                        _EBX;
     68   ASM_UINT32                        _ESP;
     69   ASM_UINT32                        _EBP;
     70   ASM_UINT32                        _ESI;
     71   ASM_UINT32                        _EDI;
     72   ASM_UINT32                        _EIP;
     73   ASM_UINT32                        _EFLAGS;
     74   ASM_UINT32                        _CR3;
     75   ASM_UINT32                        _CR0;
     76 } EFI_SMM_CPU_STATE32;
     77 
     78 typedef struct _EFI_SMM_CPU_STATE64 {
     79   ASM_UINT8                         Reserved1[0x1d0];       // fc00h
     80   ASM_UINT32                        GdtBaseHiDword;         // fdd0h
     81   ASM_UINT32                        LdtBaseHiDword;         // fdd4h
     82   ASM_UINT32                        IdtBaseHiDword;         // fdd8h
     83   ASM_UINT8                         Reserved2[0xc];         // fddch
     84   ASM_UINT64                        IO_EIP;                 // fde8h
     85   ASM_UINT8                         Reserved3[0x50];        // fdf0h
     86   ASM_UINT32                        _CR4;                   // fe40h
     87   ASM_UINT8                         Reserved4[0x48];        // fe44h
     88   ASM_UINT32                        GdtBaseLoDword;         // fe8ch
     89   ASM_UINT32                        GdtLimit;               // fe90h
     90   ASM_UINT32                        IdtBaseLoDword;         // fe94h
     91   ASM_UINT32                        IdtLimit;               // fe98h
     92   ASM_UINT32                        LdtBaseLoDword;         // fe9ch
     93   ASM_UINT32                        LdtLimit;               // fea0h
     94   ASM_UINT32                        LdtInfo;                // fea4h
     95   ASM_UINT8                         Reserved5[0x50];        // fea8h
     96   ASM_UINT32                        SMBASE;                 // fef8h
     97   ASM_UINT32                        SMMRevId;               // fefch
     98   ASM_UINT16                        IORestart;              // ff00h
     99   ASM_UINT16                        AutoHALTRestart;        // ff02h
    100   ASM_UINT32                        IEDBASE;                // ff04h
    101   ASM_UINT8                         Reserved6[0x14];        // ff08h
    102   ASM_UINT64                        _R15;                   // ff1ch
    103   ASM_UINT64                        _R14;
    104   ASM_UINT64                        _R13;
    105   ASM_UINT64                        _R12;
    106   ASM_UINT64                        _R11;
    107   ASM_UINT64                        _R10;
    108   ASM_UINT64                        _R9;
    109   ASM_UINT64                        _R8;
    110   ASM_UINT64                        _RAX;                   // ff5ch
    111   ASM_UINT64                        _RCX;
    112   ASM_UINT64                        _RDX;
    113   ASM_UINT64                        _RBX;
    114   ASM_UINT64                        _RSP;
    115   ASM_UINT64                        _RBP;
    116   ASM_UINT64                        _RSI;
    117   ASM_UINT64                        _RDI;
    118   ASM_UINT64                        IOMemAddr;              // ff9ch
    119   ASM_UINT32                        IOMisc;                 // ffa4h
    120   ASM_UINT32                        _ES;                    // ffa8h
    121   ASM_UINT32                        _CS;
    122   ASM_UINT32                        _SS;
    123   ASM_UINT32                        _DS;
    124   ASM_UINT32                        _FS;
    125   ASM_UINT32                        _GS;
    126   ASM_UINT32                        _LDTR;                  // ffc0h
    127   ASM_UINT32                        _TR;
    128   ASM_UINT64                        _DR7;                   // ffc8h
    129   ASM_UINT64                        _DR6;
    130   ASM_UINT64                        _RIP;                   // ffd8h
    131   ASM_UINT64                        IA32_EFER;              // ffe0h
    132   ASM_UINT64                        _RFLAGS;                // ffe8h
    133   ASM_UINT64                        _CR3;                   // fff0h
    134   ASM_UINT64                        _CR0;                   // fff8h
    135 } EFI_SMM_CPU_STATE64;
    136 
    137 #ifndef __GNUC__
    138 #pragma warning (push)
    139 #pragma warning (disable: 4201)
    140 #endif
    141 
    142 
    143 typedef union _EFI_SMM_CPU_STATE {
    144   struct {
    145     ASM_UINT8                       Reserved[0x200];
    146     EFI_SMM_CPU_STATE32             x86;
    147   };
    148   EFI_SMM_CPU_STATE64               x64;
    149 } EFI_SMM_CPU_STATE;
    150 
    151 #ifndef __GNUC__
    152 #pragma warning (pop)
    153 #pragma pack (pop)
    154 #endif
    155 
    156 #define EFI_SMM_MIN_REV_ID_x64      0x30006
    157 
    158 #endif
    159