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 &reg_value) override;
48d409305fSDimitry Andric 
49d409305fSDimitry Andric   Status WriteRegister(const RegisterInfo *reg_info,
50d409305fSDimitry Andric                        const RegisterValue &reg_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