1d409305fSDimitry Andric //===-- NativeRegisterContextFreeBSD_x86_64.h -------------------*- C++ -*-===// 2d409305fSDimitry Andric // 3d409305fSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4d409305fSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5d409305fSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6d409305fSDimitry Andric // 7d409305fSDimitry Andric //===----------------------------------------------------------------------===// 8d409305fSDimitry Andric 9d409305fSDimitry Andric #if defined(__i386__) || defined(__x86_64__) 10d409305fSDimitry Andric 11d409305fSDimitry Andric #ifndef lldb_NativeRegisterContextFreeBSD_x86_64_h 12d409305fSDimitry Andric #define lldb_NativeRegisterContextFreeBSD_x86_64_h 13d409305fSDimitry Andric 14d409305fSDimitry Andric // clang-format off 15d409305fSDimitry Andric #include <sys/param.h> 16d409305fSDimitry Andric #include <sys/ptrace.h> 17d409305fSDimitry Andric #include <sys/types.h> 18d409305fSDimitry Andric #include <machine/reg.h> 19d409305fSDimitry Andric // clang-format on 20d409305fSDimitry Andric 21d409305fSDimitry Andric #include <array> 22*bdd1243dSDimitry Andric #include <optional> 23d409305fSDimitry Andric 24d409305fSDimitry Andric #include "Plugins/Process/FreeBSD/NativeRegisterContextFreeBSD.h" 25d409305fSDimitry Andric #include "Plugins/Process/Utility/RegisterContext_x86.h" 26d409305fSDimitry Andric #include "Plugins/Process/Utility/NativeRegisterContextDBReg_x86.h" 27d409305fSDimitry Andric #include "Plugins/Process/Utility/lldb-x86-register-enums.h" 28d409305fSDimitry Andric 29d409305fSDimitry Andric #define LLDB_INVALID_XSAVE_OFFSET UINT32_MAX 30d409305fSDimitry Andric 31d409305fSDimitry Andric namespace lldb_private { 32d409305fSDimitry Andric namespace process_freebsd { 33d409305fSDimitry Andric 34d409305fSDimitry Andric class NativeProcessFreeBSD; 35d409305fSDimitry Andric 36d409305fSDimitry Andric class NativeRegisterContextFreeBSD_x86_64 37d409305fSDimitry Andric : public NativeRegisterContextFreeBSD, 38d409305fSDimitry Andric public NativeRegisterContextDBReg_x86 { 39d409305fSDimitry Andric public: 40d409305fSDimitry Andric NativeRegisterContextFreeBSD_x86_64(const ArchSpec &target_arch, 41d409305fSDimitry Andric NativeThreadProtocol &native_thread); 42d409305fSDimitry Andric uint32_t GetRegisterSetCount() const override; 43d409305fSDimitry Andric 44d409305fSDimitry Andric const RegisterSet *GetRegisterSet(uint32_t set_index) const override; 45d409305fSDimitry Andric 46d409305fSDimitry Andric Status ReadRegister(const RegisterInfo *reg_info, 47d409305fSDimitry Andric RegisterValue ®_value) override; 48d409305fSDimitry Andric 49d409305fSDimitry Andric Status WriteRegister(const RegisterInfo *reg_info, 50d409305fSDimitry Andric const RegisterValue ®_value) override; 51d409305fSDimitry Andric 5281ad6265SDimitry Andric Status ReadAllRegisterValues(lldb::WritableDataBufferSP &data_sp) override; 53d409305fSDimitry Andric 54d409305fSDimitry Andric Status WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override; 55d409305fSDimitry Andric 56d409305fSDimitry Andric llvm::Error 57d409305fSDimitry Andric CopyHardwareWatchpointsFrom(NativeRegisterContextFreeBSD &source) override; 58d409305fSDimitry Andric 59d409305fSDimitry Andric private: 60d409305fSDimitry Andric // Private member types. 61d409305fSDimitry Andric enum RegSetKind { 62d409305fSDimitry Andric GPRegSet, 63d409305fSDimitry Andric FPRegSet, 64d409305fSDimitry Andric DBRegSet, 65d409305fSDimitry Andric YMMRegSet, 66d409305fSDimitry Andric MPXRegSet, 67d409305fSDimitry Andric MaxRegSet = MPXRegSet, 68d409305fSDimitry Andric }; 69d409305fSDimitry Andric 70d409305fSDimitry Andric // Private member variables. 71d409305fSDimitry Andric std::array<uint8_t, sizeof(struct reg)> m_gpr; 72d409305fSDimitry Andric std::array<uint8_t, 512> m_fpr; // FXSAVE 73d409305fSDimitry Andric std::array<uint8_t, sizeof(struct dbreg)> m_dbr; 74d409305fSDimitry Andric std::vector<uint8_t> m_xsave; 75d409305fSDimitry Andric std::array<uint32_t, MaxRegSet + 1> m_xsave_offsets; 76d409305fSDimitry Andric std::array<size_t, MaxRegSet + 1> m_regset_offsets; 77d409305fSDimitry Andric 78*bdd1243dSDimitry Andric std::optional<RegSetKind> GetSetForNativeRegNum(uint32_t reg_num) const; 79d409305fSDimitry Andric 80d409305fSDimitry Andric Status ReadRegisterSet(RegSetKind set); 81d409305fSDimitry Andric Status WriteRegisterSet(RegSetKind set); 82d409305fSDimitry Andric 83d409305fSDimitry Andric uint8_t *GetOffsetRegSetData(RegSetKind set, size_t reg_offset); 84d409305fSDimitry Andric 85d409305fSDimitry Andric struct YMMSplitPtr { 86d409305fSDimitry Andric void *xmm; 87d409305fSDimitry Andric void *ymm_hi; 88d409305fSDimitry Andric }; 89*bdd1243dSDimitry Andric std::optional<YMMSplitPtr> GetYMMSplitReg(uint32_t reg); 90d409305fSDimitry Andric }; 91d409305fSDimitry Andric 92d409305fSDimitry Andric } // namespace process_freebsd 93d409305fSDimitry Andric } // namespace lldb_private 94d409305fSDimitry Andric 95d409305fSDimitry Andric #endif // #ifndef lldb_NativeRegisterContextFreeBSD_x86_64_h 96d409305fSDimitry Andric 97d409305fSDimitry Andric #endif // defined(__x86_64__) 98