diff options
| author | Johnny Chen <johnny.chen@apple.com> | 2011-09-09 21:11:25 +0000 |
|---|---|---|
| committer | Johnny Chen <johnny.chen@apple.com> | 2011-09-09 21:11:25 +0000 |
| commit | 67b20bbbee0f0aadbf37fbea0491b142b1db4720 (patch) | |
| tree | 39260a4804213368c92ea2d02ed3ea8ad70821cf | |
| parent | 32ed0d204d4010b6942d2f99c58497ec1c490163 (diff) | |
| download | bcm5719-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.cpp | 19 | ||||
| -rw-r--r-- | lldb/tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.cpp | 17 |
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) { |

