1 //===-- RegisterContextDarwin_arm64.h -----------------------------*- C++
4 // The LLVM Compiler Infrastructure
6 // This file is distributed under the University of Illinois Open Source
7 // License. See LICENSE.TXT for details.
9 //===----------------------------------------------------------------------===//
11 #ifndef liblldb_RegisterContextDarwin_arm64_h_
12 #define liblldb_RegisterContextDarwin_arm64_h_
16 // Other libraries and framework includes
18 #include "lldb/Target/RegisterContext.h"
19 #include "lldb/lldb-private.h"
21 // Break only in privileged or user mode
22 #define S_RSVD ((uint32_t)(0u << 1))
23 #define S_PRIV ((uint32_t)(1u << 1))
24 #define S_USER ((uint32_t)(2u << 1))
25 #define S_PRIV_USER ((S_PRIV) | (S_USER))
27 #define WCR_ENABLE ((uint32_t)(1u))
29 // Watchpoint load/store
30 #define WCR_LOAD ((uint32_t)(1u << 3))
31 #define WCR_STORE ((uint32_t)(1u << 4))
33 class RegisterContextDarwin_arm64 : public lldb_private::RegisterContext {
35 RegisterContextDarwin_arm64(lldb_private::Thread &thread,
36 uint32_t concrete_frame_idx);
38 ~RegisterContextDarwin_arm64() override;
40 void InvalidateAllRegisters() override;
42 size_t GetRegisterCount() override;
44 const lldb_private::RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override;
46 size_t GetRegisterSetCount() override;
48 const lldb_private::RegisterSet *GetRegisterSet(size_t set) override;
50 bool ReadRegister(const lldb_private::RegisterInfo *reg_info,
51 lldb_private::RegisterValue ®_value) override;
53 bool WriteRegister(const lldb_private::RegisterInfo *reg_info,
54 const lldb_private::RegisterValue ®_value) override;
56 bool ReadAllRegisterValues(lldb::DataBufferSP &data_sp) override;
58 bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;
60 uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,
61 uint32_t num) override;
63 uint32_t NumSupportedHardwareWatchpoints() override;
65 uint32_t SetHardwareWatchpoint(lldb::addr_t addr, size_t size, bool read,
68 bool ClearHardwareWatchpoint(uint32_t hw_index) override;
70 // mirrors <mach/arm/thread_status.h> arm_thread_state64_t
72 uint64_t x[29]; // x0-x28
77 uint32_t cpsr; // cpsr
81 llvm::AlignedCharArray<16, 16> bytes;
84 // mirrors <mach/arm/thread_status.h> arm_neon_state64_t
91 // mirrors <mach/arm/thread_status.h> arm_exception_state64_t
93 uint64_t far; // Virtual Fault Address
94 uint32_t esr; // Exception syndrome
95 uint32_t exception; // number of arm exception token
98 // mirrors <mach/arm/thread_status.h> arm_debug_state64_t
107 static void LogDBGRegisters(lldb_private::Log *log, const DBG &dbg);
111 GPRRegSet = 6, // ARM_THREAD_STATE64
112 FPURegSet = 17, // ARM_NEON_STATE64
113 EXCRegSet = 7, // ARM_EXCEPTION_STATE64
114 DBGRegSet = 15 // ARM_DEBUG_STATE64
118 GPRWordCount = sizeof(GPR) / sizeof(uint32_t), // ARM_THREAD_STATE64_COUNT
119 FPUWordCount = sizeof(FPU) / sizeof(uint32_t), // ARM_NEON_STATE64_COUNT
121 sizeof(EXC) / sizeof(uint32_t), // ARM_EXCEPTION_STATE64_COUNT
122 DBGWordCount = sizeof(DBG) / sizeof(uint32_t) // ARM_DEBUG_STATE64_COUNT
125 enum { Read = 0, Write = 1, kNumErrors = 2 };
131 int gpr_errs[2]; // Read/Write errors
132 int fpu_errs[2]; // Read/Write errors
133 int exc_errs[2]; // Read/Write errors
134 int dbg_errs[2]; // Read/Write errors
136 void InvalidateAllRegisterStates() {
137 SetError(GPRRegSet, Read, -1);
138 SetError(FPURegSet, Read, -1);
139 SetError(EXCRegSet, Read, -1);
142 int GetError(int flavor, uint32_t err_idx) const {
143 if (err_idx < kNumErrors) {
145 // When getting all errors, just OR all values together to see if
146 // we got any kind of error.
148 return gpr_errs[err_idx];
150 return fpu_errs[err_idx];
152 return exc_errs[err_idx];
154 return dbg_errs[err_idx];
162 bool SetError(int flavor, uint32_t err_idx, int err) {
163 if (err_idx < kNumErrors) {
166 gpr_errs[err_idx] = err;
170 fpu_errs[err_idx] = err;
174 exc_errs[err_idx] = err;
178 exc_errs[err_idx] = err;
188 bool RegisterSetIsCached(int set) const { return GetError(set, Read) == 0; }
190 int ReadGPR(bool force);
192 int ReadFPU(bool force);
194 int ReadEXC(bool force);
196 int ReadDBG(bool force);
206 // Subclasses override these to do the actual reading.
207 virtual int DoReadGPR(lldb::tid_t tid, int flavor, GPR &gpr) { return -1; }
209 virtual int DoReadFPU(lldb::tid_t tid, int flavor, FPU &fpu) = 0;
211 virtual int DoReadEXC(lldb::tid_t tid, int flavor, EXC &exc) = 0;
213 virtual int DoReadDBG(lldb::tid_t tid, int flavor, DBG &dbg) = 0;
215 virtual int DoWriteGPR(lldb::tid_t tid, int flavor, const GPR &gpr) = 0;
217 virtual int DoWriteFPU(lldb::tid_t tid, int flavor, const FPU &fpu) = 0;
219 virtual int DoWriteEXC(lldb::tid_t tid, int flavor, const EXC &exc) = 0;
221 virtual int DoWriteDBG(lldb::tid_t tid, int flavor, const DBG &dbg) = 0;
223 int ReadRegisterSet(uint32_t set, bool force);
225 int WriteRegisterSet(uint32_t set);
227 static uint32_t GetRegisterNumber(uint32_t reg_kind, uint32_t reg_num);
229 static int GetSetForNativeRegNum(int reg_num);
231 static size_t GetRegisterInfosCount();
233 static const lldb_private::RegisterInfo *GetRegisterInfos();
236 #endif // liblldb_RegisterContextDarwin_arm64_h_