From: andrewfish Date: Wed, 17 Mar 2010 02:37:34 +0000 (+0000) Subject: Remove hook for debugger. Should be implemented using the new library scheme. X-Git-Tag: edk2-stable201903~16074 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=9f50cb977c5067b80f369838c5ca74568efc4c7a Remove hook for debugger. Should be implemented using the new library scheme. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10264 6f19259b-4bc3-4df7-8a09-765794883524 --- diff --git a/ArmPkg/Drivers/CpuDxe/CpuDxe.inf b/ArmPkg/Drivers/CpuDxe/CpuDxe.inf index add7ae5067..231ed14fd6 100644 --- a/ArmPkg/Drivers/CpuDxe/CpuDxe.inf +++ b/ArmPkg/Drivers/CpuDxe/CpuDxe.inf @@ -25,7 +25,6 @@ [Sources.ARM] CpuDxe.c CpuDxe.h - DebugSupport.c Exception.c # diff --git a/ArmPkg/Drivers/CpuDxe/DebugSupport.c b/ArmPkg/Drivers/CpuDxe/DebugSupport.c deleted file mode 100644 index b8a5584939..0000000000 --- a/ArmPkg/Drivers/CpuDxe/DebugSupport.c +++ /dev/null @@ -1,247 +0,0 @@ -/** @file - - Copyright (c) 2008-2009, Apple Inc. All rights reserved. - - All rights reserved. This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ -/** @file - DXE Cpu Driver. - - May need some porting work for platform specifics. - - Copyright (c) 2008, Apple Inc - All rights reserved. This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "CpuDxe.h" - -EFI_PERIODIC_CALLBACK gPeriodicCallBack = (EFI_PERIODIC_CALLBACK)NULL; - -EFI_DEBUG_SUPPORT_PERIODIC_CALLBACK_PROTOCOL *gDebugSupportCallback = NULL; - - -EFI_STATUS -EFIAPI -DebugSupportGetMaximumProcessorIndex ( - IN EFI_DEBUG_SUPPORT_PROTOCOL *This, - OUT UINTN *MaxProcessorIndex - ) -/*++ - -Routine Description: This is a DebugSupport protocol member function. - -Arguments: - This - The DebugSupport instance - MaxProcessorIndex - The maximuim supported processor index - -Returns: - Always returns EFI_SUCCESS with *MaxProcessorIndex set to 0 - ---*/ -{ - *MaxProcessorIndex = 0; - return EFI_SUCCESS; -} - -EFI_STATUS -EFIAPI -DebugSupportRegisterPeriodicCallback ( - IN EFI_DEBUG_SUPPORT_PROTOCOL *This, - IN UINTN ProcessorIndex, - IN EFI_PERIODIC_CALLBACK PeriodicCallback - ) -/*++ - -Routine Description: This is a DebugSupport protocol member function. - -Arguments: - This - The DebugSupport instance - ProcessorIndex - Which processor the callback applies to. - PeriodicCallback - Callback function - -Returns: - - EFI_SUCCESS - EFI_INVALID_PARAMETER - requested uninstalling a handler from a vector that has - no handler registered for it - EFI_ALREADY_STARTED - requested install to a vector that already has a handler registered. - - Other possible return values are passed through from UnHookEntry and HookEntry. - ---*/ -{ - if (ProcessorIndex != 0) { - return EFI_INVALID_PARAMETER; - } - - if ((gPeriodicCallBack != (EFI_PERIODIC_CALLBACK)NULL) && (PeriodicCallback != (EFI_PERIODIC_CALLBACK)NULL)) { - return EFI_ALREADY_STARTED; - } - - gPeriodicCallBack = PeriodicCallback; - - if (gDebugSupportCallback != NULL) { - // - // We can only update this protocol if the Register Protocol Notify has fired. If it fires - // after this call it will update with gPeriodicCallBack value. - // - gDebugSupportCallback->PeriodicCallback = gPeriodicCallBack; - } - - return EFI_SUCCESS; -} - - -EFI_STATUS -EFIAPI -DebugSupportRegisterExceptionCallback ( - IN EFI_DEBUG_SUPPORT_PROTOCOL *This, - IN UINTN ProcessorIndex, - IN EFI_EXCEPTION_CALLBACK NewCallback, - IN EFI_EXCEPTION_TYPE ExceptionType - ) -/*++ - -Routine Description: - This is a DebugSupport protocol member function. - - This code executes in boot services context. - -Arguments: - This - The DebugSupport instance - ProcessorIndex - Which processor the callback applies to. - NewCallback - Callback function - ExceptionType - Which exception to hook - -Returns: - - EFI_SUCCESS - EFI_INVALID_PARAMETER - requested uninstalling a handler from a vector that has - no handler registered for it - EFI_ALREADY_STARTED - requested install to a vector that already has a handler registered. - - Other possible return values are passed through from UnHookEntry and HookEntry. - ---*/ -{ - if (ProcessorIndex != 0) { - return EFI_INVALID_PARAMETER; - } - - return RegisterDebuggerInterruptHandler (ExceptionType, NewCallback); -} - - -EFI_STATUS -EFIAPI -DebugSupportInvalidateInstructionCache ( - IN EFI_DEBUG_SUPPORT_PROTOCOL *This, - IN UINTN ProcessorIndex, - IN VOID *Start, - IN UINT64 Length - ) -/*++ - -Routine Description: - This is a DebugSupport protocol member function. - Calls assembly routine to flush cache. - -Arguments: - This - The DebugSupport instance - ProcessorIndex - Which processor the callback applies to. - Start - Physical base of the memory range to be invalidated - Length - mininum number of bytes in instruction cache to invalidate - -Returns: - - EFI_SUCCESS - always return success - ---*/ -{ - if (ProcessorIndex != 0) { - return EFI_INVALID_PARAMETER; - } - - InvalidateInstructionCache(); - - return EFI_SUCCESS; -} - -// -// This is a global that is the actual interface -// -EFI_DEBUG_SUPPORT_PROTOCOL gDebugSupportProtocolInterface = { - IsaArm, // Fixme to be more generic - DebugSupportGetMaximumProcessorIndex, - DebugSupportRegisterPeriodicCallback, - DebugSupportRegisterExceptionCallback, - DebugSupportInvalidateInstructionCache -}; - - -VOID -EFIAPI -DebugSupportPeriodicCallbackEventProtocolNotify ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - EFI_STATUS Status; - - Status = gBS->LocateProtocol (&gEfiDebugSupportPeriodicCallbackProtocolGuid, NULL, (VOID **)&gDebugSupportCallback); - if (!EFI_ERROR (Status)) { - gDebugSupportCallback->PeriodicCallback = gPeriodicCallBack; - } -} - -VOID *gRegistration = NULL; - - -EFI_DEBUG_SUPPORT_PROTOCOL * -InitilaizeDebugSupport ( - VOID - ) -{ - // RPN gEfiDebugSupportPeriodicCallbackProtocolGuid - EFI_STATUS Status; - EFI_EVENT Event; - - if (!FeaturePcdGet (PcdCpuDxeProduceDebugSupport)) { - // Don't include this code unless Feature Flag is set - return NULL; - } - - - Status = gBS->CreateEvent ( - EVT_NOTIFY_SIGNAL, - TPL_CALLBACK, - DebugSupportPeriodicCallbackEventProtocolNotify, - NULL, - &Event - ); - ASSERT_EFI_ERROR (Status); - - Status = gBS->RegisterProtocolNotify (&gEfiDebugSupportPeriodicCallbackProtocolGuid, Event, &gRegistration); - ASSERT_EFI_ERROR (Status); - - // - // We assume the Timer must depend on our driver to register interrupts so we don't need to do - // a gBS->SignalEvent (Event) here to check to see if the protocol allready exists - // - - return &gDebugSupportProtocolInterface; -} diff --git a/ArmPkg/Drivers/CpuDxe/Exception.c b/ArmPkg/Drivers/CpuDxe/Exception.c index f795c431a2..90a0045e82 100644 --- a/ArmPkg/Drivers/CpuDxe/Exception.c +++ b/ArmPkg/Drivers/CpuDxe/Exception.c @@ -81,45 +81,6 @@ RegisterInterruptHandler ( } -/** - This function registers and enables the handler specified by InterruptHandler for a processor - interrupt or exception type specified by InterruptType. If InterruptHandler is NULL, then the - handler for the processor interrupt or exception type specified by InterruptType is uninstalled. - The installed handler is called once for each processor interrupt or exception. - - @param InterruptType A pointer to the processor's current interrupt state. Set to TRUE if interrupts - are enabled and FALSE if interrupts are disabled. - @param 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. - - @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 - previously installed. - @retval EFI_INVALID_PARAMETER InterruptHandler is NULL, and a handler for InterruptType was not - previously installed. - @retval EFI_UNSUPPORTED The interrupt specified by InterruptType is not supported. - -**/ -EFI_STATUS -RegisterDebuggerInterruptHandler ( - IN EFI_EXCEPTION_TYPE InterruptType, - IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler - ) -{ - if (InterruptType > MAX_ARM_EXCEPTION) { - return EFI_UNSUPPORTED; - } - - if ((InterruptHandler != NULL) && (gDebuggerExceptionHandlers[InterruptType] != NULL)) { - return EFI_ALREADY_STARTED; - } - - gDebuggerExceptionHandlers[InterruptType] = InterruptHandler; - - return EFI_SUCCESS; -} - VOID @@ -129,33 +90,16 @@ CommonCExceptionHandler ( IN OUT EFI_SYSTEM_CONTEXT SystemContext ) { - BOOLEAN Dispatched = FALSE; - - + if (ExceptionType <= MAX_ARM_EXCEPTION) { - if (gDebuggerExceptionHandlers[ExceptionType]) { - // - // If DebugSupport hooked the interrupt call the handler. This does not disable - // the normal handler. - // - gDebuggerExceptionHandlers[ExceptionType] (ExceptionType, SystemContext); - Dispatched = TRUE; - } if (gExceptionHandlers[ExceptionType]) { gExceptionHandlers[ExceptionType] (ExceptionType, SystemContext); - Dispatched = TRUE; + return; } } else { DEBUG ((EFI_D_ERROR, "Unknown exception type %d from %08x\n", ExceptionType, SystemContext.SystemContextArm->PC)); ASSERT (FALSE); } - - if (Dispatched) { - // - // We did work so this was an expected ExceptionType - // - return; - } if (ExceptionType == EXCEPT_ARM_SOFTWARE_INTERRUPT) { // @@ -217,20 +161,6 @@ InitializeExceptions ( // Save existing vector table, in case debugger is already hooked in CopyMem ((VOID *)gDebuggerExceptionHandlers, (VOID *)VectorBase, sizeof (gDebuggerExceptionHandlers)); - // - // Initialize the C entry points for interrupts - // - for (Index = 0; Index <= MAX_ARM_EXCEPTION; Index++) { - Status = RegisterInterruptHandler (Index, NULL); - ASSERT_EFI_ERROR (Status); - - if (VectorBase[Index] == 0xEAFFFFFE) { - // Exception handler contains branch to vector location (jmp $) so no handler - // NOTE: This code assumes vectors are ARM and not Thumb code - gDebuggerExceptionHandlers[Index] = NULL; - } - } - // Copy our assembly code into the page that contains the exception vectors. CopyMem ((VOID *)VectorBase, (VOID *)ExceptionHandlersStart, Length); @@ -240,6 +170,21 @@ InitializeExceptions ( Offset = (UINTN)CommonExceptionEntry - (UINTN)ExceptionHandlersStart; *(UINTN *) ((UINT8 *)(UINTN)PcdGet32 (PcdCpuVectorBaseAddress) + Offset) = (UINTN)AsmCommonExceptionEntry; + // + // Initialize the C entry points for interrupts + // + for (Index = 0; Index <= MAX_ARM_EXCEPTION; Index++) { + if ((gDebuggerExceptionHandlers[Index] == 0) || (gDebuggerExceptionHandlers[Index] == (VOID *)(UINTN)0xEAFFFFFE)) { + // Exception handler contains branch to vector location (jmp $) so no handler + // NOTE: This code assumes vectors are ARM and not Thumb code + Status = RegisterInterruptHandler (Index, NULL); + ASSERT_EFI_ERROR (Status); + } else { + // If the debugger has alread hooked put its vector back + VectorBase[Index] = (UINT32)(UINTN)gDebuggerExceptionHandlers[Index]; + } + } + // Flush Caches since we updated executable stuff InvalidateInstructionCacheRange ((VOID *)PcdGet32(PcdCpuVectorBaseAddress), Length);