diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec index 970fb04a2f..3273f6a524 100644 --- a/ArmPkg/ArmPkg.dec +++ b/ArmPkg/ArmPkg.dec @@ -52,6 +52,9 @@ # point the Exception Vector Table to its location in CpuDxe. # By default we copy the Vector Table at PcdGet32(PcdCpuVectorBaseAddress) gArmTokenSpaceGuid.PcdRelocateVectorTable|TRUE|BOOLEAN|0x00000022 + # Set this PCD to TRUE if the Exception Vector is changed to add debugger support before + # it has been configured by the CPU DXE + gArmTokenSpaceGuid.PcdDebuggerExceptionSupport|FALSE|BOOLEAN|0x00000032 gArmTokenSpaceGuid.PcdEfiUncachedMemoryToStronglyOrdered|FALSE|BOOLEAN|0x00000025 gArmTokenSpaceGuid.PcdSkipPeiCore|FALSE|BOOLEAN|0x00000026 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);