1 //===-- RegisterContextPOSIX_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 liblldb_RegisterContextPOSIX_arm64_h_
11 #define liblldb_RegisterContextPOSIX_arm64_h_
12 
13 // C Includes
14 // C++ Includes
15 // Other libraries and framework includes
16 // Project includes
17 #include "RegisterInfoInterface.h"
18 #include "lldb-arm64-register-enums.h"
19 #include "lldb/Core/Log.h"
20 #include "lldb/Target/RegisterContext.h"
21 
22 class ProcessMonitor;
23 
24 class RegisterContextPOSIX_arm64 : public lldb_private::RegisterContext {
25 public:
26   RegisterContextPOSIX_arm64(
27       lldb_private::Thread &thread, uint32_t concrete_frame_idx,
28       lldb_private::RegisterInfoInterface *register_info);
29 
30   ~RegisterContextPOSIX_arm64() override;
31 
32   void Invalidate();
33 
34   void InvalidateAllRegisters() override;
35 
36   size_t GetRegisterCount() override;
37 
38   virtual size_t GetGPRSize();
39 
40   virtual unsigned GetRegisterSize(unsigned reg);
41 
42   virtual unsigned GetRegisterOffset(unsigned reg);
43 
44   const lldb_private::RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override;
45 
46   size_t GetRegisterSetCount() override;
47 
48   const lldb_private::RegisterSet *GetRegisterSet(size_t set) override;
49 
50   const char *GetRegisterName(unsigned reg);
51 
52   uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,
53                                                uint32_t num) override;
54 
55 protected:
56   struct RegInfo {
57     uint32_t num_registers;
58     uint32_t num_gpr_registers;
59     uint32_t num_fpr_registers;
60 
61     uint32_t last_gpr;
62     uint32_t first_fpr;
63     uint32_t last_fpr;
64 
65     uint32_t first_fpr_v;
66     uint32_t last_fpr_v;
67 
68     uint32_t gpr_flags;
69   };
70 
71   // based on RegisterContextDarwin_arm64.h
72   struct VReg {
73     uint8_t bytes[16];
74   };
75 
76   // based on RegisterContextDarwin_arm64.h
77   struct FPU {
78     VReg v[32];
79     uint32_t fpsr;
80     uint32_t fpcr;
81   };
82 
83   uint64_t m_gpr_arm64[lldb_private::k_num_gpr_registers_arm64]; // 64-bit
84                                                                  // general
85                                                                  // purpose
86                                                                  // registers.
87   RegInfo m_reg_info;
88   struct RegisterContextPOSIX_arm64::FPU
89       m_fpr; // floating-point registers including extended register sets.
90   std::unique_ptr<lldb_private::RegisterInfoInterface>
91       m_register_info_ap; // Register Info Interface (FreeBSD or Linux)
92 
93   // Determines if an extended register set is supported on the processor
94   // running the inferior process.
95   virtual bool IsRegisterSetAvailable(size_t set_index);
96 
97   virtual const lldb_private::RegisterInfo *GetRegisterInfo();
98 
99   bool IsGPR(unsigned reg);
100 
101   bool IsFPR(unsigned reg);
102 
103   lldb::ByteOrder GetByteOrder();
104 
105   virtual bool ReadGPR() = 0;
106   virtual bool ReadFPR() = 0;
107   virtual bool WriteGPR() = 0;
108   virtual bool WriteFPR() = 0;
109 };
110 
111 #endif // liblldb_RegisterContextPOSIX_arm64_h_
112