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