mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-26 07:04:28 +02:00
UefiCpuPkg/S3Resume2Pei: Send S3 resume finished event to SmmCore.
Driver will send S3 resume finished event to SmmCore through communicate buffer after it signals EndOfPei event. V2 Changes: 1. Change structures name to avoid they start with EFI_. 2. Base on DXE phase bits to provide communication buffer, current implement check both PEI and DXE phase. V3 Changes: 1. Change structure name for better understanding. 2. Enhance communication buffer calculate logic to more accurate. Cc: Ruiyu Ni <ruiyu.ni@intel.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Eric Dong <eric.dong@intel.com> Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com> Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
This commit is contained in:
parent
59f0ef95e0
commit
18b13fabfa
@ -28,6 +28,9 @@
|
|||||||
#include <Ppi/SmmAccess.h>
|
#include <Ppi/SmmAccess.h>
|
||||||
#include <Ppi/PostBootScriptTable.h>
|
#include <Ppi/PostBootScriptTable.h>
|
||||||
#include <Ppi/EndOfPeiPhase.h>
|
#include <Ppi/EndOfPeiPhase.h>
|
||||||
|
#include <Ppi/SmmCommunication.h>
|
||||||
|
|
||||||
|
#include <Protocol/SmmEndOfS3Resume.h>
|
||||||
|
|
||||||
#include <Library/DebugLib.h>
|
#include <Library/DebugLib.h>
|
||||||
#include <Library/BaseLib.h>
|
#include <Library/BaseLib.h>
|
||||||
@ -151,6 +154,22 @@ typedef union {
|
|||||||
UINT64 Uint64;
|
UINT64 Uint64;
|
||||||
} PAGE_TABLE_1G_ENTRY;
|
} PAGE_TABLE_1G_ENTRY;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Define two type of smm communicate headers.
|
||||||
|
// One for 32 bits PEI + 64 bits DXE, the other for 32 bits PEI + 32 bits DXE case.
|
||||||
|
//
|
||||||
|
typedef struct {
|
||||||
|
EFI_GUID HeaderGuid;
|
||||||
|
UINT32 MessageLength;
|
||||||
|
UINT8 Data[1];
|
||||||
|
} SMM_COMMUNICATE_HEADER_32;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_GUID HeaderGuid;
|
||||||
|
UINT64 MessageLength;
|
||||||
|
UINT8 Data[1];
|
||||||
|
} SMM_COMMUNICATE_HEADER_64;
|
||||||
|
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -429,6 +448,68 @@ IsLongModeWakingVector (
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Send EndOfS3Resume event to SmmCore through communication buffer way.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Return send the event success.
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
SignalEndOfS3Resume (
|
||||||
|
VOID
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_PEI_SMM_COMMUNICATION_PPI *SmmCommunicationPpi;
|
||||||
|
UINTN CommSize;
|
||||||
|
SMM_COMMUNICATE_HEADER_32 Header32;
|
||||||
|
SMM_COMMUNICATE_HEADER_64 Header64;
|
||||||
|
VOID *CommBuffer;
|
||||||
|
|
||||||
|
DEBUG ((EFI_D_INFO, "SignalEndOfS3Resume - Enter\n"));
|
||||||
|
|
||||||
|
//
|
||||||
|
// This buffer consumed in DXE phase, so base on DXE mode to prepare communicate buffer.
|
||||||
|
// Detect whether DXE is 64 bits mode.
|
||||||
|
// if (sizeof(UINTN) == sizeof(UINT64), PEI already 64 bits, assume DXE also 64 bits.
|
||||||
|
// or (FeaturePcdGet (PcdDxeIplSwitchToLongMode)), Dxe will switch to 64 bits.
|
||||||
|
//
|
||||||
|
if ((sizeof(UINTN) == sizeof(UINT64)) || (FeaturePcdGet (PcdDxeIplSwitchToLongMode))) {
|
||||||
|
CommBuffer = &Header64;
|
||||||
|
Header64.MessageLength = 0;
|
||||||
|
CommSize = OFFSET_OF (SMM_COMMUNICATE_HEADER_64, Data);
|
||||||
|
} else {
|
||||||
|
CommBuffer = &Header32;
|
||||||
|
Header32.MessageLength = 0;
|
||||||
|
CommSize = OFFSET_OF (SMM_COMMUNICATE_HEADER_32, Data);
|
||||||
|
}
|
||||||
|
CopyGuid (CommBuffer, &gEdkiiSmmEndOfS3ResumeProtocolGuid);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Get needed resource
|
||||||
|
//
|
||||||
|
Status = PeiServicesLocatePpi (
|
||||||
|
&gEfiPeiSmmCommunicationPpiGuid,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
(VOID **)&SmmCommunicationPpi
|
||||||
|
);
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Send command
|
||||||
|
//
|
||||||
|
Status = SmmCommunicationPpi->Communicate (
|
||||||
|
SmmCommunicationPpi,
|
||||||
|
(VOID *)CommBuffer,
|
||||||
|
&CommSize
|
||||||
|
);
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
|
DEBUG ((EFI_D_INFO, "SignalEndOfS3Resume - Exit (%r)\n", Status));
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Jump to OS waking vector.
|
Jump to OS waking vector.
|
||||||
The function will install boot script done PPI, report S3 resume status code, and then jump to OS waking vector.
|
The function will install boot script done PPI, report S3 resume status code, and then jump to OS waking vector.
|
||||||
@ -503,6 +584,12 @@ S3ResumeBootOs (
|
|||||||
Status = PeiServicesInstallPpi (&mPpiListEndOfPeiTable);
|
Status = PeiServicesInstallPpi (&mPpiListEndOfPeiTable);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Signal EndOfS3Resume event.
|
||||||
|
//
|
||||||
|
Status = SignalEndOfS3Resume ();
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
//
|
//
|
||||||
// report status code on S3 resume
|
// report status code on S3 resume
|
||||||
//
|
//
|
||||||
|
@ -85,6 +85,10 @@
|
|||||||
gPeiSmmAccessPpiGuid ## SOMETIMES_CONSUMES
|
gPeiSmmAccessPpiGuid ## SOMETIMES_CONSUMES
|
||||||
gPeiPostScriptTablePpiGuid ## SOMETIMES_PRODUCES
|
gPeiPostScriptTablePpiGuid ## SOMETIMES_PRODUCES
|
||||||
gEfiEndOfPeiSignalPpiGuid ## SOMETIMES_PRODUCES
|
gEfiEndOfPeiSignalPpiGuid ## SOMETIMES_PRODUCES
|
||||||
|
gEfiPeiSmmCommunicationPpiGuid ## SOMETIMES_CONSUMES
|
||||||
|
|
||||||
|
[Protocols]
|
||||||
|
gEdkiiSmmEndOfS3ResumeProtocolGuid ## SOMETIMES_CONSUMES
|
||||||
|
|
||||||
[FeaturePcd]
|
[FeaturePcd]
|
||||||
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode ## CONSUMES
|
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode ## CONSUMES
|
||||||
|
Loading…
x
Reference in New Issue
Block a user