]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/ScriptExecute.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Universal / Acpi / BootScriptExecutorDxe / ScriptExecute.c
index 10493bea021bbb46f183a8d0700533dcabac5e69..b2ae9ec3a43c93012b4ff2e04fad4952077a95bd 100644 (file)
@@ -4,15 +4,10 @@
   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 - 2016, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>\r
 \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
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -23,6 +18,7 @@ EFI_GUID              mBootScriptExecutorImageGuid = {
 };\r
 \r
 BOOLEAN               mPage1GSupport = FALSE;\r
+UINT64                mAddressEncMask = 0;\r
 \r
 /**\r
   Entry function of Boot script exector. This function will be executed in\r
@@ -70,12 +66,12 @@ S3BootScriptExecutorEntryFunction (
   // for that parameter.\r
   //\r
   Status = S3BootScriptExecute ();\r
-  \r
+\r
   //\r
   // If invalid script table or opcode in S3 boot script table.\r
   //\r
   ASSERT_EFI_ERROR (Status);\r
-  \r
+\r
   if (EFI_ERROR (Status)) {\r
     CpuDeadLoop ();\r
     return Status;\r
@@ -93,7 +89,7 @@ S3BootScriptExecutorEntryFunction (
   //\r
   if (PeiS3ResumeState != 0) {\r
     //\r
-    // Need report status back to S3ResumePeim. \r
+    // Need report status back to S3ResumePeim.\r
     // If boot script execution is failed, S3ResumePeim wil report the error status code.\r
     //\r
     PeiS3ResumeState->ReturnStatus = (UINT64)(UINTN)Status;\r
@@ -101,7 +97,7 @@ S3BootScriptExecutorEntryFunction (
       //\r
       // X64 S3 Resume\r
       //\r
-      DEBUG ((EFI_D_ERROR, "Call AsmDisablePaging64() to return to S3 Resume in PEI Phase\n"));\r
+      DEBUG ((DEBUG_INFO, "Call AsmDisablePaging64() to return to S3 Resume in PEI Phase\n"));\r
       PeiS3ResumeState->AsmTransferControl = (EFI_PHYSICAL_ADDRESS)(UINTN)AsmTransferControl32;\r
 \r
       if ((Facs != NULL) &&\r
@@ -126,7 +122,7 @@ S3BootScriptExecutorEntryFunction (
       //\r
       // IA32 S3 Resume\r
       //\r
-      DEBUG ((EFI_D_ERROR, "Call SwitchStack() to return to S3 Resume in PEI Phase\n"));\r
+      DEBUG ((DEBUG_INFO, "Call SwitchStack() to return to S3 Resume in PEI Phase\n"));\r
       PeiS3ResumeState->AsmTransferControl = (EFI_PHYSICAL_ADDRESS)(UINTN)AsmTransferControl;\r
 \r
       SwitchStack (\r
@@ -143,7 +139,7 @@ S3BootScriptExecutorEntryFunction (
     CpuDeadLoop();\r
     return EFI_UNSUPPORTED;\r
   }\r
-  \r
+\r
   //\r
   // S3ResumePeim does not provide a way to jump back to itself, so resume to OS here directly\r
   //\r
@@ -154,11 +150,11 @@ S3BootScriptExecutorEntryFunction (
     TempStackTop = (UINTN)&TempStack + sizeof(TempStack);\r
     if ((Facs->Version == EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION) &&\r
         ((Facs->Flags & EFI_ACPI_4_0_64BIT_WAKE_SUPPORTED_F) != 0) &&\r
-        ((Facs->Flags & EFI_ACPI_4_0_OSPM_64BIT_WAKE__F) != 0)) {\r
+        ((Facs->OspmFlags & EFI_ACPI_4_0_OSPM_64BIT_WAKE__F) != 0)) {\r
       //\r
       // X64 long mode waking vector\r
       //\r
-      DEBUG (( EFI_D_ERROR, "Transfer to 64bit OS waking vector - %x\r\n", (UINTN)Facs->XFirmwareWakingVector));\r
+      DEBUG ((DEBUG_INFO, "Transfer to 64bit OS waking vector - %x\r\n", (UINTN)Facs->XFirmwareWakingVector));\r
       if (FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {\r
         SwitchStack (\r
           (SWITCH_STACK_ENTRY_POINT)(UINTN)Facs->XFirmwareWakingVector,\r
@@ -175,7 +171,7 @@ S3BootScriptExecutorEntryFunction (
       //\r
       // IA32 protected mode waking vector (Page disabled)\r
       //\r
-      DEBUG (( EFI_D_ERROR, "Transfer to 32bit OS waking vector - %x\r\n", (UINTN)Facs->XFirmwareWakingVector));\r
+      DEBUG ((DEBUG_INFO, "Transfer to 32bit OS waking vector - %x\r\n", (UINTN)Facs->XFirmwareWakingVector));\r
       if (FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {\r
         AsmDisablePaging64 (\r
           0x10,\r
@@ -197,7 +193,7 @@ S3BootScriptExecutorEntryFunction (
     //\r
     // 16bit Realmode waking vector\r
     //\r
-    DEBUG (( EFI_D_ERROR, "Transfer to 16bit OS waking vector - %x\r\n", (UINTN)Facs->FirmwareWakingVector));\r
+    DEBUG ((DEBUG_INFO, "Transfer to 16bit OS waking vector - %x\r\n", (UINTN)Facs->FirmwareWakingVector));\r
     AsmTransferControl (Facs->FirmwareWakingVector, 0x0);\r
   }\r
 \r
@@ -252,9 +248,9 @@ RegisterMemoryProfileImage (
 /**\r
   This is the Event notification function to reload BootScriptExecutor image\r
   to RESERVED mem and save it to LockBox.\r
-  \r
+\r
   @param    Event   Pointer to this event\r
-  @param    Context Event handler private data \r
+  @param    Context Event handler private data\r
  **/\r
 VOID\r
 EFIAPI\r
