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 ®_value) override; 50be691f3bSpatrick 51be691f3bSpatrick Status WriteRegister(const RegisterInfo *reg_info, 52be691f3bSpatrick const RegisterValue ®_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