summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohnny Chen <johnny.chen@apple.com>2011-09-09 21:11:25 +0000
committerJohnny Chen <johnny.chen@apple.com>2011-09-09 21:11:25 +0000
commit67b20bbbee0f0aadbf37fbea0491b142b1db4720 (patch)
tree39260a4804213368c92ea2d02ed3ea8ad70821cf
parent32ed0d204d4010b6942d2f99c58497ec1c490163 (diff)
downloadbcm5719-llvm-67b20bbbee0f0aadbf37fbea0491b142b1db4720.tar.gz
bcm5719-llvm-67b20bbbee0f0aadbf37fbea0491b142b1db4720.zip
Reset the debug status register, only if necessary, before we resume,
which saves unnecessary traffic to the kernel. llvm-svn: 139410
-rw-r--r--lldb/tools/debugserver/source/MacOSX/i386/DNBArchImplI386.cpp19
-rw-r--r--lldb/tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.cpp17
2 files changed, 27 insertions, 9 deletions
diff --git a/lldb/tools/debugserver/source/MacOSX/i386/DNBArchImplI386.cpp b/lldb/tools/debugserver/source/MacOSX/i386/DNBArchImplI386.cpp
index 0f3acd84a1c..0b3c3bc4176 100644
--- a/lldb/tools/debugserver/source/MacOSX/i386/DNBArchImplI386.cpp
+++ b/lldb/tools/debugserver/source/MacOSX/i386/DNBArchImplI386.cpp
@@ -546,15 +546,24 @@ DNBArchImplI386::ThreadWillResume()
EnableHardwareSingleStep(true);
}
- // Reset the debug status register before we resume.
+ // Reset the debug status register, if necessary, before we resume.
kern_return_t kret = GetDBGState(false);
- DNBLogThreadedIf(LOG_WATCHPOINTS, "DNBArchImplI386::ThreadWillResume() GetDBGState() => 0x%8.8x.", kret);
- if (kret == KERN_SUCCESS)
+ DNBLogThreadedIf(LOG_WATCHPOINTS, "DNBArchImplX86_64::ThreadWillResume() GetDBGState() => 0x%8.8x.", kret);
+ if (kret != KERN_SUCCESS)
+ return;
+
+ DBG debug_state = m_state.context.dbg;
+ bool need_reset = false;
+ uint32_t i, num = NumSupportedHardwareWatchpoints();
+ for (i = 0; i < num; ++i)
+ if (IsWatchpointHit(debug_state, i))
+ need_reset = true;
+
+ if (need_reset)
{
- DBG debug_state = m_state.context.dbg;
ClearWatchpointHits(debug_state);
kret = SetDBGState();
- DNBLogThreadedIf(LOG_WATCHPOINTS, "DNBArchImplI386::ThreadWillResume() SetDBGState() => 0x%8.8x.", kret);
+ DNBLogThreadedIf(LOG_WATCHPOINTS, "DNBArchImplX86_64::ThreadWillResume() SetDBGState() => 0x%8.8x.", kret);
}
}
diff --git a/lldb/tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.cpp b/lldb/tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.cpp
index 14f9fb5bbe9..8d945ca34ce 100644
--- a/lldb/tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.cpp
+++ b/lldb/tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.cpp
@@ -475,12 +475,21 @@ DNBArchImplX86_64::ThreadWillResume()
EnableHardwareSingleStep(true);
}
- // Reset the debug status register before we resume.
+ // Reset the debug status register, if necessary, before we resume.
kern_return_t kret = GetDBGState(false);
DNBLogThreadedIf(LOG_WATCHPOINTS, "DNBArchImplX86_64::ThreadWillResume() GetDBGState() => 0x%8.8x.", kret);
- if (kret == KERN_SUCCESS)
+ if (kret != KERN_SUCCESS)
+ return;
+
+ DBG debug_state = m_state.context.dbg;
+ bool need_reset = false;
+ uint32_t i, num = NumSupportedHardwareWatchpoints();
+ for (i = 0; i < num; ++i)
+ if (IsWatchpointHit(debug_state, i))
+ need_reset = true;
+
+ if (need_reset)
{
- DBG debug_state = m_state.context.dbg;
ClearWatchpointHits(debug_state);
kret = SetDBGState();
DNBLogThreadedIf(LOG_WATCHPOINTS, "DNBArchImplX86_64::ThreadWillResume() SetDBGState() => 0x%8.8x.", kret);
@@ -807,7 +816,7 @@ uint32_t
DNBArchImplX86_64::GetHardwareWatchpointHit(nub_addr_t &addr)
{
// Read the debug state
- kern_return_t kret = GetDBGState(false);
+ kern_return_t kret = GetDBGState(true);
DNBLogThreadedIf(LOG_WATCHPOINTS, "DNBArchImplX86_64::GetHardwareWatchpointHit() GetDBGState() => 0x%8.8x.", kret);
if (kret == KERN_SUCCESS)
{
OpenPOWER on IntegriCloud