-/**@file\r
- IPF specific debugsupport types, macros, and definitions.\r
- \r
-Copyright (c) 2004 - 2006 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
+/** @file\r
+ IPF specific types, macros, and definitions for Debug Support Driver.\r
\r
-**/\r
+Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
+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
\r
-#ifndef _PLDEBUG_SUPPORT_H\r
-#define _PLDEBUG_SUPPORT_H\r
+**/\r
\r
+#ifndef _PLDEBUG_SUPPORT_H_\r
+#define _PLDEBUG_SUPPORT_H_\r
\r
#include <Uefi.h>\r
\r
#include <Library/BaseMemoryLib.h>\r
#include <Library/MemoryAllocationLib.h>\r
#include <Library/UefiBootServicesTableLib.h>\r
-#include <Library/BaseLib.h>\r
-#include <Library/PcdLib.h>\r
\r
#define DISABLE_INTERRUPTS 0UL\r
\r
-//\r
-// The remaining definitions comprise the protocol members.\r
-//\r
#define EFI_ISA IsaIpf\r
\r
-//\r
-// processor specific functions that must be public\r
-//\r
-EFI_STATUS\r
-plInitializeDebugSupportDriver (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- IPF specific DebugSupport driver initialization. Must be public because it's\r
- referenced from DebugSupport.c\r
+typedef struct {\r
+ UINT64 Low;\r
+ UINT64 High;\r
+} BUNDLE;\r
\r
-Arguments:\r
+typedef\r
+VOID\r
+(*CALLBACK_FUNC) (\r
+ );\r
\r
-Returns:\r
+/**\r
+ IPF specific DebugSupport driver initialization.\r
\r
- EFI_SUCCESS\r
+ Must be public because it's referenced from DebugSupport.c\r
\r
---*/\r
-;\r
+ @retval EFI_SUCCESS Always.\r
\r
+**/\r
EFI_STATUS\r
-EFIAPI\r
-plUnloadDebugSupportDriver (\r
- IN EFI_HANDLE ImageHandle\r
- )\r
-/*++\r
+PlInitializeDebugSupportDriver (\r
+ VOID\r
+ );\r
\r
-Routine Description:\r
+/**\r
Unload handler that is called during UnloadImage() - deallocates pool memory\r
- used by the driver. Must be public because it's referenced from DebugSuport.c\r
+ used by the driver.\r
\r
-Arguments:\r
- ImageHandle - Image handle\r
+ Must be public because it's referenced from DebugSuport.c\r
\r
-Returns:\r
+ @param ImageHandle The firmware allocated handle for the EFI image.\r
\r
- EFI_STATUS - anything other than EFI_SUCCESS indicates the callback was not registered.\r
+ @retval EFI_SUCCESS Always.\r
\r
---*/\r
-;\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+PlUnloadDebugSupportDriver (\r
+ IN EFI_HANDLE ImageHandle\r
+ );\r
+\r
+/**\r
+ C callable function to obtain the current value of IVA.\r
\r
-//\r
-// Assembly worker functions and data referenced from PlDebugSupport.c\r
-//\r
+ @return Current value of IVA.\r
+\r
+**/\r
VOID *\r
GetIva (\r
VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
+ );\r
\r
- C callable function to obtain the current value of IVA\r
-\r
-Arguments:\r
-\r
- None\r
-\r
-Returns:\r
-\r
- Current value if IVA\r
-\r
---*/\r
-;\r
+/**\r
+ C callable function that HookStub will be copied from it's loaded location into the IVT when\r
+ an IVT entry is hooked.\r
\r
+**/\r
VOID\r
HookStub (\r
VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- HookStub will be copied from it's loaded location into the IVT when\r
- an IVT entry is hooked.\r
-\r
-Arguments:\r
-\r
- None\r
+ );\r
\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-;\r
+/**\r
+ C callable function to chain an interrupt handler.\r
\r
+**/\r
VOID\r
ChainHandler (\r
VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Chains an interrupt handler\r
-\r
-Arguments:\r
+ );\r
\r
- None\r
-\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-;\r
+/**\r
+ C callable function to unchain an interrupt handler.\r
\r
+**/\r
VOID\r
UnchainHandler (\r
VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Unchains an interrupt handler\r
+ );\r
\r
-Arguments:\r
+/**\r
+ C callable function to enable/disable interrupts.\r
\r
- None\r
+ @param NewInterruptState New Interrupt State.\r
\r
-Returns:\r
-\r
- None\r
-\r
---*/\r
-;\r
+ @return Previous state of psr.ic.\r
\r
+**/\r
UINT64\r
ProgramInterruptFlags (\r
IN UINT64 NewInterruptState\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- C callable function to enable/disable interrupts\r
-\r
-Arguments:\r
+ );\r
\r
- NewInterruptState - New Interrupt State\r
+/**\r
+ Flushes instruction cache for specified number of bytes.\r
\r
-Returns:\r
-\r
- Previous state of psr.ic\r
-\r
---*/\r
-;\r
+ @param StartAddress Cache Start Address.\r
+ @param SizeInBytes Cache Size.\r
\r
+**/\r
VOID\r
InstructionCacheFlush (\r
IN VOID *StartAddress,\r
IN UINTN SizeInBytes\r
- )\r
-/*++\r
-\r
-Routine Description:\r
+ );\r
\r
- Flushes instruction cache for specified number of bytes\r
+/**\r
+ Returns the maximum value that may be used for the ProcessorIndex parameter in\r
+ RegisterPeriodicCallback() and RegisterExceptionCallback().\r
\r
-Arguments:\r
+ Hard coded to support only 1 processor for now.\r
\r
- StartAddress - Cache Start Address\r
- SizeInBytes - Cache Size\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
-Returns:\r
-\r
- None\r
-\r
---*/\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
- )\r
-/*++\r
+ );\r
\r
-Routine Description: This is a DebugSupport protocol member function. Hard\r
- coded to support only 1 processor for now.\r
+/**\r
+ Registers a function to be called back periodically in interrupt context.\r
\r
-Arguments:\r
- This - The DebugSupport instance\r
- MaxProcessorIndex - The maximuim supported processor index\r
-\r
-Returns:\r
- Always returns EFI_SUCCESS with *MaxProcessorIndex set to 0\r
-\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
+ @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
+**/\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
- )\r
-/*++\r
+ );\r
\r
-Routine Description:\r
- DebugSupport protocol member function\r
+/**\r
+ Registers a function to be called when a given processor exception occurs.\r
\r
-Arguments:\r
- This - The DebugSupport instance\r
- ProcessorIndex - Which processor the callback applies to.\r
- PeriodicCallback - Callback function\r
+ This code executes in boot services context.\r
\r
-Returns:\r
-\r
- EFI_STATUS - anything other than EFI_SUCCESS indicates the callback was not registered.\r
-\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
+ @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
+**/\r
EFI_STATUS\r
EFIAPI\r
RegisterExceptionCallback (\r
IN EFI_DEBUG_SUPPORT_PROTOCOL *This,\r
IN UINTN ProcessorIndex,\r
- IN EFI_EXCEPTION_CALLBACK NewHandler,\r
+ IN EFI_EXCEPTION_CALLBACK ExceptionCallback,\r
IN EFI_EXCEPTION_TYPE ExceptionType\r
- )\r
-/*++\r
+ );\r
\r
-Routine Description:\r
- DebugSupport protocol member function\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
-Arguments:\r
- This - The DebugSupport instance\r
- ProcessorIndex - Which processor the callback applies to.\r
- NewCallback - Callback function\r
- ExceptionType - Which exception to hook\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 Length Specifies the minimum number of bytes in the processor's instruction\r
+ cache to invalidate.\r
\r
-Returns:\r
-\r
- EFI_STATUS - anything other than EFI_SUCCESS indicates the callback was not registered.\r
-\r
---*/\r
-;\r
+ @retval EFI_SUCCESS Always returned.\r
\r
+**/\r
EFI_STATUS\r
EFIAPI\r
InvalidateInstructionCache (\r
IN UINTN ProcessorIndex,\r
IN VOID *Start,\r
IN UINTN Length\r
- )\r
-/*++\r
+ );\r
\r
-Routine Description:\r
- DebugSupport protocol member function. Calls assembly routine to flush cache.\r
-\r
-Arguments:\r
- This - The DebugSupport instance\r
- ProcessorIndex - Which processor the callback applies to.\r
- Start - Physical base of the memory range to be invalidated\r
- Length - mininum number of bytes in instruction cache to invalidate\r
-\r
-Returns:\r
- EFI_SUCCESS\r
+/**\r
+ C routine that is called for all registered exceptions. This is the main\r
+ exception dispatcher.\r
\r
---*/\r
-;\r
+ Must be public because it's referenced from AsmFuncs.s.\r
\r
+ @param ExceptionType Specifies which processor exception.\r
+ @param Context System Context.\r
+**/\r
VOID\r
CommonHandler (\r
IN EFI_EXCEPTION_TYPE ExceptionType,\r
IN EFI_SYSTEM_CONTEXT Context\r
- )\r
-/*++\r
+ );\r
\r
-Routine Description:\r
- C routine that is called for all registered exceptions. This is the main\r
- exception dispatcher. Must be public because it's referenced from AsmFuncs.s.\r
+/**\r
+ This is the worker function that uninstalls and removes all handlers.\r
+\r
+ @param ExceptionType Specifies which processor exception.\r
+ @param NewBundles New Boundles.\r
+ @param NewCallback A pointer to the new function to be registered.\r
\r
-Arguments:\r
- ExceptionType - Exception Type\r
- Context - System Context\r
+ @retval EFI_ALEADY_STARTED Ivt already hooked.\r
+ @retval EFI_SUCCESS Successfully uninstalled.\r
+\r
+**/\r
+EFI_STATUS\r
+ManageIvtEntryTable (\r
+ IN EFI_EXCEPTION_TYPE ExceptionType,\r
+ IN BUNDLE NewBundles[4],\r
+ IN CALLBACK_FUNC NewCallback\r
+ );\r
\r
-Returns:\r
+/**\r
+ Saves original IVT contents and inserts a few new bundles which are fixed up\r
+ to store the ExceptionType and then call the common handler.\r
\r
- Nothing\r
- \r
---*/\r
-;\r
+ @param ExceptionType Specifies which processor exception.\r
+ @param NewBundles New Boundles.\r
+ @param NewCallback A pointer to the new function to be hooked.\r
+\r
+**/\r
+VOID\r
+HookEntry (\r
+ IN EFI_EXCEPTION_TYPE ExceptionType,\r
+ IN BUNDLE NewBundles[4],\r
+ IN CALLBACK_FUNC NewCallback\r
+ );\r
+\r
+/**\r
+ Restores original IVT contents when unregistering a callback function.\r
+\r
+ @param ExceptionType Specifies which processor exception.\r
+\r
+**/\r
+VOID\r
+UnhookEntry (\r
+ IN EFI_EXCEPTION_TYPE ExceptionType\r
+ );\r
+\r
+/**\r
+ Sets up cache flush and calls assembly function to chain external interrupt.\r
+\r
+ Records new callback in IvtEntryTable.\r
+\r
+ @param NewCallback A pointer to the interrupt handle.\r
+\r
+**/\r
+VOID\r
+ChainExternalInterrupt (\r
+ IN CALLBACK_FUNC NewCallback\r
+ );\r
+\r
+/**\r
+ Sets up cache flush and calls assembly function to restore external interrupt.\r
+ Removes registered callback from IvtEntryTable.\r
+\r
+**/\r
+VOID\r
+UnchainExternalInterrupt (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Given an integer number, return the physical address of the entry point in the IFT.\r
+\r
+ @param HandlerIndex Index of the Handler\r
+ @param EntryPoint IFT Entrypoint\r
+\r
+**/\r
+VOID\r
+GetHandlerEntryPoint (\r
+ UINTN HandlerIndex,\r
+ VOID **EntryPoint\r
+ );\r
\r
#endif\r