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