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 &reg_value) override;
421e209fccSTamas Berghammer 
4397206d57SZachary Turner   Status WriteRegister(const RegisterInfo *reg_info,
44b9c1b51eSKate Stone                        const RegisterValue &reg_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