#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
// 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
//\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
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
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