diff options
author | Ni, Ray <ray.ni@intel.com> | 2022-11-12 12:00:42 +0800 |
---|---|---|
committer | mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> | 2022-12-05 05:35:41 +0000 |
commit | 7bee2498910a9034faaf90802c49188afb7582dc (patch) | |
tree | ad1f01453da5ed12d8dc68d725538264c6f1e541 | |
parent | a121165e35b50a8bfc1253c9be156c1c123ff688 (diff) | |
download | edk2-7bee2498910a9034faaf90802c49188afb7582dc.tar.gz edk2-7bee2498910a9034faaf90802c49188afb7582dc.tar.bz2 edk2-7bee2498910a9034faaf90802c49188afb7582dc.zip |
EmulatorPkg/WinHost: Add Reset2 PPI
When shutdown is requested, WinHost exits.
Otherwise, WinHost re-runs from SEC.
Tested no extra memory consumption with multiple resets in PEI.
Signed-off-by: Ray Ni <ray.ni@intel.com>
Cc: Andrew Fish <afish@apple.com>
Reviewed-by: Zhiguang Liu <zhiguang.liu@intel.com>
-rw-r--r-- | EmulatorPkg/Win/Host/WinHost.c | 75 | ||||
-rw-r--r-- | EmulatorPkg/Win/Host/WinHost.h | 3 | ||||
-rw-r--r-- | EmulatorPkg/Win/Host/WinHost.inf | 3 |
3 files changed, 71 insertions, 10 deletions
diff --git a/EmulatorPkg/Win/Host/WinHost.c b/EmulatorPkg/Win/Host/WinHost.c index 9b10290ff3..096292f95a 100644 --- a/EmulatorPkg/Win/Host/WinHost.c +++ b/EmulatorPkg/Win/Host/WinHost.c @@ -56,6 +56,14 @@ NT_FD_INFO *gFdInfo; UINTN gSystemMemoryCount = 0;
NT_SYSTEM_MEMORY *gSystemMemory;
+BASE_LIBRARY_JUMP_BUFFER mResetJumpBuffer;
+CHAR8 *mResetTypeStr[] = {
+ "EfiResetCold",
+ "EfiResetWarm",
+ "EfiResetShutdown",
+ "EfiResetPlatformSpecific"
+};
+
/*++
Routine Description:
@@ -196,6 +204,45 @@ SecPrint ( );
}
+/**
+ Resets the entire platform.
+
+ @param[in] ResetType The type of reset to perform.
+ @param[in] ResetStatus The status code for the reset.
+ @param[in] DataSize The size, in bytes, of ResetData.
+ @param[in] ResetData For a ResetType of EfiResetCold, EfiResetWarm, or EfiResetShutdown
+ the data buffer starts with a Null-terminated string, optionally
+ followed by additional binary data. The string is a description
+ that the caller may use to further indicate the reason for the
+ system reset.
+
+**/
+VOID
+EFIAPI
+WinReset (
+ IN EFI_RESET_TYPE ResetType,
+ IN EFI_STATUS ResetStatus,
+ IN UINTN DataSize,
+ IN VOID *ResetData OPTIONAL
+ )
+{
+ ASSERT (ResetType <= EfiResetPlatformSpecific);
+ SecPrint (" Emu ResetSystem is called: ResetType = %s\n", mResetTypeStr[ResetType]);
+
+ if (ResetType == EfiResetShutdown) {
+ exit (0);
+ } else {
+ //
+ // Jump back to SetJump with jump code = ResetType + 1
+ //
+ LongJump (&mResetJumpBuffer, ResetType + 1);
+ }
+}
+
+EFI_PEI_RESET2_PPI mEmuReset2Ppi = {
+ WinReset
+};
+
/*++
Routine Description:
@@ -388,6 +435,7 @@ Returns: UINTN ProcessAffinityMask;
UINTN SystemAffinityMask;
INT32 LowBit;
+ UINTN ResetJumpCode;
//
// Enable the privilege so that RTC driver can successfully run SetTime()
@@ -430,6 +478,7 @@ Returns: // PPIs pased into PEI_CORE
//
AddThunkPpi (EFI_PEI_PPI_DESCRIPTOR_PPI, &gEmuThunkPpiGuid, &mSecEmuThunkPpi);
+ AddThunkPpi (EFI_PEI_PPI_DESCRIPTOR_PPI, &gEfiPeiReset2PpiGuid, &mEmuReset2Ppi);
//
// Emulator Bus Driver Thunks
@@ -500,14 +549,6 @@ Returns: exit (1);
}
- SetMem32 (TemporaryRam, TemporaryRamSize, PcdGet32 (PcdInitValueInTempStack));
-
- SecPrint (
- " OS Emulator passing in %u KB of temp RAM at 0x%08lx to SEC\n\r",
- TemporaryRamSize / SIZE_1KB,
- TemporaryRam
- );
-
//
// If enabled use the magic page to communicate between modules
// This replaces the PI PeiServicesTable pointer mechanism that
@@ -591,6 +632,24 @@ Returns: SecPrint ("\n\r");
}
+ ResetJumpCode = SetJump (&mResetJumpBuffer);
+
+ //
+ // Do not clear memory content for warm reset.
+ //
+ if (ResetJumpCode != EfiResetWarm + 1) {
+ SecPrint (" OS Emulator clearing temp RAM and physical RAM (to be discovered later)......\n\r");
+ SetMem32 (TemporaryRam, TemporaryRamSize, PcdGet32 (PcdInitValueInTempStack));
+ for (Index = 0; Index < gSystemMemoryCount; Index++) {
+ SetMem32 ((VOID *)(UINTN)gSystemMemory[Index].Memory, (UINTN)gSystemMemory[Index].Size, PcdGet32 (PcdInitValueInTempStack));
+ }
+ }
+
+ SecPrint (
+ " OS Emulator passing in %u KB of temp RAM at 0x%08lx to SEC\n\r",
+ TemporaryRamSize / SIZE_1KB,
+ TemporaryRam
+ );
//
// Hand off to SEC Core
//
diff --git a/EmulatorPkg/Win/Host/WinHost.h b/EmulatorPkg/Win/Host/WinHost.h index 49d42d1ad8..a9a21007e3 100644 --- a/EmulatorPkg/Win/Host/WinHost.h +++ b/EmulatorPkg/Win/Host/WinHost.h @@ -1,6 +1,6 @@ /**@file
-Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2006 - 2022, Intel Corporation. All rights reserved.<BR>
(C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
@@ -26,6 +26,7 @@ Abstract: #include <Guid/FileSystemInfo.h>
#include <Guid/FileSystemVolumeLabelInfo.h>
#include <Ppi/EmuThunk.h>
+#include <Ppi/Reset2.h>
#include <Protocol/EmuThunk.h>
#include <Protocol/SimpleFileSystem.h>
diff --git a/EmulatorPkg/Win/Host/WinHost.inf b/EmulatorPkg/Win/Host/WinHost.inf index 2030ac0847..b61901fae2 100644 --- a/EmulatorPkg/Win/Host/WinHost.inf +++ b/EmulatorPkg/Win/Host/WinHost.inf @@ -2,7 +2,7 @@ # Entry Point of Win Emulator
#
# Main executable file of Win Emulator that loads Sec core after initialization finished.
-# Copyright (c) 2008 - 2019, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2008 - 2022, Intel Corporation. All rights reserved.<BR>
# Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
# (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
#
@@ -58,6 +58,7 @@ [Ppis]
gEmuThunkPpiGuid
+ gEfiPeiReset2PpiGuid
[Protocols]
gEmuIoThunkProtocolGuid
|