1 //===-- NativeRegisterContextOpenBSD_x86_64.h --------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef lldb_NativeRegisterContextOpenBSD_x86_64_h
11 #define lldb_NativeRegisterContextOpenBSD_x86_64_h
12 
13 // clang-format off
14 #include <sys/types.h>
15 #include <machine/reg.h>
16 // clang-format on
17 
18 #include <array>
19 #include <vector>
20 
21 #include "Plugins/Process/OpenBSD/NativeRegisterContextOpenBSD.h"
22 #include "Plugins/Process/Utility/RegisterContext_x86.h"
23 #include "Plugins/Process/Utility/lldb-x86-register-enums.h"
24 
25 namespace lldb_private {
26 namespace process_openbsd {
27 
28 class NativeProcessOpenBSD;
29 
30 class NativeRegisterContextOpenBSD_x86_64 : public NativeRegisterContextOpenBSD {
31 public:
32   NativeRegisterContextOpenBSD_x86_64(const ArchSpec &target_arch,
33                                      NativeThreadProtocol &native_thread);
GetGPRSize()34   size_t GetGPRSize() override { return sizeof(m_gpr); }
GetFPRSize()35   size_t GetFPRSize() override { return sizeof(m_fpr); }
36 
37   uint32_t GetUserRegisterCount() const override;
38   uint32_t GetRegisterSetCount() const override;
39 
40   const RegisterSet *GetRegisterSet(uint32_t set_index) const override;
41 
42   Status ReadRegister(const RegisterInfo *reg_info,
43                       RegisterValue &reg_value) override;
44 
45   Status WriteRegister(const RegisterInfo *reg_info,
46                        const RegisterValue &reg_value) override;
47 
48   Status ReadAllRegisterValues(lldb::WritableDataBufferSP &data_sp) override;
49 
50   Status WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;
51 
52 protected:
GetGPRBuffer()53   void *GetGPRBuffer() override { return &m_gpr; }
GetFPRBuffer()54   void *GetFPRBuffer() override { return &m_fpr; }
55 
56 private:
57   // Private member types.
58   enum {
59     GPRegSet,
60     FPRegSet,
61     YMMRegSet,
62     MaxRegSet = YMMRegSet,
63   };
64 
65   // Private member variables.
66   struct reg m_gpr;
67   struct fpreg m_fpr;
68   std::vector<uint8_t> m_xsave;
69   std::array<uint32_t, MaxRegSet + 1> m_xsave_offsets;
70 
71   int GetSetForNativeRegNum(int reg_num) const;
72 
73   int ReadRegisterSet(uint32_t set);
74   int WriteRegisterSet(uint32_t set);
75 
76   struct YMMSplitPtr {
77     void *xmm;
78     void *ymm_hi;
79   };
80   std::optional<YMMSplitPtr> GetYMMSplitReg(uint32_t reg);
81 };
82 
83 } // namespace process_openbsd
84 } // namespace lldb_private
85 
86 #endif // #ifndef lldb_NativeRegisterContextOpenBSD_x86_64_h
87