xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/Process/Utility/NativeRegisterContextDBReg_arm64.h (revision be691f3bb6417f04a68938fadbcaee2d5795e764)
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