Home | History | Annotate | Download | only in Register
      1 /** @file
      2 SMRAM Save State Map Definitions.
      3 
      4 SMRAM Save State Map definitions based on contents of the
      5 Intel(R) 64 and IA-32 Architectures Software Developer's Manual
      6   Volume 3C, Section 34.4 SMRAM
      7   Volume 3C, Section 34.5 SMI Handler Execution Environment
      8   Volume 3C, Section 34.7 Managing Synchronous and Asynchronous SMIs
      9 
     10 and the AMD64 Architecture Programmer's Manual
     11   Volume 2, Section 10.2 SMM Resources
     12 
     13 Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
     14 Copyright (c) 2015, Red Hat, Inc.<BR>
     15 This program and the accompanying materials
     16 are licensed and made available under the terms and conditions of the BSD License
     17 which accompanies this distribution.  The full text of the license may be found at
     18 http://opensource.org/licenses/bsd-license.php
     19 
     20 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     21 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     22 
     23 **/
     24 
     25 #ifndef __QEMU_SMRAM_SAVE_STATE_MAP_H__
     26 #define __QEMU_SMRAM_SAVE_STATE_MAP_H__
     27 
     28 #pragma pack (1)
     29 
     30 ///
     31 /// 32-bit SMRAM Save State Map
     32 ///
     33 typedef struct {
     34   UINT8   Reserved0[0x200]; // 7c00h
     35   UINT8   Reserved1[0xf8];  // 7e00h
     36   UINT32  SMBASE;           // 7ef8h
     37   UINT32  SMMRevId;         // 7efch
     38   UINT16  IORestart;        // 7f00h
     39   UINT16  AutoHALTRestart;  // 7f02h
     40   UINT8   Reserved2[0x9C];  // 7f08h
     41   UINT32  IOMemAddr;        // 7fa0h
     42   UINT32  IOMisc;           // 7fa4h
     43   UINT32  _ES;              // 7fa8h
     44   UINT32  _CS;              // 7fach
     45   UINT32  _SS;              // 7fb0h
     46   UINT32  _DS;              // 7fb4h
     47   UINT32  _FS;              // 7fb8h
     48   UINT32  _GS;              // 7fbch
     49   UINT32  Reserved3;        // 7fc0h
     50   UINT32  _TR;              // 7fc4h
     51   UINT32  _DR7;             // 7fc8h
     52   UINT32  _DR6;             // 7fcch
     53   UINT32  _EAX;             // 7fd0h
     54   UINT32  _ECX;             // 7fd4h
     55   UINT32  _EDX;             // 7fd8h
     56   UINT32  _EBX;             // 7fdch
     57   UINT32  _ESP;             // 7fe0h
     58   UINT32  _EBP;             // 7fe4h
     59   UINT32  _ESI;             // 7fe8h
     60   UINT32  _EDI;             // 7fech
     61   UINT32  _EIP;             // 7ff0h
     62   UINT32  _EFLAGS;          // 7ff4h
     63   UINT32  _CR3;             // 7ff8h
     64   UINT32  _CR0;             // 7ffch
     65 } QEMU_SMRAM_SAVE_STATE_MAP32;
     66 
     67 ///
     68 /// 64-bit SMRAM Save State Map
     69 ///
     70 typedef struct {
     71   UINT8   Reserved0[0x200];  // 7c00h
     72 
     73   UINT16  _ES;               // 7e00h
     74   UINT16  _ESAccessRights;   // 7e02h
     75   UINT32  _ESLimit;          // 7e04h
     76   UINT64  _ESBase;           // 7e08h
     77 
     78   UINT16  _CS;               // 7e10h
     79   UINT16  _CSAccessRights;   // 7e12h
     80   UINT32  _CSLimit;          // 7e14h
     81   UINT64  _CSBase;           // 7e18h
     82 
     83   UINT16  _SS;               // 7e20h
     84   UINT16  _SSAccessRights;   // 7e22h
     85   UINT32  _SSLimit;          // 7e24h
     86   UINT64  _SSBase;           // 7e28h
     87 
     88   UINT16  _DS;               // 7e30h
     89   UINT16  _DSAccessRights;   // 7e32h
     90   UINT32  _DSLimit;          // 7e34h
     91   UINT64  _DSBase;           // 7e38h
     92 
     93   UINT16  _FS;               // 7e40h
     94   UINT16  _FSAccessRights;   // 7e42h
     95   UINT32  _FSLimit;          // 7e44h
     96   UINT64  _FSBase;           // 7e48h
     97 
     98   UINT16  _GS;               // 7e50h
     99   UINT16  _GSAccessRights;   // 7e52h
    100   UINT32  _GSLimit;          // 7e54h
    101   UINT64  _GSBase;           // 7e58h
    102 
    103   UINT32  _GDTRReserved1;    // 7e60h
    104   UINT16  _GDTRLimit;        // 7e64h
    105   UINT16  _GDTRReserved2;    // 7e66h
    106   UINT64  _GDTRBase;         // 7e68h
    107 
    108   UINT16  _LDTR;             // 7e70h
    109   UINT16  _LDTRAccessRights; // 7e72h
    110   UINT32  _LDTRLimit;        // 7e74h
    111   UINT64  _LDTRBase;         // 7e78h
    112 
    113   UINT32  _IDTRReserved1;    // 7e80h
    114   UINT16  _IDTRLimit;        // 7e84h
    115   UINT16  _IDTRReserved2;    // 7e86h
    116   UINT64  _IDTRBase;         // 7e88h
    117 
    118   UINT16  _TR;               // 7e90h
    119   UINT16  _TRAccessRights;   // 7e92h
    120   UINT32  _TRLimit;          // 7e94h
    121   UINT64  _TRBase;           // 7e98h
    122 
    123   UINT64  IO_RIP;            // 7ea0h
    124   UINT64  IO_RCX;            // 7ea8h
    125   UINT64  IO_RSI;            // 7eb0h
    126   UINT64  IO_RDI;            // 7eb8h
    127   UINT32  IO_DWord;          // 7ec0h
    128   UINT8   Reserved1[0x04];   // 7ec4h
    129   UINT8   IORestart;         // 7ec8h
    130   UINT8   AutoHALTRestart;   // 7ec9h
    131   UINT8   Reserved2[0x06];   // 7ecah
    132 
    133   UINT64  IA32_EFER;         // 7ed0h
    134   UINT64  SVM_Guest;         // 7ed8h
    135   UINT64  SVM_GuestVMCB;     // 7ee0h
    136   UINT64  SVM_GuestVIntr;    // 7ee8h
    137   UINT8   Reserved3[0x0c];   // 7ef0h
    138 
    139   UINT32  SMMRevId;          // 7efch
    140   UINT32  SMBASE;            // 7f00h
    141 
    142   UINT8   Reserved4[0x1c];   // 7f04h
    143   UINT64  SVM_GuestPAT;      // 7f20h
    144   UINT64  SVM_HostIA32_EFER; // 7f28h
    145   UINT64  SVM_HostCR4;       // 7f30h
    146   UINT64  SVM_HostCR3;       // 7f38h
    147   UINT64  SVM_HostCR0;       // 7f40h
    148 
    149   UINT64  _CR4;              // 7f48h
    150   UINT64  _CR3;              // 7f50h
    151   UINT64  _CR0;              // 7f58h
    152   UINT64  _DR7;              // 7f60h
    153   UINT64  _DR6;              // 7f68h
    154   UINT64  _RFLAGS;           // 7f70h
    155   UINT64  _RIP;              // 7f78h
    156   UINT64  _R15;              // 7f80h
    157   UINT64  _R14;              // 7f88h
    158   UINT64  _R13;              // 7f90h
    159   UINT64  _R12;              // 7f98h
    160   UINT64  _R11;              // 7fa0h
    161   UINT64  _R10;              // 7fa8h
    162   UINT64  _R9;               // 7fb0h
    163   UINT64  _R8;               // 7fb8h
    164   UINT64  _RDI;              // 7fc0h
    165   UINT64  _RSI;              // 7fc8h
    166   UINT64  _RBP;              // 7fd0h
    167   UINT64  _RSP;              // 7fd8h
    168   UINT64  _RBX;              // 7fe0h
    169   UINT64  _RDX;              // 7fe8h
    170   UINT64  _RCX;              // 7ff0h
    171   UINT64  _RAX;              // 7ff8h
    172 } QEMU_SMRAM_SAVE_STATE_MAP64;
    173 
    174 ///
    175 /// Union of 32-bit and 64-bit SMRAM Save State Maps
    176 ///
    177 typedef union  {
    178   QEMU_SMRAM_SAVE_STATE_MAP32  x86;
    179   QEMU_SMRAM_SAVE_STATE_MAP64  x64;
    180 } QEMU_SMRAM_SAVE_STATE_MAP;
    181 
    182 #pragma pack ()
    183 
    184 #endif
    185