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_
14 #include "lldb/Target/RegisterContext.h"
15 #include "lldb/lldb-private.h"
17 // Break only in privileged or user mode
18 #define S_RSVD ((uint32_t)(0u << 1))
19 #define S_PRIV ((uint32_t)(1u << 1))
20 #define S_USER ((uint32_t)(2u << 1))
21 #define S_PRIV_USER ((S_PRIV) | (S_USER))
23 #define WCR_ENABLE ((uint32_t)(1u))
25 // Watchpoint load/store
26 #define WCR_LOAD ((uint32_t)(1u << 3))
27 #define WCR_STORE ((uint32_t)(1u << 4))
29 class RegisterContextDarwin_arm64 : public lldb_private::RegisterContext {
31 RegisterContextDarwin_arm64(lldb_private::Thread &thread,
32 uint32_t concrete_frame_idx);
34 ~RegisterContextDarwin_arm64() override;
36 void InvalidateAllRegisters() override;
38 size_t GetRegisterCount() override;
40 const lldb_private::RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override;
42 size_t GetRegisterSetCount() override;
44 const lldb_private::RegisterSet *GetRegisterSet(size_t set) override;
46 bool ReadRegister(const lldb_private::RegisterInfo *reg_info,
47 lldb_private::RegisterValue ®_value) override;
49 bool WriteRegister(const lldb_private::RegisterInfo *reg_info,
50 const lldb_private::RegisterValue ®_value) override;
52 bool ReadAllRegisterValues(lldb::DataBufferSP &data_sp) override;
54 bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;
56 uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,
57 uint32_t num) override;
59 uint32_t NumSupportedHardwareWatchpoints() override;
61 uint32_t SetHardwareWatchpoint(lldb::addr_t addr, size_t size, bool read,
64 bool ClearHardwareWatchpoint(uint32_t hw_index) override;
66 // mirrors <mach/arm/thread_status.h> arm_thread_state64_t
68 uint64_t x[29]; // x0-x28
73 uint32_t cpsr; // cpsr
77 llvm::AlignedCharArray<16, 16> bytes;
80 // mirrors <mach/arm/thread_status.h> arm_neon_state64_t
87 // mirrors <mach/arm/thread_status.h> arm_exception_state64_t
89 uint64_t far; // Virtual Fault Address
90 uint32_t esr; // Exception syndrome
91 uint32_t exception; // number of arm exception token
94 // mirrors <mach/arm/thread_status.h> arm_debug_state64_t
103 static void LogDBGRegisters(lldb_private::Log *log, const DBG &dbg);
107 GPRRegSet = 6, // ARM_THREAD_STATE64
108 FPURegSet = 17, // ARM_NEON_STATE64
109 EXCRegSet = 7, // ARM_EXCEPTION_STATE64
110 DBGRegSet = 15 // ARM_DEBUG_STATE64
114 GPRWordCount = sizeof(GPR) / sizeof(uint32_t), // ARM_THREAD_STATE64_COUNT
115 FPUWordCount = sizeof(FPU) / sizeof(uint32_t), // ARM_NEON_STATE64_COUNT
117 sizeof(EXC) / sizeof(uint32_t), // ARM_EXCEPTION_STATE64_COUNT
118 DBGWordCount = sizeof(DBG) / sizeof(uint32_t) // ARM_DEBUG_STATE64_COUNT
121 enum { Read = 0, Write = 1, kNumErrors = 2 };
127 int gpr_errs[2]; // Read/Write errors
128 int fpu_errs[2]; // Read/Write errors
129 int exc_errs[2]; // Read/Write errors
130 int dbg_errs[2]; // Read/Write errors
132 void InvalidateAllRegisterStates() {
133 SetError(GPRRegSet, Read, -1);
134 SetError(FPURegSet, Read, -1);
135 SetError(EXCRegSet, Read, -1);
138 int GetError(int flavor, uint32_t err_idx) const {
139 if (err_idx < kNumErrors) {
141 // When getting all errors, just OR all values together to see if
142 // we got any kind of error.
144 return gpr_errs[err_idx];
146 return fpu_errs[err_idx];
148 return exc_errs[err_idx];
150 return dbg_errs[err_idx];
158 bool SetError(int flavor, uint32_t err_idx, int err) {
159 if (err_idx < kNumErrors) {
162 gpr_errs[err_idx] = err;
166 fpu_errs[err_idx] = err;
170 exc_errs[err_idx] = err;
174 exc_errs[err_idx] = err;
184 bool RegisterSetIsCached(int set) const { return GetError(set, Read) == 0; }
186 int ReadGPR(bool force);
188 int ReadFPU(bool force);
190 int ReadEXC(bool force);
192 int ReadDBG(bool force);
202 // Subclasses override these to do the actual reading.
203 virtual int DoReadGPR(lldb::tid_t tid, int flavor, GPR &gpr) { return -1; }
205 virtual int DoReadFPU(lldb::tid_t tid, int flavor, FPU &fpu) = 0;
207 virtual int DoReadEXC(lldb::tid_t tid, int flavor, EXC &exc) = 0;
209 virtual int DoReadDBG(lldb::tid_t tid, int flavor, DBG &dbg) = 0;
211 virtual int DoWriteGPR(lldb::tid_t tid, int flavor, const GPR &gpr) = 0;
213 virtual int DoWriteFPU(lldb::tid_t tid, int flavor, const FPU &fpu) = 0;
215 virtual int DoWriteEXC(lldb::tid_t tid, int flavor, const EXC &exc) = 0;
217 virtual int DoWriteDBG(lldb::tid_t tid, int flavor, const DBG &dbg) = 0;
219 int ReadRegisterSet(uint32_t set, bool force);
221 int WriteRegisterSet(uint32_t set);
223 static uint32_t GetRegisterNumber(uint32_t reg_kind, uint32_t reg_num);
225 static int GetSetForNativeRegNum(int reg_num);
227 static size_t GetRegisterInfosCount();
229 static const lldb_private::RegisterInfo *GetRegisterInfos();
232 #endif // liblldb_RegisterContextDarwin_arm64_h_