xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/Process/FreeBSD/NativeRegisterContextFreeBSD_arm64.h (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
1be691f3bSpatrick //===-- NativeRegisterContextFreeBSD_arm64.h --------------------*- C++ -*-===//
2be691f3bSpatrick //
3be691f3bSpatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4be691f3bSpatrick // See https://llvm.org/LICENSE.txt for license information.
5be691f3bSpatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6be691f3bSpatrick //
7be691f3bSpatrick //===----------------------------------------------------------------------===//
8be691f3bSpatrick 
9be691f3bSpatrick #if defined(__aarch64__)
10be691f3bSpatrick 
11be691f3bSpatrick #ifndef lldb_NativeRegisterContextFreeBSD_arm64_h
12be691f3bSpatrick #define lldb_NativeRegisterContextFreeBSD_arm64_h
13be691f3bSpatrick 
14be691f3bSpatrick // clang-format off
15be691f3bSpatrick #include <sys/types.h>
16be691f3bSpatrick #include <sys/param.h>
17be691f3bSpatrick #include <machine/reg.h>
18be691f3bSpatrick // clang-format on
19be691f3bSpatrick 
20be691f3bSpatrick #include "Plugins/Process/FreeBSD/NativeRegisterContextFreeBSD.h"
21be691f3bSpatrick #include "Plugins/Process/Utility/NativeRegisterContextDBReg_arm64.h"
22be691f3bSpatrick #include "Plugins/Process/Utility/RegisterInfoPOSIX_arm64.h"
23be691f3bSpatrick 
24be691f3bSpatrick #include <array>
25be691f3bSpatrick 
26be691f3bSpatrick #if __FreeBSD_version >= 1300139
27be691f3bSpatrick #  define LLDB_HAS_FREEBSD_WATCHPOINT 1
28be691f3bSpatrick #endif
29be691f3bSpatrick 
30be691f3bSpatrick namespace lldb_private {
31be691f3bSpatrick namespace process_freebsd {
32be691f3bSpatrick 
33be691f3bSpatrick class NativeProcessFreeBSD;
34be691f3bSpatrick 
35be691f3bSpatrick class NativeRegisterContextFreeBSD_arm64
36be691f3bSpatrick     : public NativeRegisterContextFreeBSD,
37be691f3bSpatrick       public NativeRegisterContextDBReg_arm64 {
38be691f3bSpatrick public:
39be691f3bSpatrick   NativeRegisterContextFreeBSD_arm64(const ArchSpec &target_arch,
40be691f3bSpatrick                                      NativeThreadProtocol &native_thread);
41be691f3bSpatrick 
42be691f3bSpatrick   uint32_t GetRegisterSetCount() const override;
43be691f3bSpatrick 
44be691f3bSpatrick   uint32_t GetUserRegisterCount() const override;
45be691f3bSpatrick 
46be691f3bSpatrick   const RegisterSet *GetRegisterSet(uint32_t set_index) const override;
47be691f3bSpatrick 
48be691f3bSpatrick   Status ReadRegister(const RegisterInfo *reg_info,
49be691f3bSpatrick                       RegisterValue &reg_value) override;
50be691f3bSpatrick 
51be691f3bSpatrick   Status WriteRegister(const RegisterInfo *reg_info,
52be691f3bSpatrick                        const RegisterValue &reg_value) override;
53be691f3bSpatrick 
54*f6aab3d8Srobert   Status ReadAllRegisterValues(lldb::WritableDataBufferSP &data_sp) override;
55be691f3bSpatrick 
56be691f3bSpatrick   Status WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;
57be691f3bSpatrick 
58be691f3bSpatrick   llvm::Error
59be691f3bSpatrick   CopyHardwareWatchpointsFrom(NativeRegisterContextFreeBSD &source) override;
60be691f3bSpatrick 
61be691f3bSpatrick private:
62be691f3bSpatrick   // Due to alignment, FreeBSD reg/fpreg are a few bytes larger than
63be691f3bSpatrick   // LLDB's GPR/FPU structs.  However, all fields have matching offsets
64be691f3bSpatrick   // and sizes, so we do not have to worry about these (and we have
65be691f3bSpatrick   // a unittest to assert that).
66be691f3bSpatrick   std::array<uint8_t, sizeof(reg) + sizeof(fpreg)> m_reg_data;
67be691f3bSpatrick #ifdef LLDB_HAS_FREEBSD_WATCHPOINT
68be691f3bSpatrick   dbreg m_dbreg;
69be691f3bSpatrick   bool m_read_dbreg;
70be691f3bSpatrick #endif
71be691f3bSpatrick 
72be691f3bSpatrick   Status ReadRegisterSet(uint32_t set);
73be691f3bSpatrick   Status WriteRegisterSet(uint32_t set);
74be691f3bSpatrick 
75be691f3bSpatrick   llvm::Error ReadHardwareDebugInfo() override;
76be691f3bSpatrick   llvm::Error WriteHardwareDebugRegs(DREGType hwbType) override;
77be691f3bSpatrick 
78be691f3bSpatrick   RegisterInfoPOSIX_arm64 &GetRegisterInfo() const;
79be691f3bSpatrick };
80be691f3bSpatrick 
81be691f3bSpatrick } // namespace process_freebsd
82be691f3bSpatrick } // namespace lldb_private
83be691f3bSpatrick 
84be691f3bSpatrick #endif // #ifndef lldb_NativeRegisterContextFreeBSD_arm64_h
85be691f3bSpatrick 
86be691f3bSpatrick #endif // defined (__aarch64__)
87