11e209fccSTamas Berghammer //===-- NativeRegisterContextLinux_arm64.h ---------------------*- C++ -*-===// 21e209fccSTamas Berghammer // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 61e209fccSTamas Berghammer // 71e209fccSTamas Berghammer //===----------------------------------------------------------------------===// 81e209fccSTamas Berghammer 9068f8a7eSTamas Berghammer #if defined(__arm64__) || defined(__aarch64__) 101e209fccSTamas Berghammer 111e209fccSTamas Berghammer #ifndef lldb_NativeRegisterContextLinux_arm64_h 121e209fccSTamas Berghammer #define lldb_NativeRegisterContextLinux_arm64_h 131e209fccSTamas Berghammer 14068f8a7eSTamas Berghammer #include "Plugins/Process/Linux/NativeRegisterContextLinux.h" 1505915400SCaroline Tice #include "Plugins/Process/Utility/LinuxPTraceDefines_arm64sve.h" 16771c4c9cSMichał Górny #include "Plugins/Process/Utility/NativeRegisterContextDBReg_arm64.h" 177fa7b81bSMuhammad Omair Javaid #include "Plugins/Process/Utility/RegisterInfoPOSIX_arm64.h" 181e209fccSTamas Berghammer 19567ba6c4SMuhammad Omair Javaid #include <asm/ptrace.h> 20567ba6c4SMuhammad Omair Javaid 21db264a6dSTamas Berghammer namespace lldb_private { 22db264a6dSTamas Berghammer namespace process_linux { 23db264a6dSTamas Berghammer 241e209fccSTamas Berghammer class NativeProcessLinux; 251e209fccSTamas Berghammer 26771c4c9cSMichał Górny class NativeRegisterContextLinux_arm64 27771c4c9cSMichał Górny : public NativeRegisterContextLinux, 28771c4c9cSMichał Górny public NativeRegisterContextDBReg_arm64 { 291e209fccSTamas Berghammer public: 30d6d3d21cSMuhammad Omair Javaid NativeRegisterContextLinux_arm64( 31d6d3d21cSMuhammad Omair Javaid const ArchSpec &target_arch, NativeThreadProtocol &native_thread, 32d6d3d21cSMuhammad Omair Javaid std::unique_ptr<RegisterInfoPOSIX_arm64> register_info_up); 331e209fccSTamas Berghammer 34b9c1b51eSKate Stone uint32_t GetRegisterSetCount() const override; 351e209fccSTamas Berghammer 36b9c1b51eSKate Stone uint32_t GetUserRegisterCount() const override; 37cec93c35STamas Berghammer 38b9c1b51eSKate Stone const RegisterSet *GetRegisterSet(uint32_t set_index) const override; 391e209fccSTamas Berghammer 4097206d57SZachary Turner Status ReadRegister(const RegisterInfo *reg_info, 41b9c1b51eSKate Stone RegisterValue ®_value) override; 421e209fccSTamas Berghammer 4397206d57SZachary Turner Status WriteRegister(const RegisterInfo *reg_info, 44b9c1b51eSKate Stone const RegisterValue ®_value) override; 451e209fccSTamas Berghammer 46*c2f64601SJonas Devlieghere Status ReadAllRegisterValues(lldb::WritableDataBufferSP &data_sp) override; 471e209fccSTamas Berghammer 4897206d57SZachary Turner Status WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override; 491e209fccSTamas Berghammer 50b6f9d7b8SMuhammad Omair Javaid void InvalidateAllRegisters() override; 51b6f9d7b8SMuhammad Omair Javaid 524e8aeb97SMuhammad Omair Javaid std::vector<uint32_t> 534e8aeb97SMuhammad Omair Javaid GetExpeditedRegisters(ExpeditedRegs expType) const override; 544e8aeb97SMuhammad Omair Javaid RegisterOffsetIsDynamic()5578cb4562SMuhammad Omair Javaid bool RegisterOffsetIsDynamic() const override { return true; } 5678cb4562SMuhammad Omair Javaid 57da2e614fSDavid Spickett llvm::Expected<MemoryTaggingDetails> 58da2e614fSDavid Spickett GetMemoryTaggingDetails(int32_t type) override; 59da2e614fSDavid Spickett 60068f8a7eSTamas Berghammer protected: 613f3673eaSPavel Labath Status ReadGPR() override; 62068f8a7eSTamas Berghammer 633f3673eaSPavel Labath Status WriteGPR() override; 64068f8a7eSTamas Berghammer 653f3673eaSPavel Labath Status ReadFPR() override; 66068f8a7eSTamas Berghammer 673f3673eaSPavel Labath Status WriteFPR() override; 68068f8a7eSTamas Berghammer GetGPRBuffer()69b9c1b51eSKate Stone void *GetGPRBuffer() override { return &m_gpr_arm64; } 70068f8a7eSTamas Berghammer 7126b8ea2eSMuhammad Omair Javaid // GetGPRBufferSize returns sizeof arm64 GPR ptrace buffer, it is different 7226b8ea2eSMuhammad Omair Javaid // from GetGPRSize which returns sizeof RegisterInfoPOSIX_arm64::GPR. GetGPRBufferSize()7326b8ea2eSMuhammad Omair Javaid size_t GetGPRBufferSize() { return sizeof(m_gpr_arm64); } 7426b8ea2eSMuhammad Omair Javaid GetFPRBuffer()75b9c1b51eSKate Stone void *GetFPRBuffer() override { return &m_fpr; } 76068f8a7eSTamas Berghammer GetFPRSize()77b9c1b51eSKate Stone size_t GetFPRSize() override { return sizeof(m_fpr); } 78068f8a7eSTamas Berghammer 795e6aabd4SMuhammad Omair Javaid lldb::addr_t FixWatchpointHitAddress(lldb::addr_t hit_addr) override; 805e6aabd4SMuhammad Omair Javaid 811e209fccSTamas Berghammer private: 82b6f9d7b8SMuhammad Omair Javaid bool m_gpr_is_valid; 83b6f9d7b8SMuhammad Omair Javaid bool m_fpu_is_valid; 84567ba6c4SMuhammad Omair Javaid bool m_sve_buffer_is_valid; 8588a5b35dSMuhammad Omair Javaid bool m_mte_ctrl_is_valid; 86567ba6c4SMuhammad Omair Javaid 87567ba6c4SMuhammad Omair Javaid bool m_sve_header_is_valid; 8888a5b35dSMuhammad Omair Javaid bool m_pac_mask_is_valid; 89b6f9d7b8SMuhammad Omair Javaid 9026b8ea2eSMuhammad Omair Javaid struct user_pt_regs m_gpr_arm64; // 64-bit general purpose registers. 911e209fccSTamas Berghammer 927fa7b81bSMuhammad Omair Javaid RegisterInfoPOSIX_arm64::FPU 937fa7b81bSMuhammad Omair Javaid m_fpr; // floating-point registers including extended register sets. 94567ba6c4SMuhammad Omair Javaid 95567ba6c4SMuhammad Omair Javaid SVEState m_sve_state; 9605915400SCaroline Tice struct sve::user_sve_header m_sve_header; 97567ba6c4SMuhammad Omair Javaid std::vector<uint8_t> m_sve_ptrace_payload; 98567ba6c4SMuhammad Omair Javaid 99ea8c25a8SOmair Javaid bool m_refresh_hwdebug_info; 100ea8c25a8SOmair Javaid 10188a5b35dSMuhammad Omair Javaid struct user_pac_mask { 10288a5b35dSMuhammad Omair Javaid uint64_t data_mask; 10388a5b35dSMuhammad Omair Javaid uint64_t insn_mask; 10488a5b35dSMuhammad Omair Javaid }; 10588a5b35dSMuhammad Omair Javaid 10688a5b35dSMuhammad Omair Javaid struct user_pac_mask m_pac_mask; 10788a5b35dSMuhammad Omair Javaid 10888a5b35dSMuhammad Omair Javaid uint64_t m_mte_ctrl_reg; 10988a5b35dSMuhammad Omair Javaid 110b9c1b51eSKate Stone bool IsGPR(unsigned reg) const; 1111e209fccSTamas Berghammer 112b9c1b51eSKate Stone bool IsFPR(unsigned reg) const; 1131e209fccSTamas Berghammer 114567ba6c4SMuhammad Omair Javaid Status ReadAllSVE(); 115567ba6c4SMuhammad Omair Javaid 116567ba6c4SMuhammad Omair Javaid Status WriteAllSVE(); 117567ba6c4SMuhammad Omair Javaid 118567ba6c4SMuhammad Omair Javaid Status ReadSVEHeader(); 119567ba6c4SMuhammad Omair Javaid 120567ba6c4SMuhammad Omair Javaid Status WriteSVEHeader(); 121567ba6c4SMuhammad Omair Javaid 12288a5b35dSMuhammad Omair Javaid Status ReadPAuthMask(); 12388a5b35dSMuhammad Omair Javaid 12488a5b35dSMuhammad Omair Javaid Status ReadMTEControl(); 12588a5b35dSMuhammad Omair Javaid 12688a5b35dSMuhammad Omair Javaid Status WriteMTEControl(); 12788a5b35dSMuhammad Omair Javaid 128567ba6c4SMuhammad Omair Javaid bool IsSVE(unsigned reg) const; 12988a5b35dSMuhammad Omair Javaid bool IsPAuth(unsigned reg) const; 13088a5b35dSMuhammad Omair Javaid bool IsMTE(unsigned reg) const; 131567ba6c4SMuhammad Omair Javaid GetSVERegVG()132567ba6c4SMuhammad Omair Javaid uint64_t GetSVERegVG() { return m_sve_header.vl / 8; } 133567ba6c4SMuhammad Omair Javaid SetSVERegVG(uint64_t vg)134567ba6c4SMuhammad Omair Javaid void SetSVERegVG(uint64_t vg) { m_sve_header.vl = vg * 8; } 135567ba6c4SMuhammad Omair Javaid GetSVEHeader()136567ba6c4SMuhammad Omair Javaid void *GetSVEHeader() { return &m_sve_header; } 137567ba6c4SMuhammad Omair Javaid GetPACMask()13888a5b35dSMuhammad Omair Javaid void *GetPACMask() { return &m_pac_mask; } 13988a5b35dSMuhammad Omair Javaid GetMTEControl()14088a5b35dSMuhammad Omair Javaid void *GetMTEControl() { return &m_mte_ctrl_reg; } 14188a5b35dSMuhammad Omair Javaid GetSVEBuffer()1428901f8beSMuhammad Omair Javaid void *GetSVEBuffer() { return m_sve_ptrace_payload.data(); }; 143567ba6c4SMuhammad Omair Javaid GetSVEHeaderSize()144567ba6c4SMuhammad Omair Javaid size_t GetSVEHeaderSize() { return sizeof(m_sve_header); } 145567ba6c4SMuhammad Omair Javaid GetPACMaskSize()14688a5b35dSMuhammad Omair Javaid size_t GetPACMaskSize() { return sizeof(m_pac_mask); } 14788a5b35dSMuhammad Omair Javaid GetSVEBufferSize()148567ba6c4SMuhammad Omair Javaid size_t GetSVEBufferSize() { return m_sve_ptrace_payload.size(); } 149567ba6c4SMuhammad Omair Javaid GetMTEControlSize()15088a5b35dSMuhammad Omair Javaid size_t GetMTEControlSize() { return sizeof(m_mte_ctrl_reg); } 15188a5b35dSMuhammad Omair Javaid 152771c4c9cSMichał Górny llvm::Error ReadHardwareDebugInfo() override; 1531e209fccSTamas Berghammer 154771c4c9cSMichał Górny llvm::Error WriteHardwareDebugRegs(DREGType hwbType) override; 155c40e7b17STamas Berghammer 156b9c1b51eSKate Stone uint32_t CalculateFprOffset(const RegisterInfo *reg_info) const; 1577fa7b81bSMuhammad Omair Javaid 1587fa7b81bSMuhammad Omair Javaid RegisterInfoPOSIX_arm64 &GetRegisterInfo() const; 159567ba6c4SMuhammad Omair Javaid 160567ba6c4SMuhammad Omair Javaid void ConfigureRegisterContext(); 161567ba6c4SMuhammad Omair Javaid 162567ba6c4SMuhammad Omair Javaid uint32_t CalculateSVEOffset(const RegisterInfo *reg_info) const; 1631e209fccSTamas Berghammer }; 164db264a6dSTamas Berghammer 165db264a6dSTamas Berghammer } // namespace process_linux 166db264a6dSTamas Berghammer } // namespace lldb_private 1671e209fccSTamas Berghammer 1681e209fccSTamas Berghammer #endif // #ifndef lldb_NativeRegisterContextLinux_arm64_h 1691e209fccSTamas Berghammer 170068f8a7eSTamas Berghammer #endif // defined (__arm64__) || defined (__aarch64__) 171