@@ -271,6 +267,7 @@ ReadyToLockEventNotify (
   UINTN                                         Pages;\r
   EFI_PHYSICAL_ADDRESS                          FfsBuffer;\r
   PE_COFF_LOADER_IMAGE_CONTEXT                  ImageContext;\r
+  EFI_GCD_MEMORY_SPACE_DESCRIPTOR               MemDesc;\r
 \r
   Status = gBS->LocateProtocol (&gEfiDxeSmmReadyToLockProtocolGuid, NULL, &Interface);\r
   if (EFI_ERROR (Status)) {\r
@@ -320,12 +317,25 @@ ReadyToLockEventNotify (
                   &FfsBuffer\r
                   );\r
   ASSERT_EFI_ERROR (Status);\r
+\r
+  //\r
+  // Make sure that the buffer can be used to store code.\r
+  //\r
+  Status = gDS->GetMemorySpaceDescriptor (FfsBuffer, &MemDesc);\r
+  if (!EFI_ERROR (Status) && (MemDesc.Attributes & EFI_MEMORY_XP) != 0) {\r
+    gDS->SetMemorySpaceAttributes (\r
+           FfsBuffer,\r
+           EFI_PAGES_TO_SIZE (Pages),\r
+           MemDesc.Attributes & (~EFI_MEMORY_XP)\r
+           );\r
+  }\r
+\r
   ImageContext.ImageAddress = (PHYSICAL_ADDRESS)(UINTN)FfsBuffer;\r
   //\r
-  // Align buffer on section boundry\r
+  // Align buffer on section boundary\r
   //\r
   ImageContext.ImageAddress += ImageContext.SectionAlignment - 1;\r
-  ImageContext.ImageAddress &= ~((EFI_PHYSICAL_ADDRESS)(ImageContext.SectionAlignment - 1));\r
+  ImageContext.ImageAddress &= ~((EFI_PHYSICAL_ADDRESS)ImageContext.SectionAlignment - 1);\r
   //\r
   // Load the image to our new buffer\r
   //\r
@@ -407,6 +417,11 @@ BootScriptExecutorEntryPoint (
     return EFI_UNSUPPORTED;\r
   }\r
 \r
+  //\r
+  // Make sure AddressEncMask is contained to smallest supported address field.\r
+  //\r
+  mAddressEncMask = PcdGet64 (PcdPteMemoryEncryptionAddressOrMask) & PAGING_1G_ADDRESS_MASK_64;\r
+\r
   //\r
   // Test if the gEfiCallerIdGuid of this image is already installed. if not, the entry\r
   // point is loaded by DXE code which is the first time loaded. or else, it is already\r