[Lldb-commits] [lldb] [LLDB][Process/Utility] Introduce NativeRegisterContextDBReg class (PR #118043)
David Spickett via lldb-commits
lldb-commits at lists.llvm.org
Fri Dec 6 02:38:13 PST 2024
================
@@ -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,
+ uint32_t *watch_flags) {
+ // PAC (bits 2:1): 0b10
+ uint32_t pac_bits = (2 << 1);
----------------
DavidSpickett wrote:
const
https://github.com/llvm/llvm-project/pull/118043
More information about the lldb-commits
mailing list