UefiCpuPkg/ExceptionLib: Update RegisterCpuInterruptHandlerWorker()

Add parameter CpuExceptionData for RegisterCpuInterruptHandlerWorker().

Cc: Michael Kinney <michael.d.kinney@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Feng Tian <feng.tian@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff.fan@intel.com>
Reviewed-by: Feng Tian <feng.tian@intel.com>
diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/CpuExceptionCommon.h b/UefiCpuPkg/Library/CpuExceptionHandlerLib/CpuExceptionCommon.h
index 99be61f..f2c44f0 100644
--- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/CpuExceptionCommon.h
+++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/CpuExceptionCommon.h
@@ -152,10 +152,11 @@
 /**

   Registers a function to be called from the processor interrupt handler.

 

-  @param[in]  InterruptType     Defines which interrupt or exception to hook.

-  @param[in]  InterruptHandler  A pointer to a function of type EFI_CPU_INTERRUPT_HANDLER that is called

-                                when a processor interrupt occurs. If this parameter is NULL, then the handler

-                                will be uninstalled.

+  @param[in]  InterruptType        Defines which interrupt or exception to hook.

+  @param[in]  InterruptHandler     A pointer to a function of type EFI_CPU_INTERRUPT_HANDLER that is called

+                                   when a processor interrupt occurs. If this parameter is NULL, then the handler

+                                   will be uninstalled

+  @param[in] ExceptionHandlerData  Pointer to exception handler data.

 

   @retval EFI_SUCCESS           The handler for the processor interrupt was successfully installed or uninstalled.

   @retval EFI_ALREADY_STARTED   InterruptHandler is not NULL, and a handler for InterruptType was

@@ -168,7 +169,8 @@
 EFI_STATUS

 RegisterCpuInterruptHandlerWorker (

   IN EFI_EXCEPTION_TYPE            InterruptType,

-  IN EFI_CPU_INTERRUPT_HANDLER     InterruptHandler

+  IN EFI_CPU_INTERRUPT_HANDLER     InterruptHandler,

+  IN EXCEPTION_HANDLER_DATA        *ExceptionHandlerData

   );

 

 /**

diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeException.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeException.c
index cffb13a..5c4ee2a 100644
--- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeException.c
+++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeException.c
@@ -179,5 +179,5 @@
   IN EFI_CPU_INTERRUPT_HANDLER     InterruptHandler

   )

 {

-  return RegisterCpuInterruptHandlerWorker (InterruptType, InterruptHandler);

+  return RegisterCpuInterruptHandlerWorker (InterruptType, InterruptHandler, &mExceptionHandlerData);

 }

diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiDxeSmmCpuException.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiDxeSmmCpuException.c
index 4a3aad8..c738280 100644
--- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiDxeSmmCpuException.c
+++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiDxeSmmCpuException.c
@@ -262,10 +262,11 @@
 /**

   Registers a function to be called from the processor interrupt handler.

 

-  @param[in]  InterruptType     Defines which interrupt or exception to hook.

-  @param[in]  InterruptHandler  A pointer to a function of type EFI_CPU_INTERRUPT_HANDLER that is called

-                                when a processor interrupt occurs. If this parameter is NULL, then the handler

-                                will be uninstalled.

+  @param[in]  InterruptType        Defines which interrupt or exception to hook.

+  @param[in]  InterruptHandler     A pointer to a function of type EFI_CPU_INTERRUPT_HANDLER that is called

+                                   when a processor interrupt occurs. If this parameter is NULL, then the handler

+                                   will be uninstalled

+  @param[in] ExceptionHandlerData  Pointer to exception handler data.

 

   @retval EFI_SUCCESS           The handler for the processor interrupt was successfully installed or uninstalled.

   @retval EFI_ALREADY_STARTED   InterruptHandler is not NULL, and a handler for InterruptType was

@@ -278,23 +279,32 @@
 EFI_STATUS

 RegisterCpuInterruptHandlerWorker (

   IN EFI_EXCEPTION_TYPE            InterruptType,

-  IN EFI_CPU_INTERRUPT_HANDLER     InterruptHandler

+  IN EFI_CPU_INTERRUPT_HANDLER     InterruptHandler,

+  IN EXCEPTION_HANDLER_DATA        *ExceptionHandlerData

   )

 {

-  if (InterruptType < 0 || InterruptType >= (EFI_EXCEPTION_TYPE)mEnabledInterruptNum ||

-      mReservedVectors[InterruptType].Attribute == EFI_VECTOR_HANDOFF_DO_NOT_HOOK) {

+  UINTN                          EnabledInterruptNum;

+  RESERVED_VECTORS_DATA          *ReservedVectors;

+  EFI_CPU_INTERRUPT_HANDLER      *ExternalInterruptHandler;

+

+  EnabledInterruptNum      = ExceptionHandlerData->IdtEntryCount;

+  ReservedVectors          = ExceptionHandlerData->ReservedVectors;

+  ExternalInterruptHandler = ExceptionHandlerData->ExternalInterruptHandler;

+

+  if (InterruptType < 0 || InterruptType >= (EFI_EXCEPTION_TYPE)EnabledInterruptNum ||

+      ReservedVectors[InterruptType].Attribute == EFI_VECTOR_HANDOFF_DO_NOT_HOOK) {

     return EFI_UNSUPPORTED;

   }

 

-  if (InterruptHandler == NULL && mExternalInterruptHandler[InterruptType] == NULL) {

+  if (InterruptHandler == NULL && ExternalInterruptHandler[InterruptType] == NULL) {

     return EFI_INVALID_PARAMETER;

   }

 

-  if (InterruptHandler != NULL && mExternalInterruptHandler[InterruptType] != NULL) {

+  if (InterruptHandler != NULL && ExternalInterruptHandler[InterruptType] != NULL) {

     return EFI_ALREADY_STARTED;

   }

 

-  mExternalInterruptHandler[InterruptType] = InterruptHandler;

+  ExternalInterruptHandler[InterruptType] = InterruptHandler;

   return EFI_SUCCESS;

 }

 

diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmException.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmException.c
index b88305d..c3af4d4 100644
--- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmException.c
+++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmException.c
@@ -103,5 +103,5 @@
   IN EFI_CPU_INTERRUPT_HANDLER     InterruptHandler

   )

 {

-  return RegisterCpuInterruptHandlerWorker (InterruptType, InterruptHandler);

+  return RegisterCpuInterruptHandlerWorker (InterruptType, InterruptHandler, &mExceptionHandlerData);

 }
\ No newline at end of file