1*be691f3bSpatrick //===-- NativeRegisterContextDBReg_arm64.h ----------------------*- C++ -*-===// 2*be691f3bSpatrick // 3*be691f3bSpatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*be691f3bSpatrick // See https://llvm.org/LICENSE.txt for license information. 5*be691f3bSpatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*be691f3bSpatrick // 7*be691f3bSpatrick //===----------------------------------------------------------------------===// 8*be691f3bSpatrick 9*be691f3bSpatrick #ifndef lldb_NativeRegisterContextDBReg_arm64_h 10*be691f3bSpatrick #define lldb_NativeRegisterContextDBReg_arm64_h 11*be691f3bSpatrick 12*be691f3bSpatrick #include "Plugins/Process/Utility/NativeRegisterContextRegisterInfo.h" 13*be691f3bSpatrick 14*be691f3bSpatrick #include <array> 15*be691f3bSpatrick 16*be691f3bSpatrick namespace lldb_private { 17*be691f3bSpatrick 18*be691f3bSpatrick class NativeRegisterContextDBReg_arm64 19*be691f3bSpatrick : public virtual NativeRegisterContextRegisterInfo { 20*be691f3bSpatrick public: 21*be691f3bSpatrick uint32_t NumSupportedHardwareBreakpoints() override; 22*be691f3bSpatrick 23*be691f3bSpatrick uint32_t SetHardwareBreakpoint(lldb::addr_t addr, size_t size) override; 24*be691f3bSpatrick 25*be691f3bSpatrick bool ClearHardwareBreakpoint(uint32_t hw_idx) override; 26*be691f3bSpatrick 27*be691f3bSpatrick Status ClearAllHardwareBreakpoints() override; 28*be691f3bSpatrick 29*be691f3bSpatrick Status GetHardwareBreakHitIndex(uint32_t &bp_index, 30*be691f3bSpatrick lldb::addr_t trap_addr) override; 31*be691f3bSpatrick 32*be691f3bSpatrick bool BreakpointIsEnabled(uint32_t bp_index); 33*be691f3bSpatrick 34*be691f3bSpatrick uint32_t NumSupportedHardwareWatchpoints() override; 35*be691f3bSpatrick 36*be691f3bSpatrick uint32_t SetHardwareWatchpoint(lldb::addr_t addr, size_t size, 37*be691f3bSpatrick uint32_t watch_flags) override; 38*be691f3bSpatrick 39*be691f3bSpatrick bool ClearHardwareWatchpoint(uint32_t hw_index) override; 40*be691f3bSpatrick 41*be691f3bSpatrick Status ClearAllHardwareWatchpoints() override; 42*be691f3bSpatrick 43*be691f3bSpatrick Status GetWatchpointHitIndex(uint32_t &wp_index, 44*be691f3bSpatrick lldb::addr_t trap_addr) override; 45*be691f3bSpatrick 46*be691f3bSpatrick lldb::addr_t GetWatchpointHitAddress(uint32_t wp_index) override; 47*be691f3bSpatrick 48*be691f3bSpatrick lldb::addr_t GetWatchpointAddress(uint32_t wp_index) override; 49*be691f3bSpatrick 50*be691f3bSpatrick uint32_t GetWatchpointSize(uint32_t wp_index); 51*be691f3bSpatrick 52*be691f3bSpatrick bool WatchpointIsEnabled(uint32_t wp_index); 53*be691f3bSpatrick 54*be691f3bSpatrick // Debug register type select 55*be691f3bSpatrick enum DREGType { eDREGTypeWATCH = 0, eDREGTypeBREAK }; 56*be691f3bSpatrick 57*be691f3bSpatrick protected: 58*be691f3bSpatrick // Debug register info for hardware breakpoints and watchpoints management. 59*be691f3bSpatrick struct DREG { 60*be691f3bSpatrick lldb::addr_t address; // Breakpoint/watchpoint address value. 61*be691f3bSpatrick lldb::addr_t hit_addr; // Address at which last watchpoint trigger exception 62*be691f3bSpatrick // occurred. 63*be691f3bSpatrick lldb::addr_t real_addr; // Address value that should cause target to stop. 64*be691f3bSpatrick uint32_t control; // Breakpoint/watchpoint control value. 65*be691f3bSpatrick }; 66*be691f3bSpatrick 67*be691f3bSpatrick std::array<struct DREG, 16> m_hbp_regs; // hardware breakpoints 68*be691f3bSpatrick std::array<struct DREG, 16> m_hwp_regs; // hardware watchpoints 69*be691f3bSpatrick 70*be691f3bSpatrick uint32_t m_max_hbp_supported; 71*be691f3bSpatrick uint32_t m_max_hwp_supported; 72*be691f3bSpatrick 73*be691f3bSpatrick virtual llvm::Error ReadHardwareDebugInfo() = 0; 74*be691f3bSpatrick virtual llvm::Error WriteHardwareDebugRegs(DREGType hwbType) = 0; FixWatchpointHitAddress(lldb::addr_t hit_addr)75*be691f3bSpatrick virtual lldb::addr_t FixWatchpointHitAddress(lldb::addr_t hit_addr) { 76*be691f3bSpatrick return hit_addr; 77*be691f3bSpatrick } 78*be691f3bSpatrick }; 79*be691f3bSpatrick 80*be691f3bSpatrick } // namespace lldb_private 81*be691f3bSpatrick 82*be691f3bSpatrick #endif // #ifndef lldb_NativeRegisterContextDBReg_arm64_h 83