]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg: SmmCpuFeaturesLib: customize state save map format
authorPaolo Bonzini <pbonzini@redhat.com>
Mon, 30 Nov 2015 18:46:42 +0000 (18:46 +0000)
committerlersek <lersek@Edk2>
Mon, 30 Nov 2015 18:46:42 +0000 (18:46 +0000)
This adjusts the previously introduced state save map access functions, to
account for QEMU and KVM's 64-bit state save map following the AMD spec
rather than the Intel one.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
[lersek@redhat.com: reflow commit message, convert patch to CRLF]

Cc: Paolo Bonzini <pbonzini@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Michael Kinney <michael.d.kinney@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@19057 6f19259b-4bc3-4df7-8a09-765794883524

OvmfPkg/Include/Register/QemuSmramSaveStateMap.h [new file with mode: 0644]
OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c
OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf

diff --git a/OvmfPkg/Include/Register/QemuSmramSaveStateMap.h b/OvmfPkg/Include/Register/QemuSmramSaveStateMap.h
new file mode 100644 (file)
index 0000000..389428d
--- /dev/null
@@ -0,0 +1,184 @@
+/** @file\r
+SMRAM Save State Map Definitions.\r
+\r
+SMRAM Save State Map definitions based on contents of the \r
+Intel(R) 64 and IA-32 Architectures Software Developer's Manual\r
+  Volume 3C, Section 34.4 SMRAM\r
+  Volume 3C, Section 34.5 SMI Handler Execution Environment\r
+  Volume 3C, Section 34.7 Managing Synchronous and Asynchronous SMIs\r
+\r
+and the AMD64 Architecture Programmer's Manual\r
+  Volume 2, Section 10.2 SMM Resources\r
+\r
+Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2015, Red Hat, Inc.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef __QEMU_SMRAM_SAVE_STATE_MAP_H__\r
+#define __QEMU_SMRAM_SAVE_STATE_MAP_H__\r
+\r
+#pragma pack (1)\r
+\r
+///\r
+/// 32-bit SMRAM Save State Map\r
+///\r
+typedef struct {\r
+  UINT8   Reserved0[0x200]; // 7c00h\r
+  UINT8   Reserved1[0xf8];  // 7e00h\r
+  UINT32  SMBASE;           // 7ef8h\r
+  UINT32  SMMRevId;         // 7efch\r
+  UINT16  IORestart;        // 7f00h\r
+  UINT16  AutoHALTRestart;  // 7f02h\r
+  UINT8   Reserved2[0x9C];  // 7f08h\r
+  UINT32  IOMemAddr;        // 7fa0h\r
+  UINT32  IOMisc;           // 7fa4h\r
+  UINT32  _ES;              // 7fa8h\r
+  UINT32  _CS;              // 7fach\r
+  UINT32  _SS;              // 7fb0h\r
+  UINT32  _DS;              // 7fb4h\r
+  UINT32  _FS;              // 7fb8h\r
+  UINT32  _GS;              // 7fbch\r
+  UINT32  Reserved3;        // 7fc0h\r
+  UINT32  _TR;              // 7fc4h\r
+  UINT32  _DR7;             // 7fc8h\r
+  UINT32  _DR6;             // 7fcch\r
+  UINT32  _EAX;             // 7fd0h\r
+  UINT32  _ECX;             // 7fd4h\r
+  UINT32  _EDX;             // 7fd8h\r
+  UINT32  _EBX;             // 7fdch\r
+  UINT32  _ESP;             // 7fe0h\r
+  UINT32  _EBP;             // 7fe4h\r
+  UINT32  _ESI;             // 7fe8h\r
+  UINT32  _EDI;             // 7fech\r
+  UINT32  _EIP;             // 7ff0h\r
+  UINT32  _EFLAGS;          // 7ff4h\r
+  UINT32  _CR3;             // 7ff8h\r
+  UINT32  _CR0;             // 7ffch\r
+} QEMU_SMRAM_SAVE_STATE_MAP32;\r
+\r
+///\r
+/// 64-bit SMRAM Save State Map\r
+///\r
+typedef struct {\r
+  UINT8   Reserved0[0x200];  // 7c00h\r
+\r
+  UINT16  _ES;               // 7e00h\r
+  UINT16  _ESAccessRights;   // 7e02h\r
+  UINT32  _ESLimit;          // 7e04h\r
+  UINT64  _ESBase;           // 7e08h\r
+\r
+  UINT16  _CS;               // 7e10h\r
+  UINT16  _CSAccessRights;   // 7e12h\r
+  UINT32  _CSLimit;          // 7e14h\r
+  UINT64  _CSBase;           // 7e18h\r
+\r
+  UINT16  _SS;               // 7e20h\r
+  UINT16  _SSAccessRights;   // 7e22h\r
+  UINT32  _SSLimit;          // 7e24h\r
+  UINT64  _SSBase;           // 7e28h\r
+\r
+  UINT16  _DS;               // 7e30h\r
+  UINT16  _DSAccessRights;   // 7e32h\r
+  UINT32  _DSLimit;          // 7e34h\r
+  UINT64  _DSBase;           // 7e38h\r
+\r
+  UINT16  _FS;               // 7e40h\r
+  UINT16  _FSAccessRights;   // 7e42h\r
+  UINT32  _FSLimit;          // 7e44h\r
+  UINT64  _FSBase;           // 7e48h\r
+\r
+  UINT16  _GS;               // 7e50h\r
+  UINT16  _GSAccessRights;   // 7e52h\r
+  UINT32  _GSLimit;          // 7e54h\r
+  UINT64  _GSBase;           // 7e58h\r
+\r
+  UINT32  _GDTRReserved1;    // 7e60h\r
+  UINT16  _GDTRLimit;        // 7e64h\r
+  UINT16  _GDTRReserved2;    // 7e66h\r
+  UINT64  _GDTRBase;         // 7e68h\r
+\r
+  UINT16  _LDTR;             // 7e70h\r
+  UINT16  _LDTRAccessRights; // 7e72h\r
+  UINT32  _LDTRLimit;        // 7e74h\r
+  UINT64  _LDTRBase;         // 7e78h\r
+\r
+  UINT32  _IDTRReserved1;    // 7e80h\r
+  UINT16  _IDTRLimit;        // 7e84h\r
+  UINT16  _IDTRReserved2;    // 7e86h\r
+  UINT64  _IDTRBase;         // 7e88h\r
+\r
+  UINT16  _TR;               // 7e90h\r
+  UINT16  _TRAccessRights;   // 7e92h\r
+  UINT32  _TRLimit;          // 7e94h\r
+  UINT64  _TRBase;           // 7e98h\r
+\r
+  UINT64  IO_RIP;            // 7ea0h\r
+  UINT64  IO_RCX;            // 7ea8h\r
+  UINT64  IO_RSI;            // 7eb0h\r
+  UINT64  IO_RDI;            // 7eb8h\r
+  UINT32  IO_DWord;          // 7ec0h\r
+  UINT8   Reserved1[0x04];   // 7ec4h\r
+  UINT8   IORestart;         // 7ec8h\r
+  UINT8   AutoHALTRestart;   // 7ec9h\r
+  UINT8   Reserved2[0x06];   // 7ecah\r
+\r
+  UINT64  IA32_EFER;         // 7ed0h\r
+  UINT64  SVM_Guest;         // 7ed8h\r
+  UINT64  SVM_GuestVMCB;     // 7ee0h\r
+  UINT64  SVM_GuestVIntr;    // 7ee8h\r
+  UINT8   Reserved3[0x0c];   // 7ef0h\r
+\r
+  UINT32  SMMRevId;          // 7efch\r
+  UINT32  SMBASE;            // 7f00h\r
+\r
+  UINT8   Reserved4[0x1c];   // 7f04h\r
+  UINT64  SVM_GuestPAT;      // 7f20h\r
+  UINT64  SVM_HostIA32_EFER; // 7f28h\r
+  UINT64  SVM_HostCR4;       // 7f30h\r
+  UINT64  SVM_HostCR3;       // 7f38h\r
+  UINT64  SVM_HostCR0;       // 7f40h\r
+\r
+  UINT64  _CR4;              // 7f48h\r
+  UINT64  _CR3;              // 7f50h\r
+  UINT64  _CR0;              // 7f58h\r
+  UINT64  _DR7;              // 7f60h\r
+  UINT64  _DR6;              // 7f68h\r
+  UINT64  _RFLAGS;           // 7f70h\r
+  UINT64  _RIP;              // 7f78h\r
+  UINT64  _R15;              // 7f80h\r
+  UINT64  _R14;              // 7f88h\r
+  UINT64  _R13;              // 7f90h\r
+  UINT64  _R12;              // 7f98h\r
+  UINT64  _R11;              // 7fa0h\r
+  UINT64  _R10;              // 7fa8h\r
+  UINT64  _R9;               // 7fb0h\r
+  UINT64  _R8;               // 7fb8h\r
+  UINT64  _RDI;              // 7fc0h\r
+  UINT64  _RSI;              // 7fc8h\r
+  UINT64  _RBP;              // 7fd0h\r
+  UINT64  _RSP;              // 7fd8h\r
+  UINT64  _RBX;              // 7fe0h\r
+  UINT64  _RDX;              // 7fe8h\r
+  UINT64  _RCX;              // 7ff0h\r
+  UINT64  _RAX;              // 7ff8h\r
+} QEMU_SMRAM_SAVE_STATE_MAP64;\r
+\r
+///\r
+/// Union of 32-bit and 64-bit SMRAM Save State Maps\r
+///\r
+typedef union  {\r
+  QEMU_SMRAM_SAVE_STATE_MAP32  x86;\r
+  QEMU_SMRAM_SAVE_STATE_MAP64  x64;\r
+} QEMU_SMRAM_SAVE_STATE_MAP;\r
+\r
+#pragma pack ()\r
+\r
+#endif\r
index b3d0e3a8fb5b4c7f9a7be96b9c1d5a40f3802a26..a307f64c9c6123963a6f1748fe9716057bc77040 100644 (file)
@@ -20,7 +20,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Library/MemoryAllocationLib.h>\r
 #include <Library/SmmServicesTableLib.h>\r
 #include <Library/DebugLib.h>\r
 #include <Library/MemoryAllocationLib.h>\r
 #include <Library/SmmServicesTableLib.h>\r
 #include <Library/DebugLib.h>\r
-#include <Register/SmramSaveStateMap.h>\r
+#include <Register/QemuSmramSaveStateMap.h>\r
 \r
 //\r
 // EFER register LMA bit\r
 \r
 //\r
 // EFER register LMA bit\r
@@ -82,13 +82,17 @@ SmmCpuFeaturesInitializeProcessor (
   IN CPU_HOT_PLUG_DATA          *CpuHotPlugData\r
   )\r
 {\r
   IN CPU_HOT_PLUG_DATA          *CpuHotPlugData\r
   )\r
 {\r
-  SMRAM_SAVE_STATE_MAP  *CpuState;\r
+  QEMU_SMRAM_SAVE_STATE_MAP  *CpuState;\r
 \r
   //\r
   // Configure SMBASE.\r
   //\r
 \r
   //\r
   // Configure SMBASE.\r
   //\r
-  CpuState = (SMRAM_SAVE_STATE_MAP *)(UINTN)(SMM_DEFAULT_SMBASE + SMRAM_SAVE_STATE_MAP_OFFSET);\r
-  CpuState->x86.SMBASE = (UINT32)CpuHotPlugData->SmBase[CpuIndex];\r
+  CpuState = (QEMU_SMRAM_SAVE_STATE_MAP *)(UINTN)(SMM_DEFAULT_SMBASE + SMRAM_SAVE_STATE_MAP_OFFSET);\r
+  if ((CpuState->x86.SMMRevId & 0xFFFF) == 0) {\r
+    CpuState->x86.SMBASE = (UINT32)CpuHotPlugData->SmBase[CpuIndex];\r
+  } else {\r
+    CpuState->x64.SMBASE = (UINT32)CpuHotPlugData->SmBase[CpuIndex];\r
+  }\r
 \r
   //\r
   // No need to program SMRRs on our virtual platform.\r
 \r
   //\r
   // No need to program SMRRs on our virtual platform.\r
@@ -135,8 +139,8 @@ SmmCpuFeaturesHookReturnFromSmm (
   IN UINT64                NewInstructionPointer\r
   )\r
 {\r
   IN UINT64                NewInstructionPointer\r
   )\r
 {\r
-  UINT64                 OriginalInstructionPointer;\r
-  SMRAM_SAVE_STATE_MAP  *CpuSaveState = (SMRAM_SAVE_STATE_MAP *)CpuState;\r
+  UINT64                      OriginalInstructionPointer;\r
+  QEMU_SMRAM_SAVE_STATE_MAP  *CpuSaveState = (QEMU_SMRAM_SAVE_STATE_MAP *)CpuState;\r
 \r
   if ((CpuSaveState->x86.SMMRevId & 0xFFFF) == 0) {\r
     OriginalInstructionPointer = (UINT64)CpuSaveState->x86._EIP;\r
 \r
   if ((CpuSaveState->x86.SMMRevId & 0xFFFF) == 0) {\r
     OriginalInstructionPointer = (UINT64)CpuSaveState->x86._EIP;\r
@@ -397,7 +401,7 @@ SmmCpuFeaturesSetSmmRegister (
 ///\r
 /// Macro used to simplify the lookup table entries of type CPU_SMM_SAVE_STATE_LOOKUP_ENTRY\r
 ///\r
 ///\r
 /// Macro used to simplify the lookup table entries of type CPU_SMM_SAVE_STATE_LOOKUP_ENTRY\r
 ///\r
-#define SMM_CPU_OFFSET(Field) OFFSET_OF (SMRAM_SAVE_STATE_MAP, Field)\r
+#define SMM_CPU_OFFSET(Field) OFFSET_OF (QEMU_SMRAM_SAVE_STATE_MAP, Field)\r
 \r
 ///\r
 /// Macro used to simplify the lookup table entries of type CPU_SMM_SAVE_STATE_REGISTER_RANGE\r
 \r
 ///\r
 /// Macro used to simplify the lookup table entries of type CPU_SMM_SAVE_STATE_REGISTER_RANGE\r
@@ -450,13 +454,13 @@ static CONST CPU_SMM_SAVE_STATE_LOOKUP_ENTRY mSmmCpuWidthOffset[] = {
   //\r
   // CPU Save State registers defined in PI SMM CPU Protocol.\r
   //\r
   //\r
   // CPU Save State registers defined in PI SMM CPU Protocol.\r
   //\r
-  {0, 8, 0                            , SMM_CPU_OFFSET (x64.GdtBaseLoDword) , SMM_CPU_OFFSET (x64.GdtBaseHiDword), FALSE},  //  EFI_SMM_SAVE_STATE_REGISTER_GDTBASE  = 4\r
-  {0, 8, 0                            , SMM_CPU_OFFSET (x64.IdtBaseLoDword) , SMM_CPU_OFFSET (x64.IdtBaseHiDword), FALSE},  //  EFI_SMM_SAVE_STATE_REGISTER_IDTBASE  = 5\r
-  {0, 8, 0                            , SMM_CPU_OFFSET (x64.LdtBaseLoDword) , SMM_CPU_OFFSET (x64.LdtBaseHiDword), FALSE},  //  EFI_SMM_SAVE_STATE_REGISTER_LDTBASE  = 6\r
-  {0, 0, 0                            , 0                                   , 0                                  , FALSE},  //  EFI_SMM_SAVE_STATE_REGISTER_GDTLIMIT = 7\r
-  {0, 0, 0                            , 0                                   , 0                                  , FALSE},  //  EFI_SMM_SAVE_STATE_REGISTER_IDTLIMIT = 8\r
-  {0, 0, 0                            , 0                                   , 0                                  , FALSE},  //  EFI_SMM_SAVE_STATE_REGISTER_LDTLIMIT = 9\r
-  {0, 0, 0                            , 0                                   , 0                                  , FALSE},  //  EFI_SMM_SAVE_STATE_REGISTER_LDTINFO  = 10\r
+  {0, 8, 0                            , SMM_CPU_OFFSET (x64._GDTRBase) , SMM_CPU_OFFSET (x64._GDTRBase)  + 4, FALSE},  //  EFI_SMM_SAVE_STATE_REGISTER_GDTBASE  = 4\r
+  {0, 8, 0                            , SMM_CPU_OFFSET (x64._IDTRBase) , SMM_CPU_OFFSET (x64._IDTRBase)  + 4, FALSE},  //  EFI_SMM_SAVE_STATE_REGISTER_IDTBASE  = 5\r
+  {0, 8, 0                            , SMM_CPU_OFFSET (x64._LDTRBase) , SMM_CPU_OFFSET (x64._LDTRBase)  + 4, FALSE},  //  EFI_SMM_SAVE_STATE_REGISTER_LDTBASE  = 6\r
+  {0, 0, 0                            , SMM_CPU_OFFSET (x64._GDTRLimit), SMM_CPU_OFFSET (x64._GDTRLimit) + 4, FALSE},  //  EFI_SMM_SAVE_STATE_REGISTER_GDTLIMIT = 7\r
+  {0, 0, 0                            , SMM_CPU_OFFSET (x64._IDTRLimit), SMM_CPU_OFFSET (x64._IDTRLimit) + 4, FALSE},  //  EFI_SMM_SAVE_STATE_REGISTER_IDTLIMIT = 8\r
+  {0, 0, 0                            , SMM_CPU_OFFSET (x64._LDTRLimit), SMM_CPU_OFFSET (x64._LDTRLimit) + 4, FALSE},  //  EFI_SMM_SAVE_STATE_REGISTER_LDTLIMIT = 9\r
+  {0, 0, 0                            , 0                              , 0                               + 4, FALSE},  //  EFI_SMM_SAVE_STATE_REGISTER_LDTINFO  = 10\r
 \r
   {4, 4, SMM_CPU_OFFSET (x86._ES)     , SMM_CPU_OFFSET (x64._ES)     , 0                               , FALSE},  //  EFI_SMM_SAVE_STATE_REGISTER_ES       = 20\r
   {4, 4, SMM_CPU_OFFSET (x86._CS)     , SMM_CPU_OFFSET (x64._CS)     , 0                               , FALSE},  //  EFI_SMM_SAVE_STATE_REGISTER_CS       = 21\r
 \r
   {4, 4, SMM_CPU_OFFSET (x86._ES)     , SMM_CPU_OFFSET (x64._ES)     , 0                               , FALSE},  //  EFI_SMM_SAVE_STATE_REGISTER_ES       = 20\r
   {4, 4, SMM_CPU_OFFSET (x86._CS)     , SMM_CPU_OFFSET (x64._CS)     , 0                               , FALSE},  //  EFI_SMM_SAVE_STATE_REGISTER_CS       = 21\r
@@ -489,7 +493,7 @@ static CONST CPU_SMM_SAVE_STATE_LOOKUP_ENTRY mSmmCpuWidthOffset[] = {
   {4, 8, SMM_CPU_OFFSET (x86._EFLAGS) , SMM_CPU_OFFSET (x64._RFLAGS) , SMM_CPU_OFFSET (x64._RFLAGS) + 4, TRUE },  //  EFI_SMM_SAVE_STATE_REGISTER_RFLAGS   = 51\r
   {4, 8, SMM_CPU_OFFSET (x86._CR0)    , SMM_CPU_OFFSET (x64._CR0)    , SMM_CPU_OFFSET (x64._CR0)    + 4, FALSE},  //  EFI_SMM_SAVE_STATE_REGISTER_CR0      = 52\r
   {4, 8, SMM_CPU_OFFSET (x86._CR3)    , SMM_CPU_OFFSET (x64._CR3)    , SMM_CPU_OFFSET (x64._CR3)    + 4, FALSE},  //  EFI_SMM_SAVE_STATE_REGISTER_CR3      = 53\r
   {4, 8, SMM_CPU_OFFSET (x86._EFLAGS) , SMM_CPU_OFFSET (x64._RFLAGS) , SMM_CPU_OFFSET (x64._RFLAGS) + 4, TRUE },  //  EFI_SMM_SAVE_STATE_REGISTER_RFLAGS   = 51\r
   {4, 8, SMM_CPU_OFFSET (x86._CR0)    , SMM_CPU_OFFSET (x64._CR0)    , SMM_CPU_OFFSET (x64._CR0)    + 4, FALSE},  //  EFI_SMM_SAVE_STATE_REGISTER_CR0      = 52\r
   {4, 8, SMM_CPU_OFFSET (x86._CR3)    , SMM_CPU_OFFSET (x64._CR3)    , SMM_CPU_OFFSET (x64._CR3)    + 4, FALSE},  //  EFI_SMM_SAVE_STATE_REGISTER_CR3      = 53\r
-  {0, 4, 0                            , SMM_CPU_OFFSET (x64._CR4)    , 0                               , FALSE},  //  EFI_SMM_SAVE_STATE_REGISTER_CR4      = 54\r
+  {0, 4, 0                            , SMM_CPU_OFFSET (x64._CR4)    , SMM_CPU_OFFSET (x64._CR4)    + 4, FALSE},  //  EFI_SMM_SAVE_STATE_REGISTER_CR4      = 54\r
 };\r
 \r
 //\r
 };\r
 \r
 //\r
@@ -548,9 +552,9 @@ ReadSaveStateRegisterByIndex (
   OUT VOID   *Buffer\r
   )\r
 {\r
   OUT VOID   *Buffer\r
   )\r
 {\r
-  SMRAM_SAVE_STATE_MAP  *CpuSaveState;\r
+  QEMU_SMRAM_SAVE_STATE_MAP  *CpuSaveState;\r
 \r
 \r
-  CpuSaveState = gSmst->CpuSaveState[CpuIndex];\r
+  CpuSaveState = (QEMU_SMRAM_SAVE_STATE_MAP *)gSmst->CpuSaveState[CpuIndex];\r
 \r
   if ((CpuSaveState->x86.SMMRevId & 0xFFFF) == 0) {\r
     //\r
 \r
   if ((CpuSaveState->x86.SMMRevId & 0xFFFF) == 0) {\r
     //\r
@@ -628,8 +632,8 @@ SmmCpuFeaturesReadSaveStateRegister (
   OUT VOID                         *Buffer\r
   )\r
 {\r
   OUT VOID                         *Buffer\r
   )\r
 {\r
-  UINTN                  RegisterIndex;\r
-  SMRAM_SAVE_STATE_MAP  *CpuSaveState;\r
+  UINTN                       RegisterIndex;\r
+  QEMU_SMRAM_SAVE_STATE_MAP  *CpuSaveState;\r
 \r
   //\r
   // Check for special EFI_SMM_SAVE_STATE_REGISTER_LMA\r
 \r
   //\r
   // Check for special EFI_SMM_SAVE_STATE_REGISTER_LMA\r
@@ -642,7 +646,7 @@ SmmCpuFeaturesReadSaveStateRegister (
       return EFI_INVALID_PARAMETER;\r
     }\r
 \r
       return EFI_INVALID_PARAMETER;\r
     }\r
 \r
-    CpuSaveState = gSmst->CpuSaveState[CpuIndex];\r
+    CpuSaveState = (QEMU_SMRAM_SAVE_STATE_MAP *)gSmst->CpuSaveState[CpuIndex];\r
 \r
     //\r
     // Check CPU mode\r
 \r
     //\r
     // Check CPU mode\r
@@ -701,8 +705,8 @@ SmmCpuFeaturesWriteSaveStateRegister (
   IN CONST VOID                   *Buffer\r
   )\r
 {\r
   IN CONST VOID                   *Buffer\r
   )\r
 {\r
-  UINTN                 RegisterIndex;\r
-  SMRAM_SAVE_STATE_MAP  *CpuSaveState;\r
+  UINTN                       RegisterIndex;\r
+  QEMU_SMRAM_SAVE_STATE_MAP  *CpuSaveState;\r
 \r
   //\r
   // Writes to EFI_SMM_SAVE_STATE_REGISTER_LMA are ignored\r
 \r
   //\r
   // Writes to EFI_SMM_SAVE_STATE_REGISTER_LMA are ignored\r
@@ -728,7 +732,7 @@ SmmCpuFeaturesWriteSaveStateRegister (
     return Register < EFI_SMM_SAVE_STATE_REGISTER_IO ? EFI_NOT_FOUND : EFI_UNSUPPORTED;\r
   }\r
 \r
     return Register < EFI_SMM_SAVE_STATE_REGISTER_IO ? EFI_NOT_FOUND : EFI_UNSUPPORTED;\r
   }\r
 \r
-  CpuSaveState = gSmst->CpuSaveState[CpuIndex];\r
+  CpuSaveState = (QEMU_SMRAM_SAVE_STATE_MAP *)gSmst->CpuSaveState[CpuIndex];\r
 \r
   //\r
   // Do not write non-writable SaveState, because it will cause exception.\r
 \r
   //\r
   // Do not write non-writable SaveState, because it will cause exception.\r
index 4b86deb5899bb92ff25b1f50eb36034bf686d01e..31edf3a9c1fd2dd2ffb6d8fd8875e4bb549eef61 100644 (file)
@@ -27,6 +27,7 @@
 \r
 [Packages]\r
   MdePkg/MdePkg.dec\r
 \r
 [Packages]\r
   MdePkg/MdePkg.dec\r
+  OvmfPkg/OvmfPkg.dec\r
   UefiCpuPkg/UefiCpuPkg.dec\r
 \r
 [LibraryClasses]\r
   UefiCpuPkg/UefiCpuPkg.dec\r
 \r
 [LibraryClasses]\r