]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/DebugSupportDxe/Ia32/PlDebugSupport.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdeModulePkg / Universal / DebugSupportDxe / Ia32 / PlDebugSupport.c
index 24e2cd070003f5fbe7bb89e9a688d242fecde16d..40fe74d8c236a0e9d7074d596983602cb73d42a5 100644 (file)
@@ -1,14 +1,8 @@
 /** @file\r
-  Generic debug support functions for IA32/x64.\r
+  IA32/x64 generic functions to support Debug Support protocol.\r
 \r
-Copyright (c) 2006 - 2008, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -17,8 +11,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 //\r
 // This the global main table to keep track of the interrupts\r
 //\r
-IDT_ENTRY                 *IdtEntryTable  = NULL;\r
-IA32_IDT_GATE_DESCRIPTOR  NullDesc        = {0};\r
+IDT_ENTRY  *IdtEntryTable = NULL;\r
 \r
 /**\r
   Read IDT Gate Descriptor from IDT Table.\r
@@ -33,13 +26,13 @@ ReadIdtGateDescriptor (
   OUT IA32_IDT_GATE_DESCRIPTOR  *IdtGateDescriptor\r
   )\r
 {\r
IA32_DESCRIPTOR            IdtrValue;\r
IA32_IDT_GATE_DESCRIPTOR   *IdtTable;\r
 IA32_DESCRIPTOR           IdtrValue;\r
 IA32_IDT_GATE_DESCRIPTOR  *IdtTable;\r
 \r
- AsmReadIdtr (&IdtrValue);\r
IdtTable = (IA32_IDT_GATE_DESCRIPTOR *) IdtrValue.Base;\r
 AsmReadIdtr (&IdtrValue);\r
 IdtTable = (IA32_IDT_GATE_DESCRIPTOR *)IdtrValue.Base;\r
 \r
CopyMem ((VOID *) IdtGateDescriptor, (VOID *) &(IdtTable)[Vector], sizeof (IA32_IDT_GATE_DESCRIPTOR));\r
 CopyMem ((VOID *)IdtGateDescriptor, (VOID *)&(IdtTable)[Vector], sizeof (IA32_IDT_GATE_DESCRIPTOR));\r
 }\r
 \r
 /**\r
@@ -55,13 +48,13 @@ WriteIdtGateDescriptor (
   IA32_IDT_GATE_DESCRIPTOR  *IdtGateDescriptor\r
   )\r
 {\r
IA32_DESCRIPTOR            IdtrValue;\r
IA32_IDT_GATE_DESCRIPTOR   *IdtTable;\r
 IA32_DESCRIPTOR           IdtrValue;\r
 IA32_IDT_GATE_DESCRIPTOR  *IdtTable;\r
 \r
- AsmReadIdtr (&IdtrValue);\r
IdtTable = (IA32_IDT_GATE_DESCRIPTOR *) IdtrValue.Base;\r
 AsmReadIdtr (&IdtrValue);\r
 IdtTable = (IA32_IDT_GATE_DESCRIPTOR *)IdtrValue.Base;\r
 \r
CopyMem ((VOID *) &(IdtTable)[Vector], (VOID *) IdtGateDescriptor, sizeof (IA32_IDT_GATE_DESCRIPTOR));\r
 CopyMem ((VOID *)&(IdtTable)[Vector], (VOID *)IdtGateDescriptor, sizeof (IA32_IDT_GATE_DESCRIPTOR));\r
 }\r
 \r
 /**\r
@@ -78,24 +71,40 @@ WriteIdtGateDescriptor (
 **/\r
 VOID\r
 HookEntry (\r
-  IN EFI_EXCEPTION_TYPE            ExceptionType,\r
-  IN VOID                         (*NewCallback) ()\r
+  IN EFI_EXCEPTION_TYPE  ExceptionType,\r
+  IN CALLBACK_FUNC       NewCallback\r
   )\r
 {\r
-  BOOLEAN     OldIntFlagState;\r
+  BOOLEAN  OldIntFlagState;\r
+\r
+  CreateEntryStub (ExceptionType, (VOID **)&IdtEntryTable[ExceptionType].StubEntry);\r
 \r
-  CreateEntryStub (ExceptionType, (VOID **) &IdtEntryTable[ExceptionType].StubEntry);\r
-                          \r
   //\r
   // Disables CPU interrupts and returns the previous interrupt state\r
   //\r
   OldIntFlagState = SaveAndDisableInterrupts ();\r
 \r
+  //\r
+  // gets IDT Gate descriptor by index\r
+  //\r
   ReadIdtGateDescriptor (ExceptionType, &(IdtEntryTable[ExceptionType].OrigDesc));\r
-  IdtEntryTable[ExceptionType].OrigVector = (DEBUG_PROC) GetInterruptHandleFromIdt (&(IdtEntryTable[ExceptionType].OrigDesc));\r
+  //\r
+  // stores orignal interrupt handle\r
+  //\r
+  IdtEntryTable[ExceptionType].OrigVector = (DEBUG_PROC)GetInterruptHandleFromIdt (&(IdtEntryTable[ExceptionType].OrigDesc));\r
 \r
+  //\r
+  // encodes new IDT Gate descriptor by stub entry\r
+  //\r
   Vect2Desc (&IdtEntryTable[ExceptionType].NewDesc, IdtEntryTable[ExceptionType].StubEntry);\r
+  //\r
+  // stores NewCallback\r
+  //\r
   IdtEntryTable[ExceptionType].RegisteredCallback = NewCallback;\r
+\r
+  //\r
+  // writes back new IDT Gate descriptor\r
+  //\r
   WriteIdtGateDescriptor (ExceptionType, &(IdtEntryTable[ExceptionType].NewDesc));\r
 \r
   //\r
@@ -103,7 +112,7 @@ HookEntry (
   //\r
   SetInterruptState (OldIntFlagState);\r
 \r
-  return ;\r
+  return;\r
 }\r
 \r
 /**\r
@@ -114,10 +123,10 @@ HookEntry (
 **/\r
 VOID\r
 UnhookEntry (\r
-  IN EFI_EXCEPTION_TYPE           ExceptionType\r
+  IN EFI_EXCEPTION_TYPE  ExceptionType\r
   )\r
 {\r
-  BOOLEAN     OldIntFlagState;\r
+  BOOLEAN  OldIntFlagState;\r
 \r
   //\r
   // Disables CPU interrupts and returns the previous interrupt state\r
@@ -134,27 +143,27 @@ UnhookEntry (
   //\r
   SetInterruptState (OldIntFlagState);\r
 \r
-  return ;\r
+  return;\r
 }\r
 \r
 /**\r
   Returns the maximum value that may be used for the ProcessorIndex parameter in\r
-  RegisterPeriodicCallback() and RegisterExceptionCallback().                   \r
-    \r
+  RegisterPeriodicCallback() and RegisterExceptionCallback().\r
+\r
   Hard coded to support only 1 processor for now.\r
 \r
   @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.\r
   @param  MaxProcessorIndex     Pointer to a caller-allocated UINTN in which the maximum supported\r
-                                processor index is returned. Always 0 returned.                                     \r
-                                \r
+                                processor index is returned. Always 0 returned.\r
+\r
   @retval EFI_SUCCESS           Always returned with **MaxProcessorIndex set to 0.\r
 \r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
 GetMaximumProcessorIndex (\r
-  IN EFI_DEBUG_SUPPORT_PROTOCOL       *This,\r
-  OUT UINTN                           *MaxProcessorIndex\r
+  IN EFI_DEBUG_SUPPORT_PROTOCOL  *This,\r
+  OUT UINTN                      *MaxProcessorIndex\r
   )\r
 {\r
   *MaxProcessorIndex = 0;\r
@@ -163,24 +172,24 @@ GetMaximumProcessorIndex (
 \r
 /**\r
   Registers a function to be called back periodically in interrupt context.\r
-    \r
+\r
   @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.\r
   @param  ProcessorIndex        Specifies which processor the callback function applies to.\r
   @param  PeriodicCallback      A pointer to a function of type PERIODIC_CALLBACK that is the main\r
                                 periodic entry point of the debug agent.\r
-                                \r
-  @retval EFI_SUCCESS           The function completed successfully.  \r
+\r
+  @retval EFI_SUCCESS           The function completed successfully.\r
   @retval EFI_ALREADY_STARTED   Non-NULL PeriodicCallback parameter when a callback\r
-                                function was previously registered.                \r
-  @retval EFI_OUT_OF_RESOURCES  System has insufficient memory resources to register new callback                               \r
-                                function. \r
+                                function was previously registered.\r
+  @retval EFI_OUT_OF_RESOURCES  System has insufficient memory resources to register new callback\r
+                                function.\r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
 RegisterPeriodicCallback (\r
-  IN EFI_DEBUG_SUPPORT_PROTOCOL *This,\r
-  IN UINTN                      ProcessorIndex,\r
-  IN EFI_PERIODIC_CALLBACK      PeriodicCallback\r
+  IN EFI_DEBUG_SUPPORT_PROTOCOL  *This,\r
+  IN UINTN                       ProcessorIndex,\r
+  IN EFI_PERIODIC_CALLBACK       PeriodicCallback\r
   )\r
 {\r
   return ManageIdtEntryTable (PeriodicCallback, SYSTEM_TIMER_VECTOR);\r
@@ -190,26 +199,26 @@ RegisterPeriodicCallback (
   Registers a function to be called when a given processor exception occurs.\r
 \r
   This code executes in boot services context.\r
-    \r
+\r
   @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.\r
   @param  ProcessorIndex        Specifies which processor the callback function applies to.\r
   @param  ExceptionCallback     A pointer to a function of type EXCEPTION_CALLBACK that is called\r
-                                when the processor exception specified by ExceptionType occurs.  \r
-  @param  ExceptionType         Specifies which processor exception to hook.                       \r
-                                \r
-  @retval EFI_SUCCESS           The function completed successfully.  \r
+                                when the processor exception specified by ExceptionType occurs.\r
+  @param  ExceptionType         Specifies which processor exception to hook.\r
+\r
+  @retval EFI_SUCCESS           The function completed successfully.\r
   @retval EFI_ALREADY_STARTED   Non-NULL PeriodicCallback parameter when a callback\r
-                                function was previously registered.                \r
-  @retval EFI_OUT_OF_RESOURCES  System has insufficient memory resources to register new callback                               \r
+                                function was previously registered.\r
+  @retval EFI_OUT_OF_RESOURCES  System has insufficient memory resources to register new callback\r
                                 function.\r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
 RegisterExceptionCallback (\r
-  IN EFI_DEBUG_SUPPORT_PROTOCOL *This,\r
-  IN UINTN                      ProcessorIndex,\r
-  IN EFI_EXCEPTION_CALLBACK     ExceptionCallback,\r
-  IN EFI_EXCEPTION_TYPE         ExceptionType\r
+  IN EFI_DEBUG_SUPPORT_PROTOCOL  *This,\r
+  IN UINTN                       ProcessorIndex,\r
+  IN EFI_EXCEPTION_CALLBACK      ExceptionCallback,\r
+  IN EFI_EXCEPTION_TYPE          ExceptionType\r
   )\r
 {\r
   return ManageIdtEntryTable (ExceptionCallback, ExceptionType);\r
@@ -217,24 +226,24 @@ RegisterExceptionCallback (
 \r
 /**\r
   Invalidates processor instruction cache for a memory range. Subsequent execution in this range\r
-  causes a fresh memory fetch to retrieve code to be executed.                                  \r
-    \r
+  causes a fresh memory fetch to retrieve code to be executed.\r
+\r
   @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.\r
   @param  ProcessorIndex        Specifies which processor's instruction cache is to be invalidated.\r
-  @param  Start                 Specifies the physical base of the memory range to be invalidated.                                \r
+  @param  Start                 Specifies the physical base of the memory range to be invalidated.\r
   @param  Length                Specifies the minimum number of bytes in the processor's instruction\r
-                                cache to invalidate.                                                 \r
-                                \r
+                                cache to invalidate.\r
+\r
   @retval EFI_SUCCESS           Always returned.\r
 \r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
 InvalidateInstructionCache (\r
-  IN EFI_DEBUG_SUPPORT_PROTOCOL       *This,\r
-  IN UINTN                            ProcessorIndex,\r
-  IN VOID                             *Start,\r
-  IN UINT64                           Length\r
+  IN EFI_DEBUG_SUPPORT_PROTOCOL  *This,\r
+  IN UINTN                       ProcessorIndex,\r
+  IN VOID                        *Start,\r
+  IN UINT64                      Length\r
   )\r
 {\r
   AsmWbinvd ();\r
@@ -245,6 +254,7 @@ InvalidateInstructionCache (
   Common piece of code that invokes the registered handlers.\r
 \r
   This code executes in exception context so no efi calls are allowed.\r
+  This code is called from assembly file.\r
 \r
   @param  ExceptionType     Exception type\r
   @param  ContextRecord     System context\r
@@ -252,8 +262,8 @@ InvalidateInstructionCache (
 **/\r
 VOID\r
 InterruptDistrubutionHub (\r
-  EFI_EXCEPTION_TYPE      ExceptionType,\r
-  EFI_SYSTEM_CONTEXT_IA32 *ContextRecord\r
+  EFI_EXCEPTION_TYPE       ExceptionType,\r
+  EFI_SYSTEM_CONTEXT_IA32  *ContextRecord\r
   )\r
 {\r
   if (IdtEntryTable[ExceptionType].RegisteredCallback != NULL) {\r
@@ -279,7 +289,7 @@ InterruptDistrubutionHub (
 EFI_STATUS\r
 EFIAPI\r
 PlUnloadDebugSupportDriver (\r
-  IN EFI_HANDLE ImageHandle\r
+  IN EFI_HANDLE  ImageHandle\r
   )\r
 {\r
   EFI_EXCEPTION_TYPE  ExceptionType;\r
@@ -300,8 +310,8 @@ PlUnloadDebugSupportDriver (
 }\r
 \r
 /**\r
-  Initializes driver's handler registration database. \r
-  \r
+  Initializes driver's handler registration database.\r
+\r
   This code executes in boot services context.\r
   Must be public because it's referenced from DebugSupport.c\r
 \r
@@ -330,17 +340,18 @@ PlInitializeDebugSupportDriver (
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  for (ExceptionType = 0; ExceptionType < NUM_IDT_ENTRIES; ExceptionType ++) {\r
-    IdtEntryTable[ExceptionType].StubEntry = (DEBUG_PROC) (UINTN) AllocatePool (StubSize);\r
+  for (ExceptionType = 0; ExceptionType < NUM_IDT_ENTRIES; ExceptionType++) {\r
+    IdtEntryTable[ExceptionType].StubEntry = (DEBUG_PROC)(UINTN)AllocatePool (StubSize);\r
     if (IdtEntryTable[ExceptionType].StubEntry == NULL) {\r
       goto ErrorCleanup;\r
     }\r
-    \r
+\r
     //\r
     // Copy Interrupt stub code.\r
     //\r
     CopyMem ((VOID *)(UINTN)IdtEntryTable[ExceptionType].StubEntry, InterruptEntryStub, StubSize);\r
   }\r
+\r
   return EFI_SUCCESS;\r
 \r
 ErrorCleanup:\r
@@ -350,6 +361,7 @@ ErrorCleanup:
       FreePool ((VOID *)(UINTN)IdtEntryTable[ExceptionType].StubEntry);\r
     }\r
   }\r
+\r
   FreePool (IdtEntryTable);\r
 \r
   return EFI_OUT_OF_RESOURCES;\r