mReservedVectors is not set, we could add parameter ExceptionHandlerData for
ArchRestoreExceptionContext() that could use it instead of mReservedVectors.

Cc: Feng Tian <feng.t...@intel.com>
Cc: Jiewen Yao <jiewen....@intel.com>
Cc: Michael D Kinney <michael.d.kin...@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff....@intel.com>
---
 .../CpuExceptionHandlerLib/CpuExceptionCommon.h    | 11 +++++-----
 .../Ia32/ArchExceptionHandler.c                    | 21 +++++++++++-------
 .../CpuExceptionHandlerLib/PeiDxeSmmCpuException.c |  2 +-
 .../X64/ArchExceptionHandler.c                     | 25 +++++++++++++---------
 4 files changed, 35 insertions(+), 24 deletions(-)

diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/CpuExceptionCommon.h 
b/UefiCpuPkg/Library/CpuExceptionHandlerLib/CpuExceptionCommon.h
index dc5d941..f2e4692 100644
--- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/CpuExceptionCommon.h
+++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/CpuExceptionCommon.h
@@ -211,14 +211,15 @@ ArchSaveExceptionContext (
 /**
   Restore CPU exception context when handling EFI_VECTOR_HANDOFF_HOOK_AFTER 
case.
 
-  @param[in] ExceptionType  Exception type.
-  @param[in] SystemContext  Pointer to EFI_SYSTEM_CONTEXT.
-
+  @param[in] ExceptionType        Exception type.
+  @param[in] SystemContext        Pointer to EFI_SYSTEM_CONTEXT.
+  @param[in] ExceptionHandlerData Pointer to exception handler data.
 **/
 VOID
 ArchRestoreExceptionContext (
-  IN UINTN                ExceptionType,
-  IN EFI_SYSTEM_CONTEXT   SystemContext 
+  IN UINTN                        ExceptionType,
+  IN EFI_SYSTEM_CONTEXT           SystemContext,
+  IN EXCEPTION_HANDLER_DATA       *ExceptionHandlerData
   );
 
 /**
diff --git 
a/UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ArchExceptionHandler.c 
b/UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ArchExceptionHandler.c
index b96636b..7ab2438 100644
--- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ArchExceptionHandler.c
+++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ArchExceptionHandler.c
@@ -87,19 +87,24 @@ ArchSaveExceptionContext (
 /**
   Restore CPU exception context when handling EFI_VECTOR_HANDOFF_HOOK_AFTER 
case.
 
-  @param ExceptionType  Exception type.
-  @param SystemContext  Pointer to EFI_SYSTEM_CONTEXT.
+  @param[in] ExceptionType        Exception type.
+  @param[in] SystemContext        Pointer to EFI_SYSTEM_CONTEXT.
+  @param[in] ExceptionHandlerData Pointer to exception handler data.
 **/
 VOID
 ArchRestoreExceptionContext (
-  IN UINTN                ExceptionType,
-  IN EFI_SYSTEM_CONTEXT   SystemContext 
+  IN UINTN                        ExceptionType,
+  IN EFI_SYSTEM_CONTEXT           SystemContext,
+  IN EXCEPTION_HANDLER_DATA       *ExceptionHandlerData
   )
 {
-  SystemContext.SystemContextIa32->Eflags        = 
mReservedVectors[ExceptionType].OldFlags;
-  SystemContext.SystemContextIa32->Cs            = 
mReservedVectors[ExceptionType].OldCs;
-  SystemContext.SystemContextIa32->Eip           = 
mReservedVectors[ExceptionType].OldIp;
-  SystemContext.SystemContextIa32->ExceptionData = 
mReservedVectors[ExceptionType].ExceptionData;
+  RESERVED_VECTORS_DATA   *ReservedVectors;
+
+  ReservedVectors = ExceptionHandlerData->ReservedVectors;
+  SystemContext.SystemContextIa32->Eflags        = 
ReservedVectors[ExceptionType].OldFlags;
+  SystemContext.SystemContextIa32->Cs            = 
ReservedVectors[ExceptionType].OldCs;
+  SystemContext.SystemContextIa32->Eip           = 
ReservedVectors[ExceptionType].OldIp;
+  SystemContext.SystemContextIa32->ExceptionData = 
ReservedVectors[ExceptionType].ExceptionData;
 }
 
 /**
diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiDxeSmmCpuException.c 
b/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiDxeSmmCpuException.c
index 483a417..c0fc9a6 100644
--- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiDxeSmmCpuException.c
+++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiDxeSmmCpuException.c
@@ -68,7 +68,7 @@ CommonExceptionHandlerWorker (
         // Old IDT handler has been executed, then restore CPU exception 
content to
         // run new exception handler.
         //
-        ArchRestoreExceptionContext (ExceptionType, SystemContext);
+        ArchRestoreExceptionContext (ExceptionType, SystemContext, 
ExceptionHandlerData);
         //
         // Rlease spin lock for ApicId
         //
diff --git 
a/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/ArchExceptionHandler.c 
b/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/ArchExceptionHandler.c
index f84b1a8..7495b14 100644
--- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/ArchExceptionHandler.c
+++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/ArchExceptionHandler.c
@@ -90,21 +90,26 @@ ArchSaveExceptionContext (
 /**
   Restore CPU exception context when handling EFI_VECTOR_HANDOFF_HOOK_AFTER 
case.
 
-  @param ExceptionType  Exception type.
-  @param SystemContext  Pointer to EFI_SYSTEM_CONTEXT.
+  @param[in] ExceptionType        Exception type.
+  @param[in] SystemContext        Pointer to EFI_SYSTEM_CONTEXT.
+  @param[in] ExceptionHandlerData Pointer to exception handler data.
 **/
 VOID
 ArchRestoreExceptionContext (
-  IN UINTN                ExceptionType,
-  IN EFI_SYSTEM_CONTEXT   SystemContext 
+  IN UINTN                        ExceptionType,
+  IN EFI_SYSTEM_CONTEXT           SystemContext,
+  IN EXCEPTION_HANDLER_DATA       *ExceptionHandlerData
   )
 {
-  SystemContext.SystemContextX64->Ss            = 
mReservedVectors[ExceptionType].OldSs;
-  SystemContext.SystemContextX64->Rsp           = 
mReservedVectors[ExceptionType].OldSp;
-  SystemContext.SystemContextX64->Rflags        = 
mReservedVectors[ExceptionType].OldFlags;
-  SystemContext.SystemContextX64->Cs            = 
mReservedVectors[ExceptionType].OldCs;
-  SystemContext.SystemContextX64->Rip           = 
mReservedVectors[ExceptionType].OldIp;
-  SystemContext.SystemContextX64->ExceptionData = 
mReservedVectors[ExceptionType].ExceptionData;
+  RESERVED_VECTORS_DATA   *ReservedVectors;
+
+  ReservedVectors = ExceptionHandlerData->ReservedVectors;
+  SystemContext.SystemContextX64->Ss            = 
ReservedVectors[ExceptionType].OldSs;
+  SystemContext.SystemContextX64->Rsp           = 
ReservedVectors[ExceptionType].OldSp;
+  SystemContext.SystemContextX64->Rflags        = 
ReservedVectors[ExceptionType].OldFlags;
+  SystemContext.SystemContextX64->Cs            = 
ReservedVectors[ExceptionType].OldCs;
+  SystemContext.SystemContextX64->Rip           = 
ReservedVectors[ExceptionType].OldIp;
+  SystemContext.SystemContextX64->ExceptionData = 
ReservedVectors[ExceptionType].ExceptionData;
 }
 
 /**
-- 
2.9.3.windows.2

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to