From eeec69c5dc62460d2b256f3dee8097fb7afb34d5 Mon Sep 17 00:00:00 2001 From: oliviermartin Date: Fri, 3 Jun 2011 09:18:00 +0000 Subject: ArmPkg: Introduce the PCD PcdDebuggerExceptionSupport The Exception Vector can be set before installing the CPU DXE driver to add debugger support at the early stage of the firmware initialization. If no one has touched the exception vector prior to the CPU DXE then the Vector might contain non zero data. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11733 6f19259b-4bc3-4df7-8a09-765794883524 --- ArmPkg/Drivers/CpuDxe/CpuDxe.inf | 1 + ArmPkg/Drivers/CpuDxe/Exception.c | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) (limited to 'ArmPkg/Drivers') diff --git a/ArmPkg/Drivers/CpuDxe/CpuDxe.inf b/ArmPkg/Drivers/CpuDxe/CpuDxe.inf index 25c0b880b2..e74de5b3e0 100644 --- a/ArmPkg/Drivers/CpuDxe/CpuDxe.inf +++ b/ArmPkg/Drivers/CpuDxe/CpuDxe.inf @@ -73,6 +73,7 @@ [FeaturePcd.common] gArmTokenSpaceGuid.PcdCpuDxeProduceDebugSupport gArmTokenSpaceGuid.PcdRelocateVectorTable + gArmTokenSpaceGuid.PcdDebuggerExceptionSupport gArmTokenSpaceGuid.PcdEfiUncachedMemoryToStronglyOrdered [depex] diff --git a/ArmPkg/Drivers/CpuDxe/Exception.c b/ArmPkg/Drivers/CpuDxe/Exception.c index 21a4c035a9..7c59af7fef 100644 --- a/ArmPkg/Drivers/CpuDxe/Exception.c +++ b/ArmPkg/Drivers/CpuDxe/Exception.c @@ -162,8 +162,10 @@ InitializeExceptions ( ASSERT_EFI_ERROR (Status); } + if (FeaturePcdGet(PcdDebuggerExceptionSupport) == TRUE) { // Save existing vector table, in case debugger is already hooked in CopyMem ((VOID *)gDebuggerExceptionHandlers, (VOID *)VectorBase, sizeof (gDebuggerExceptionHandlers)); + } // Copy our assembly code into the page that contains the exception vectors. CopyMem ((VOID *)VectorBase, (VOID *)ExceptionHandlersStart, Length); @@ -178,7 +180,8 @@ InitializeExceptions ( // Initialize the C entry points for interrupts // for (Index = 0; Index <= MAX_ARM_EXCEPTION; Index++) { - if ((gDebuggerExceptionHandlers[Index] == 0) || (gDebuggerExceptionHandlers[Index] == (VOID *)(UINTN)0xEAFFFFFE)) { + if (!FeaturePcdGet(PcdDebuggerExceptionSupport) || + (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); -- cgit v1.2.3