xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/Process/OpenBSD/NativeRegisterContextOpenBSD_arm64.h (revision 101d251d5caf88a9341f3045ab62e122abae1b90)
1 //===-- NativeRegisterContextOpenBSD_arm64.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_arm64_h
11 #define lldb_NativeRegisterContextOpenBSD_arm64_h
12 
13 // clang-format off
14 #include <sys/types.h>
15 #include <machine/reg.h>
16 // clang-format on
17 
18 #include "Plugins/Process/OpenBSD/NativeRegisterContextOpenBSD.h"
19 #include "Plugins/Process/Utility/RegisterInfoPOSIX_arm64.h"
20 #include "Plugins/Process/Utility/lldb-arm64-register-enums.h"
21 
22 namespace lldb_private {
23 namespace process_openbsd {
24 
25 class NativeProcessOpenBSD;
26 
27 class NativeRegisterContextOpenBSD_arm64 : public NativeRegisterContextOpenBSD {
28 public:
29   NativeRegisterContextOpenBSD_arm64(const ArchSpec &target_arch,
30                                      NativeThreadProtocol &native_thread);
31 
32   // NativeRegisterContextOpenBSD_arm64 subclasses NativeRegisterContextOpenBSD,
33   // which is a subclass of NativeRegisterContextRegisterInfo, which is a
34   // subclass of NativeRegisterContext.
35   //
36   // NativeRegisterContextOpenBSD defines an interface for reading and writing
37   // registers using the system ptrace API. Subclasses of NativeRegisterContextOpenBSD
38   // do not need to implement any of the interface defined by NativeRegisterContextOpenBSD,
39   // since it is not machine dependent, but they do have to implement a bunch
40   // of stuff from the NativeRegisterContext. Some of this is handled by a
41   // generic implementation in NativeRegisterContextRegisterInfo, but most of
42   // but most of it has to be implemented here.
43 
GetGPRSize()44   size_t GetGPRSize() override { return sizeof(m_gpr); }
GetFPRSize()45   size_t GetFPRSize() override { return sizeof(m_fpr); }
46 
47   uint32_t GetUserRegisterCount() const override;
48 
49   uint32_t GetRegisterSetCount() const override;
50 
51   const RegisterSet *GetRegisterSet(uint32_t set_index) const override;
52 
53   Status ReadRegister(const RegisterInfo *reg_info,
54                       RegisterValue &reg_value) override;
55 
56   Status WriteRegister(const RegisterInfo *reg_info,
57                        const RegisterValue &reg_value) override;
58 
59   Status ReadAllRegisterValues(lldb::WritableDataBufferSP &data_sp) override;
60 
61   Status WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;
62 
63 protected:
GetGPRBuffer()64   void *GetGPRBuffer() override { return &m_gpr; }
GetFPRBuffer()65   void *GetFPRBuffer() override { return &m_fpr; }
66 
67 private:
68   // Private member types.
69   enum { GPRegSet, FPRegSet, PACMaskRegSet };
70 
71   // Private member variables.
72   struct reg m_gpr;
73   struct fpreg m_fpr;
74   register_t m_pacmask[2];
75 
76   int GetSetForNativeRegNum(int reg_num) const;
77 
78   int ReadRegisterSet(uint32_t set);
79   int WriteRegisterSet(uint32_t set);
80 
81   RegisterInfoPOSIX_arm64 &GetRegisterInfo() const;
82 
83   Status ReadPACMask();
84 };
85 
86 } // namespace process_openbsd
87 } // namespace lldb_private
88 
89 #endif // #ifndef lldb_NativeRegisterContextOpenBSD_arm64_h
90