Path: blob/main/contrib/llvm-project/lldb/source/Plugins/Process/Utility/RegisterContextDarwin_arm64.h
96381 views
//===-- RegisterContextDarwin_arm64.h -----------------------------*- C++1//-*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//89#ifndef LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_REGISTERCONTEXTDARWIN_ARM64_H10#define LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_REGISTERCONTEXTDARWIN_ARM64_H1112#include "lldb/Target/RegisterContext.h"13#include "lldb/lldb-private.h"1415// Break only in privileged or user mode16#define S_RSVD ((uint32_t)(0u << 1))17#define S_PRIV ((uint32_t)(1u << 1))18#define S_USER ((uint32_t)(2u << 1))19#define S_PRIV_USER ((S_PRIV) | (S_USER))2021#define WCR_ENABLE ((uint32_t)(1u))2223// Watchpoint load/store24#define WCR_LOAD ((uint32_t)(1u << 3))25#define WCR_STORE ((uint32_t)(1u << 4))2627class RegisterContextDarwin_arm64 : public lldb_private::RegisterContext {28public:29RegisterContextDarwin_arm64(lldb_private::Thread &thread,30uint32_t concrete_frame_idx);3132~RegisterContextDarwin_arm64() override;3334void InvalidateAllRegisters() override;3536size_t GetRegisterCount() override;3738const lldb_private::RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override;3940size_t GetRegisterSetCount() override;4142const lldb_private::RegisterSet *GetRegisterSet(size_t set) override;4344bool ReadRegister(const lldb_private::RegisterInfo *reg_info,45lldb_private::RegisterValue ®_value) override;4647bool WriteRegister(const lldb_private::RegisterInfo *reg_info,48const lldb_private::RegisterValue ®_value) override;4950bool ReadAllRegisterValues(lldb::WritableDataBufferSP &data_sp) override;5152bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;5354uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,55uint32_t num) override;5657uint32_t NumSupportedHardwareWatchpoints() override;5859uint32_t SetHardwareWatchpoint(lldb::addr_t addr, size_t size, bool read,60bool write) override;6162bool ClearHardwareWatchpoint(uint32_t hw_index) override;6364// mirrors <mach/arm/thread_status.h> arm_thread_state64_t65struct GPR {66uint64_t x[29]; // x0-x2867uint64_t fp; // x2968uint64_t lr; // x3069uint64_t sp; // x3170uint64_t pc; // pc71uint32_t cpsr; // cpsr72};7374struct VReg {75alignas(16) char bytes[16];76};7778// mirrors <mach/arm/thread_status.h> arm_neon_state64_t79struct FPU {80VReg v[32];81uint32_t fpsr;82uint32_t fpcr;83};8485// mirrors <mach/arm/thread_status.h> arm_exception_state64_t86struct EXC {87uint64_t far; // Virtual Fault Address88uint32_t esr; // Exception syndrome89uint32_t exception; // number of arm exception token90};9192// mirrors <mach/arm/thread_status.h> arm_debug_state64_t93struct DBG {94uint64_t bvr[16];95uint64_t bcr[16];96uint64_t wvr[16];97uint64_t wcr[16];98uint64_t mdscr_el1;99};100101static void LogDBGRegisters(lldb_private::Log *log, const DBG &dbg);102103protected:104enum {105GPRRegSet = 6, // ARM_THREAD_STATE64106FPURegSet = 17, // ARM_NEON_STATE64107EXCRegSet = 7, // ARM_EXCEPTION_STATE64108DBGRegSet = 15 // ARM_DEBUG_STATE64109};110111enum {112GPRWordCount = sizeof(GPR) / sizeof(uint32_t), // ARM_THREAD_STATE64_COUNT113FPUWordCount = sizeof(FPU) / sizeof(uint32_t), // ARM_NEON_STATE64_COUNT114EXCWordCount =115sizeof(EXC) / sizeof(uint32_t), // ARM_EXCEPTION_STATE64_COUNT116DBGWordCount = sizeof(DBG) / sizeof(uint32_t) // ARM_DEBUG_STATE64_COUNT117};118119enum { Read = 0, Write = 1, kNumErrors = 2 };120121GPR gpr;122FPU fpu;123EXC exc;124DBG dbg;125int gpr_errs[2]; // Read/Write errors126int fpu_errs[2]; // Read/Write errors127int exc_errs[2]; // Read/Write errors128int dbg_errs[2]; // Read/Write errors129130void InvalidateAllRegisterStates() {131SetError(GPRRegSet, Read, -1);132SetError(FPURegSet, Read, -1);133SetError(EXCRegSet, Read, -1);134}135136int GetError(int flavor, uint32_t err_idx) const {137if (err_idx < kNumErrors) {138switch (flavor) {139// When getting all errors, just OR all values together to see if140// we got any kind of error.141case GPRRegSet:142return gpr_errs[err_idx];143case FPURegSet:144return fpu_errs[err_idx];145case EXCRegSet:146return exc_errs[err_idx];147case DBGRegSet:148return dbg_errs[err_idx];149default:150break;151}152}153return -1;154}155156bool SetError(int flavor, uint32_t err_idx, int err) {157if (err_idx < kNumErrors) {158switch (flavor) {159case GPRRegSet:160gpr_errs[err_idx] = err;161return true;162163case FPURegSet:164fpu_errs[err_idx] = err;165return true;166167case EXCRegSet:168exc_errs[err_idx] = err;169return true;170171case DBGRegSet:172exc_errs[err_idx] = err;173return true;174175default:176break;177}178}179return false;180}181182bool RegisterSetIsCached(int set) const { return GetError(set, Read) == 0; }183184int ReadGPR(bool force);185186int ReadFPU(bool force);187188int ReadEXC(bool force);189190int ReadDBG(bool force);191192int WriteGPR();193194int WriteFPU();195196int WriteEXC();197198int WriteDBG();199200// Subclasses override these to do the actual reading.201virtual int DoReadGPR(lldb::tid_t tid, int flavor, GPR &gpr) { return -1; }202203virtual int DoReadFPU(lldb::tid_t tid, int flavor, FPU &fpu) = 0;204205virtual int DoReadEXC(lldb::tid_t tid, int flavor, EXC &exc) = 0;206207virtual int DoReadDBG(lldb::tid_t tid, int flavor, DBG &dbg) = 0;208209virtual int DoWriteGPR(lldb::tid_t tid, int flavor, const GPR &gpr) = 0;210211virtual int DoWriteFPU(lldb::tid_t tid, int flavor, const FPU &fpu) = 0;212213virtual int DoWriteEXC(lldb::tid_t tid, int flavor, const EXC &exc) = 0;214215virtual int DoWriteDBG(lldb::tid_t tid, int flavor, const DBG &dbg) = 0;216217int ReadRegisterSet(uint32_t set, bool force);218219int WriteRegisterSet(uint32_t set);220221static uint32_t GetRegisterNumber(uint32_t reg_kind, uint32_t reg_num);222223static int GetSetForNativeRegNum(int reg_num);224225static size_t GetRegisterInfosCount();226227static const lldb_private::RegisterInfo *GetRegisterInfos();228};229230#endif // LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_REGISTERCONTEXTDARWIN_ARM64_H231232233