public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Ni, Ray" <ray.ni@intel.com>
To: devel@edk2.groups.io
Cc: Andrew Fish <afish@apple.com>, Zhiguang Liu <zhiguang.liu@intel.com>
Subject: [PATCH 3/3] EmulatorPkg/WinHost: Add Reset2 PPI
Date: Sat, 12 Nov 2022 12:00:42 +0800	[thread overview]
Message-ID: <20221112040042.741-4-ray.ni@intel.com> (raw)
In-Reply-To: <20221112040042.741-1-ray.ni@intel.com>

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>
Cc: Zhiguang Liu <zhiguang.liu@intel.com>
---
 EmulatorPkg/Win/Host/WinHost.c   | 75 ++++++++++++++++++++++++++++----
 EmulatorPkg/Win/Host/WinHost.h   |  3 +-
 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..32b6922307 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, 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
-- 
2.37.2.windows.2


  parent reply	other threads:[~2022-11-12  4:01 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-12  4:00 [PATCH 0/3] Add reset support in Emulator/WinHost PEI Ni, Ray
2022-11-12  4:00 ` [PATCH 1/3] EmulatorPkg/WinHost: pre-allocate "physical" RAM Ni, Ray
2022-11-12  4:00 ` [PATCH 2/3] EmulatorPkg/WinHost: XIP for SEC and PEI_CORE Ni, Ray
2022-11-12  4:00 ` Ni, Ray [this message]
2022-11-18  6:31 ` [edk2-devel] [PATCH 0/3] Add reset support in Emulator/WinHost PEI Zhiguang Liu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20221112040042.741-4-ray.ni@intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox