]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/ScriptExecute.c
Fix ECC issue
[mirror_edk2.git] / MdeModulePkg / Universal / Acpi / BootScriptExecutorDxe / ScriptExecute.c
index 50165126c858b2f60ec015d6fc8da1d7c0082cae..3bddda131681c9f8c550bfb14601d44f1f5c1e25 100644 (file)
@@ -19,7 +19,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include "ScriptExecute.h"\r
 \r
 EFI_GUID              mBootScriptExecutorImageGuid = {\r
-  0x9a8d3433, 0x9fe8, 0x42b6, 0x87, 0xb, 0x1e, 0x31, 0xc8, 0x4e, 0xbe, 0x3b\r
+  0x9a8d3433, 0x9fe8, 0x42b6, { 0x87, 0xb, 0x1e, 0x31, 0xc8, 0x4e, 0xbe, 0x3b }\r
 };\r
 \r
 /**\r
@@ -68,9 +68,12 @@ S3BootScriptExecutorEntryFunction (
   // for that parameter.\r
   //\r
   Status = S3BootScriptExecute ();\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
+\r
+  //\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
 \r
   AsmWbinvd ();\r
 \r
@@ -79,13 +82,6 @@ S3BootScriptExecutorEntryFunction (
   //\r
   Facs = (EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *) ((UINTN) (AcpiS3Context->AcpiFacsTable));\r
 \r
-  if ((Facs == NULL) ||\r
-      (Facs->Signature != EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) ||\r
-      ((Facs->FirmwareWakingVector == 0) && (Facs->XFirmwareWakingVector == 0)) ) {\r
-    CpuDeadLoop();\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
   //\r
   // We need turn back to S3Resume - install boot script done ppi and report status code on S3resume.\r
   //\r
@@ -97,12 +93,16 @@ S3BootScriptExecutorEntryFunction (
       DEBUG ((EFI_D_ERROR, "Call AsmDisablePaging64() to return to S3 Resume in PEI Phase\n"));\r
       PeiS3ResumeState->AsmTransferControl = (EFI_PHYSICAL_ADDRESS)(UINTN)AsmTransferControl32;\r
 \r
-      //\r
-      // more step needed - because relative address is handled differently between X64 and IA32.\r
-      //\r
-      AsmTransferControl16Address = (UINTN)AsmTransferControl16;\r
-      AsmFixAddress16 = (UINT32)AsmTransferControl16Address;\r
-      AsmJmpAddr32 = (UINT32)((Facs->FirmwareWakingVector & 0xF) | ((Facs->FirmwareWakingVector & 0xFFFF0) << 12));\r
+      if ((Facs != NULL) &&\r
+          (Facs->Signature == EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) &&\r
+          (Facs->FirmwareWakingVector != 0) ) {\r
+        //\r
+        // more step needed - because relative address is handled differently between X64 and IA32.\r
+        //\r
+        AsmTransferControl16Address = (UINTN)AsmTransferControl16;\r
+        AsmFixAddress16 = (UINT32)AsmTransferControl16Address;\r
+        AsmJmpAddr32 = (UINT32)((Facs->FirmwareWakingVector & 0xF) | ((Facs->FirmwareWakingVector & 0xFFFF0) << 12));\r
+      }\r
 \r
       AsmDisablePaging64 (\r
         PeiS3ResumeState->ReturnCs,\r
@@ -132,7 +132,10 @@ 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
   if (Facs->XFirmwareWakingVector != 0) {\r
     //\r
     // Switch to native waking vector\r