13f57216cSOmair Javaid //===-- NativeRegisterContextLinux_arm.h ---------------------*- C++ -*-===//
23f57216cSOmair Javaid //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63f57216cSOmair Javaid //
73f57216cSOmair Javaid //===----------------------------------------------------------------------===//
83f57216cSOmair Javaid 
9e85e6021STamas Berghammer #if defined(__arm__) || defined(__arm64__) || defined(__aarch64__)
103f57216cSOmair Javaid 
113f57216cSOmair Javaid #ifndef lldb_NativeRegisterContextLinux_arm_h
123f57216cSOmair Javaid #define lldb_NativeRegisterContextLinux_arm_h
133f57216cSOmair Javaid 
14068f8a7eSTamas Berghammer #include "Plugins/Process/Linux/NativeRegisterContextLinux.h"
1576953321SMuhammad Omair Javaid #include "Plugins/Process/Utility/RegisterInfoPOSIX_arm.h"
163f57216cSOmair Javaid #include "Plugins/Process/Utility/lldb-arm-register-enums.h"
173f57216cSOmair Javaid 
183f57216cSOmair Javaid namespace lldb_private {
193f57216cSOmair Javaid namespace process_linux {
203f57216cSOmair Javaid 
213f57216cSOmair Javaid class NativeProcessLinux;
223f57216cSOmair Javaid 
23b9c1b51eSKate Stone class NativeRegisterContextLinux_arm : public NativeRegisterContextLinux {
243f57216cSOmair Javaid public:
25068f8a7eSTamas Berghammer   NativeRegisterContextLinux_arm(const ArchSpec &target_arch,
26d37349f3SPavel Labath                                  NativeThreadProtocol &native_thread);
273f57216cSOmair Javaid 
28b9c1b51eSKate Stone   uint32_t GetRegisterSetCount() const override;
293f57216cSOmair Javaid 
30b9c1b51eSKate Stone   const RegisterSet *GetRegisterSet(uint32_t set_index) const override;
313f57216cSOmair Javaid 
32b9c1b51eSKate Stone   uint32_t GetUserRegisterCount() const override;
331f149204STamas Berghammer 
3497206d57SZachary Turner   Status ReadRegister(const RegisterInfo *reg_info,
35b9c1b51eSKate Stone                       RegisterValue &reg_value) override;
363f57216cSOmair Javaid 
3797206d57SZachary Turner   Status WriteRegister(const RegisterInfo *reg_info,
38b9c1b51eSKate Stone                        const RegisterValue &reg_value) override;
393f57216cSOmair Javaid 
40*c2f64601SJonas Devlieghere   Status ReadAllRegisterValues(lldb::WritableDataBufferSP &data_sp) override;
413f57216cSOmair Javaid 
4297206d57SZachary Turner   Status WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;
433f57216cSOmair Javaid 
444ebdee0aSBruce Mitchener   // Hardware breakpoints/watchpoint management functions
452441aecdSOmair Javaid 
46d5ffbad2SOmair Javaid   uint32_t NumSupportedHardwareBreakpoints() override;
47d5ffbad2SOmair Javaid 
48b9c1b51eSKate Stone   uint32_t SetHardwareBreakpoint(lldb::addr_t addr, size_t size) override;
492441aecdSOmair Javaid 
50b9c1b51eSKate Stone   bool ClearHardwareBreakpoint(uint32_t hw_idx) override;
512441aecdSOmair Javaid 
5297206d57SZachary Turner   Status ClearAllHardwareBreakpoints() override;
53d5ffbad2SOmair Javaid 
5497206d57SZachary Turner   Status GetHardwareBreakHitIndex(uint32_t &bp_index,
55d5ffbad2SOmair Javaid                                   lldb::addr_t trap_addr) override;
56d5ffbad2SOmair Javaid 
57b9c1b51eSKate Stone   uint32_t NumSupportedHardwareWatchpoints() override;
582441aecdSOmair Javaid 
59b9c1b51eSKate Stone   uint32_t SetHardwareWatchpoint(lldb::addr_t addr, size_t size,
60b9c1b51eSKate Stone                                  uint32_t watch_flags) override;
612441aecdSOmair Javaid 
62b9c1b51eSKate Stone   bool ClearHardwareWatchpoint(uint32_t hw_index) override;
632441aecdSOmair Javaid 
6497206d57SZachary Turner   Status ClearAllHardwareWatchpoints() override;
652441aecdSOmair Javaid 
6697206d57SZachary Turner   Status GetWatchpointHitIndex(uint32_t &wp_index,
67b9c1b51eSKate Stone                                lldb::addr_t trap_addr) override;
682441aecdSOmair Javaid 
69b9c1b51eSKate Stone   lldb::addr_t GetWatchpointHitAddress(uint32_t wp_index) override;
70c6dc90efSOmair Javaid 
71b9c1b51eSKate Stone   lldb::addr_t GetWatchpointAddress(uint32_t wp_index) override;
722441aecdSOmair Javaid 
73b9c1b51eSKate Stone   uint32_t GetWatchpointSize(uint32_t wp_index);
742441aecdSOmair Javaid 
75b9c1b51eSKate Stone   bool WatchpointIsEnabled(uint32_t wp_index);
762441aecdSOmair Javaid 
772441aecdSOmair Javaid   // Debug register type select
78b9c1b51eSKate Stone   enum DREGType { eDREGTypeWATCH = 0, eDREGTypeBREAK };
792441aecdSOmair Javaid 
80068f8a7eSTamas Berghammer protected:
8197206d57SZachary Turner   Status DoReadRegisterValue(uint32_t offset, const char *reg_name,
82b9c1b51eSKate Stone                              uint32_t size, RegisterValue &value) override;
83e85e6021STamas Berghammer 
8497206d57SZachary Turner   Status DoWriteRegisterValue(uint32_t offset, const char *reg_name,
85ce26b7a6STamas Berghammer                               const RegisterValue &value) override;
86ce26b7a6STamas Berghammer 
873f3673eaSPavel Labath   Status ReadGPR() override;
88e85e6021STamas Berghammer 
893f3673eaSPavel Labath   Status WriteGPR() override;
90e85e6021STamas Berghammer 
913f3673eaSPavel Labath   Status ReadFPR() override;
92ce26b7a6STamas Berghammer 
933f3673eaSPavel Labath   Status WriteFPR() override;
94ce26b7a6STamas Berghammer 
GetGPRBuffer()95b9c1b51eSKate Stone   void *GetGPRBuffer() override { return &m_gpr_arm; }
96068f8a7eSTamas Berghammer 
GetFPRBuffer()97b9c1b51eSKate Stone   void *GetFPRBuffer() override { return &m_fpr; }
98068f8a7eSTamas Berghammer 
GetFPRSize()99b9c1b51eSKate Stone   size_t GetFPRSize() override { return sizeof(m_fpr); }
100068f8a7eSTamas Berghammer 
1013f57216cSOmair Javaid private:
1023f57216cSOmair Javaid   uint32_t m_gpr_arm[k_num_gpr_registers_arm];
10376953321SMuhammad Omair Javaid   RegisterInfoPOSIX_arm::FPU m_fpr;
1043f57216cSOmair Javaid 
1052441aecdSOmair Javaid   // Debug register info for hardware breakpoints and watchpoints management.
106b9c1b51eSKate Stone   struct DREG {
1072441aecdSOmair Javaid     lldb::addr_t address;  // Breakpoint/watchpoint address value.
108b9c1b51eSKate Stone     lldb::addr_t hit_addr; // Address at which last watchpoint trigger exception
109b9c1b51eSKate Stone                            // occurred.
110c6dc90efSOmair Javaid     lldb::addr_t real_addr; // Address value that should cause target to stop.
1112441aecdSOmair Javaid     uint32_t control;       // Breakpoint/watchpoint control value.
1124ebdee0aSBruce Mitchener     uint32_t refcount;      // Serves as enable/disable and reference counter.
1132441aecdSOmair Javaid   };
1142441aecdSOmair Javaid 
1152441aecdSOmair Javaid   struct DREG m_hbr_regs[16]; // Arm native linux hardware breakpoints
1162441aecdSOmair Javaid   struct DREG m_hwp_regs[16]; // Arm native linux hardware watchpoints
1172441aecdSOmair Javaid 
1182441aecdSOmair Javaid   uint32_t m_max_hwp_supported;
1192441aecdSOmair Javaid   uint32_t m_max_hbp_supported;
1202441aecdSOmair Javaid   bool m_refresh_hwdebug_info;
1212441aecdSOmair Javaid 
122b9c1b51eSKate Stone   bool IsGPR(unsigned reg) const;
1233f57216cSOmair Javaid 
124b9c1b51eSKate Stone   bool IsFPR(unsigned reg) const;
1252441aecdSOmair Javaid 
12697206d57SZachary Turner   Status ReadHardwareDebugInfo();
1272441aecdSOmair Javaid 
12897206d57SZachary Turner   Status WriteHardwareDebugRegs(int hwbType, int hwb_index);
129c40e7b17STamas Berghammer 
130b9c1b51eSKate Stone   uint32_t CalculateFprOffset(const RegisterInfo *reg_info) const;
13176953321SMuhammad Omair Javaid 
13276953321SMuhammad Omair Javaid   RegisterInfoPOSIX_arm &GetRegisterInfo() const;
1333f57216cSOmair Javaid };
1343f57216cSOmair Javaid 
1353f57216cSOmair Javaid } // namespace process_linux
1363f57216cSOmair Javaid } // namespace lldb_private
1373f57216cSOmair Javaid 
1383f57216cSOmair Javaid #endif // #ifndef lldb_NativeRegisterContextLinux_arm_h
1393f57216cSOmair Javaid 
140e85e6021STamas Berghammer #endif // defined(__arm__) || defined(__arm64__) || defined(__aarch64__)
141