IN EFI_PEI_S3_RESUME2_PPI *This\r
);\r
\r
+/**\r
+ Set data segment selectors value including DS/ES/FS/GS/SS.\r
+\r
+ @param[in] SelectorValue Segment selector value to be set.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmSetDataSelectors (\r
+ IN UINT16 SelectorValue\r
+ );\r
+\r
//\r
// Globals\r
//\r
/* 0x40 */ {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},\r
};\r
\r
+#define DATA_SEGEMENT_SELECTOR 0x18\r
+\r
//\r
// IA32 Gdt register\r
//\r
IA32_DESCRIPTOR *IdtDescriptor;\r
VOID *IdtBuffer;\r
PEI_S3_RESUME_STATE *PeiS3ResumeState;\r
+ BOOLEAN InterruptStatus;\r
\r
DEBUG ((EFI_D_ERROR, "S3ResumeExecuteBootScript()\n"));\r
\r
*(UINTN*)(IdtDescriptor->Base - sizeof(UINTN)) = (UINTN)GetPeiServicesTablePointer ();\r
}\r
\r
+ InterruptStatus = SaveAndDisableInterrupts ();\r
//\r
// Need to make sure the GDT is loaded with values that support long mode and real mode.\r
//\r
AsmWriteGdtr (&mGdt);\r
+ //\r
+ // update segment selectors per the new GDT.\r
+ //\r
+ AsmSetDataSelectors (DATA_SEGEMENT_SELECTOR);\r
+ //\r
+ // Restore interrupt state.\r
+ //\r
+ SetInterruptState (InterruptStatus);\r
\r
//\r
// Prepare data for return back\r
SMM_S3_RESUME_STATE *SmmS3ResumeState;\r
VOID *GuidHob;\r
BOOLEAN Build4GPageTableOnly;\r
+ BOOLEAN InterruptStatus;\r
+\r
+ TempAcpiS3Context = 0;\r
+ TempEfiBootScriptExecutorVariable = 0;\r
\r
DEBUG ((EFI_D_ERROR, "Enter S3 PEIM\r\n"));\r
\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
- AcpiS3Context = (ACPI_S3_CONTEXT *)(UINTN)TempAcpiS3Context;\r
- ASSERT (AcpiS3Context != NULL);\r
-\r
Status = RestoreLockBox (\r
&gEfiAcpiS3ContextGuid,\r
NULL,\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
- VarSize = sizeof (TempEfiBootScriptExecutorVariable);\r
+ AcpiS3Context = (ACPI_S3_CONTEXT *)(UINTN)TempAcpiS3Context;\r
+ ASSERT (AcpiS3Context != NULL);\r
+\r
+ VarSize = sizeof (EFI_PHYSICAL_ADDRESS);\r
Status = RestoreLockBox (\r
&gEfiBootScriptExecutorVariableGuid,\r
&TempEfiBootScriptExecutorVariable,\r
ASSERT_EFI_ERROR (Status);\r
\r
EfiBootScriptExecutorVariable = (BOOT_SCRIPT_EXECUTOR_VARIABLE *) (UINTN) TempEfiBootScriptExecutorVariable;\r
+ ASSERT (EfiBootScriptExecutorVariable != NULL);\r
\r
DEBUG (( EFI_D_ERROR, "AcpiS3Context = %x\n", AcpiS3Context));\r
DEBUG (( EFI_D_ERROR, "Waking Vector = %x\n", ((EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *) ((UINTN) (AcpiS3Context->AcpiFacsTable)))->FirmwareWakingVector));\r
// Switch to long mode to complete resume.\r
//\r
\r
+ InterruptStatus = SaveAndDisableInterrupts ();\r
//\r
// Need to make sure the GDT is loaded with values that support long mode and real mode.\r
//\r
AsmWriteGdtr (&mGdt);\r
+ //\r
+ // update segment selectors per the new GDT.\r
+ // \r
+ AsmSetDataSelectors (DATA_SEGEMENT_SELECTOR);\r
+ //\r
+ // Restore interrupt state.\r
+ //\r
+ SetInterruptState (InterruptStatus);\r
+\r
AsmWriteCr3 ((UINTN)SmmS3ResumeState->SmmS3Cr3);\r
AsmEnablePaging64 (\r
0x38,\r