1 //===-- RegisterContextPOSIXCore_arm64.h ------------------------*- C++ -*-===// 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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLDB_SOURCE_PLUGINS_PROCESS_ELF_CORE_REGISTERCONTEXTPOSIXCORE_ARM64_H 10 #define LLDB_SOURCE_PLUGINS_PROCESS_ELF_CORE_REGISTERCONTEXTPOSIXCORE_ARM64_H 11 12 #include "Plugins/Process/Utility/LinuxPTraceDefines_arm64sve.h" 13 #include "Plugins/Process/Utility/RegisterContextPOSIX_arm64.h" 14 15 #include "Plugins/Process/elf-core/RegisterUtilities.h" 16 #include "lldb/Utility/DataBufferHeap.h" 17 #include "lldb/Utility/DataExtractor.h" 18 19 class RegisterContextCorePOSIX_arm64 : public RegisterContextPOSIX_arm64 { 20 public: 21 RegisterContextCorePOSIX_arm64( 22 lldb_private::Thread &thread, 23 std::unique_ptr<RegisterInfoPOSIX_arm64> register_info, 24 const lldb_private::DataExtractor &gpregset, 25 llvm::ArrayRef<lldb_private::CoreNote> notes); 26 27 ~RegisterContextCorePOSIX_arm64() override; 28 29 bool ReadRegister(const lldb_private::RegisterInfo *reg_info, 30 lldb_private::RegisterValue &value) override; 31 32 bool WriteRegister(const lldb_private::RegisterInfo *reg_info, 33 const lldb_private::RegisterValue &value) override; 34 35 bool ReadAllRegisterValues(lldb::DataBufferSP &data_sp) override; 36 37 bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override; 38 39 bool HardwareSingleStep(bool enable) override; 40 41 protected: 42 bool ReadGPR() override; 43 44 bool ReadFPR() override; 45 46 bool WriteGPR() override; 47 48 bool WriteFPR() override; 49 50 private: 51 lldb::DataBufferSP m_gpr_buffer; 52 lldb_private::DataExtractor m_gpr; 53 lldb_private::DataExtractor m_fpregset; 54 lldb_private::DataExtractor m_sveregset; 55 56 SVEState m_sve_state; 57 uint16_t m_sve_vector_length = 0; 58 59 const uint8_t *GetSVEBuffer(uint64_t offset = 0); 60 61 void ConfigureRegisterContext(); 62 63 uint32_t CalculateSVEOffset(const lldb_private::RegisterInfo *reg_info); 64 65 uint64_t GetSVERegVG() { return m_sve_vector_length / 8; } 66 }; 67 68 #endif // LLDB_SOURCE_PLUGINS_PROCESS_ELF_CORE_REGISTERCONTEXTPOSIXCORE_ARM64_H 69