Data is transferred between S3 Suspend and S3 Resume as follows:
S3 Suspend (DXE):
(1) prepare boot script:
EFI_S3_SAVE_STATE_PROTOCOL.Write() [S3SaveStateDxe]
S3BootScriptLib [PiDxeS3BootScriptLib]
- opcodes & arguments are saved in NVS. ---------+
|
(2) any DXE driver issues a notification by installing |
EFI_DXE_SMM_READY_TO_LOCK_PROTOCOL: |
|
EFI_S3_SAVE_STATE_PROTOCOL [S3SaveStateDxe] |
S3BootScriptLib [PiDxeS3BootScriptLib] |
- closes script with special opcode <------------+
- script is available in non-volatile memory
via PcdS3BootScriptTablePrivateDataPtr --------------+
|
BootScriptExecutorDxe |
S3BootScriptLib [PiDxeS3BootScriptLib] |
- Knows about boot script location by synchronizing <--+
with the other library instance via
PcdS3BootScriptTablePrivateDataPtr.
- Copies relocated image of itself to
reserved memory. -----------------------------------+
- Saved image contains pointer to boot script. ------|--+
| |
(3) BdsLibBootViaBootOption() | |
EFI_ACPI_S3_SAVE_PROTOCOL [AcpiS3SaveDxe] | |
- saves ACPI S3 Context to SMRAM LockBox --------+ | |
(including FACS address -- FACS ACPI table | | |
contains OS waking vector) | | |
| | |
Runtime: | | |
| | |
(4) OS is booted, writes OS waking vector to FACS, | | |
suspends machine | | |
| | |
S3 Resume (PEI): | | |
| | |
(5) PlatformPei sets S3 Boot Mode based on CMOS | | |
| | |
(6) DXE core is skipped and EFI_PEI_S3_RESUME2 is called | | |
as last step of PEI | | |
| | |
(7) S3Resume2Pei retrieves from SMRAM LockBox: | | |
- ACPI S3 Context (path to FACS) <-------------------+ | |
----------------------|--|--+
- Boot Script Executor Image <-------------------------+ | |
| |
(8) BootScriptExecutorDxe | |
S3BootScriptLib [PiDxeS3BootScriptLib] | |
- executes boot script <--------------------------------+ |
|
(9) OS waking vector available from ACPI S3 Context / FACS <-----+
is called
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <[email protected]>
---
OvmfPkg/PlatformPei/Platform.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/OvmfPkg/PlatformPei/Platform.c b/OvmfPkg/PlatformPei/Platform.c
index 426ff45..23f9809 100644
--- a/OvmfPkg/PlatformPei/Platform.c
+++ b/OvmfPkg/PlatformPei/Platform.c
@@ -261,13 +261,16 @@ MiscInitialization (
VOID
BootModeInitialization (
)
{
- EFI_STATUS Status;
+ EFI_BOOT_MODE BootMode;
+ EFI_STATUS Status;
- Status = PeiServicesSetBootMode (BOOT_WITH_FULL_CONFIGURATION);
+ BootMode = (CmosRead8 (0xF) == 0xFE) ? BOOT_ON_S3_RESUME :
+ BOOT_WITH_FULL_CONFIGURATION;
+ Status = PeiServicesSetBootMode (BootMode);
ASSERT_EFI_ERROR (Status);
Status = PeiServicesInstallPpi (mPpiBootMode);
ASSERT_EFI_ERROR (Status);
}
--
1.8.3.1
------------------------------------------------------------------------------
Rapidly troubleshoot problems before they affect your business. Most IT
organizations don't have a clear picture of how application performance
affects their revenue. With AppDynamics, you get 100% visibility into your
Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
http://pubads.g.doubleclick.net/gampad/clk?id=84349351&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel