]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/ScriptExecute.c
MdeModulePkg: Supporting S3 in 64bit PEI
[mirror_edk2.git] / MdeModulePkg / Universal / Acpi / BootScriptExecutorDxe / ScriptExecute.c
index 82481aacd6b238d7ca232b2a5e62dd2b185c9ca2..98c5abecf88c50c5c0ada387ff1ebe087b0a14ef 100644 (file)
@@ -4,7 +4,7 @@
   This driver is dispatched by Dxe core and the driver will reload itself to ACPI reserved memory\r
   in the entry point. The functionality is to interpret and restore the S3 boot script\r
 \r
-Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2022, Intel Corporation. All rights reserved.<BR>\r
 Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>\r
 \r
 SPDX-License-Identifier: BSD-2-Clause-Patent\r
@@ -95,7 +95,7 @@ S3BootScriptExecutorEntryFunction (
     PeiS3ResumeState->ReturnStatus = (UINT64)(UINTN)Status;\r
     if (FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {\r
       //\r
-      // X64 S3 Resume\r
+      // X64 DXE to IA32 PEI S3 Resume\r
       //\r
       DEBUG ((DEBUG_INFO, "Call AsmDisablePaging64() to return to S3 Resume in PEI Phase\n"));\r
       PeiS3ResumeState->AsmTransferControl = (EFI_PHYSICAL_ADDRESS)(UINTN)AsmTransferControl32;\r
@@ -121,7 +121,7 @@ S3BootScriptExecutorEntryFunction (
         );\r
     } else {\r
       //\r
-      // IA32 S3 Resume\r
+      // IA32 DXE to IA32 PEI S3 Resume / X64 DXE to X64 PEI S3 Resume\r
       //\r
       DEBUG ((DEBUG_INFO, "Call SwitchStack() to return to S3 Resume in PEI Phase\n"));\r
       PeiS3ResumeState->AsmTransferControl = (EFI_PHYSICAL_ADDRESS)(UINTN)AsmTransferControl;\r
@@ -156,8 +156,11 @@ S3BootScriptExecutorEntryFunction (
       //\r
       // X64 long mode waking vector\r
       //\r
-      DEBUG ((DEBUG_INFO, "Transfer to 64bit OS waking vector - %x\r\n", (UINTN)Facs->XFirmwareWakingVector));\r
-      if (FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {\r
+      DEBUG ((DEBUG_INFO, "Transfer from 64bit DXE to 64bit OS waking vector - %x\r\n", (UINTN)Facs->XFirmwareWakingVector));\r
+      if (sizeof (UINTN) == sizeof (UINT64)) {\r
+        //\r
+        // 64bit DXE calls to 64bit OS S3 waking vector\r
+        //\r
         SwitchStack (\r
           (SWITCH_STACK_ENTRY_POINT)(UINTN)Facs->XFirmwareWakingVector,\r
           NULL,\r
@@ -174,7 +177,10 @@ S3BootScriptExecutorEntryFunction (
       // IA32 protected mode waking vector (Page disabled)\r
       //\r
       DEBUG ((DEBUG_INFO, "Transfer to 32bit OS waking vector - %x\r\n", (UINTN)Facs->XFirmwareWakingVector));\r
-      if (FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {\r
+      if (sizeof (UINTN) == sizeof (UINT64)) {\r
+        //\r
+        // 64bit DXE calls to 32bit OS S3 waking vector\r
+        //\r
         AsmDisablePaging64 (\r
           0x10,\r
           (UINT32)Facs->XFirmwareWakingVector,\r
@@ -183,6 +189,9 @@ S3BootScriptExecutorEntryFunction (
           (UINT32)TempStackTop\r
           );\r
       } else {\r
+        //\r
+        // 32bit DXE calls to 32bit OS S3 waking vector\r
+        //\r
         SwitchStack (\r
           (SWITCH_STACK_ENTRY_POINT)(UINTN)Facs->XFirmwareWakingVector,\r
           NULL,\r