================ @@ -272,199 +57,27 @@ uint32_t NativeRegisterContextDBReg_arm64::SetHardwareWatchpoint( addr = addr & (~0x07); } - - // Setup control value - control_value = g_enable_bit | g_pac_bits | GetSizeBits(size); - control_value |= watch_flags << 3; - - // Iterate over stored watchpoints and find a free wp_index - wp_index = LLDB_INVALID_INDEX32; - for (uint32_t i = 0; i < m_max_hwp_supported; i++) { - if (!WatchpointIsEnabled(i)) - wp_index = i; // Mark last free slot - else if (m_hwp_regs[i].address == addr) { - return LLDB_INVALID_INDEX32; // We do not support duplicate watchpoints. - } - } - - if (wp_index == LLDB_INVALID_INDEX32) - return LLDB_INVALID_INDEX32; - - // Update watchpoint in local cache - m_hwp_regs[wp_index].real_addr = real_addr; - m_hwp_regs[wp_index].address = addr; - m_hwp_regs[wp_index].control = control_value; - - // PTRACE call to set corresponding watchpoint register. - error = WriteHardwareDebugRegs(eDREGTypeWATCH); - - if (error) { - m_hwp_regs[wp_index].address = 0; - m_hwp_regs[wp_index].control &= ~g_enable_bit; - - LLDB_LOG_ERROR( - log, std::move(error), - "unable to set watchpoint: failed to write debug registers: {0}"); - return LLDB_INVALID_INDEX32; - } - - return wp_index; -} - -bool NativeRegisterContextDBReg_arm64::ClearHardwareWatchpoint( - uint32_t wp_index) { - Log *log = GetLog(LLDBLog::Watchpoints); - LLDB_LOG(log, "wp_index: {0}", wp_index); - - // Read hardware breakpoint and watchpoint information. - llvm::Error error = ReadHardwareDebugInfo(); - if (error) { - LLDB_LOG_ERROR( - log, std::move(error), - "unable to clear watchpoint: failed to read debug registers: {0}"); - return false; - } - - if (wp_index >= m_max_hwp_supported) - return false; - - // Create a backup we can revert to in case of failure. - lldb::addr_t tempAddr = m_hwp_regs[wp_index].address; - uint32_t tempControl = m_hwp_regs[wp_index].control; - - // Update watchpoint in local cache - m_hwp_regs[wp_index].control &= ~g_enable_bit; - m_hwp_regs[wp_index].address = 0; - - // Ptrace call to update hardware debug registers - error = WriteHardwareDebugRegs(eDREGTypeWATCH); - - if (error) { - m_hwp_regs[wp_index].control = tempControl; - m_hwp_regs[wp_index].address = tempAddr; - - LLDB_LOG_ERROR( - log, std::move(error), - "unable to clear watchpoint: failed to write debug registers: {0}"); - return false; - } - return true; } -Status NativeRegisterContextDBReg_arm64::ClearAllHardwareWatchpoints() { - // Read hardware breakpoint and watchpoint information. - llvm::Error error = ReadHardwareDebugInfo(); - if (error) - return Status::FromError(std::move(error)); - - for (uint32_t i = 0; i < m_max_hwp_supported; i++) { - if (WatchpointIsEnabled(i)) { - // Create a backup we can revert to in case of failure. - lldb::addr_t tempAddr = m_hwp_regs[i].address; - uint32_t tempControl = m_hwp_regs[i].control; - - // Clear watchpoints in local cache - m_hwp_regs[i].control &= ~g_enable_bit; - m_hwp_regs[i].address = 0; - - // Ptrace call to update hardware debug registers - error = WriteHardwareDebugRegs(eDREGTypeWATCH); - - if (error) { - m_hwp_regs[i].control = tempControl; - m_hwp_regs[i].address = tempAddr; - - return Status::FromError(std::move(error)); - } - } - } - - return Status(); -} - uint32_t -NativeRegisterContextDBReg_arm64::GetWatchpointSize(uint32_t wp_index) { - Log *log = GetLog(LLDBLog::Watchpoints); - LLDB_LOG(log, "wp_index: {0}", wp_index); +NativeRegisterContextDBReg_arm64::MakeControlValue(size_t size, ---------------- DavidSpickett wrote:
So 1st - yes, this is exactly the sort of thing I meant in my comments. I think at minimum, the `watch_flags` should be `optional<uint32_t>` but even better would be to have: MakeBreakControlValue MakeWatchControlValue Since I'm pretty sure we always know which one we want to use. This makes it harder to misuse these functions. https://github.com/llvm/llvm-project/pull/118043 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits