1 //===-- RegisterContextPOSIX_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 liblldb_RegisterContextPOSIX_arm64_h_ 10 #define liblldb_RegisterContextPOSIX_arm64_h_ 11 12 #include "RegisterInfoInterface.h" 13 #include "lldb-arm64-register-enums.h" 14 #include "lldb/Target/RegisterContext.h" 15 #include "lldb/Utility/Log.h" 16 17 class ProcessMonitor; 18 19 class RegisterContextPOSIX_arm64 : public lldb_private::RegisterContext { 20 public: 21 RegisterContextPOSIX_arm64( 22 lldb_private::Thread &thread, uint32_t concrete_frame_idx, 23 lldb_private::RegisterInfoInterface *register_info); 24 25 ~RegisterContextPOSIX_arm64() override; 26 27 void Invalidate(); 28 29 void InvalidateAllRegisters() override; 30 31 size_t GetRegisterCount() override; 32 33 virtual size_t GetGPRSize(); 34 35 virtual unsigned GetRegisterSize(unsigned reg); 36 37 virtual unsigned GetRegisterOffset(unsigned reg); 38 39 const lldb_private::RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override; 40 41 size_t GetRegisterSetCount() override; 42 43 const lldb_private::RegisterSet *GetRegisterSet(size_t set) override; 44 45 const char *GetRegisterName(unsigned reg); 46 47 uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind, 48 uint32_t num) override; 49 50 protected: 51 struct RegInfo { 52 uint32_t num_registers; 53 uint32_t num_gpr_registers; 54 uint32_t num_fpr_registers; 55 56 uint32_t last_gpr; 57 uint32_t first_fpr; 58 uint32_t last_fpr; 59 60 uint32_t first_fpr_v; 61 uint32_t last_fpr_v; 62 63 uint32_t gpr_flags; 64 }; 65 66 // based on RegisterContextDarwin_arm64.h 67 struct VReg { 68 uint8_t bytes[16]; 69 }; 70 71 // based on RegisterContextDarwin_arm64.h 72 struct FPU { 73 VReg v[32]; 74 uint32_t fpsr; 75 uint32_t fpcr; 76 }; 77 78 uint64_t m_gpr_arm64[lldb_private::k_num_gpr_registers_arm64]; // 64-bit 79 // general 80 // purpose 81 // registers. 82 RegInfo m_reg_info; 83 struct RegisterContextPOSIX_arm64::FPU 84 m_fpr; // floating-point registers including extended register sets. 85 std::unique_ptr<lldb_private::RegisterInfoInterface> 86 m_register_info_up; // Register Info Interface (FreeBSD or Linux) 87 88 // Determines if an extended register set is supported on the processor 89 // running the inferior process. 90 virtual bool IsRegisterSetAvailable(size_t set_index); 91 92 virtual const lldb_private::RegisterInfo *GetRegisterInfo(); 93 94 bool IsGPR(unsigned reg); 95 96 bool IsFPR(unsigned reg); 97 98 lldb::ByteOrder GetByteOrder(); 99 100 virtual bool ReadGPR() = 0; 101 virtual bool ReadFPR() = 0; 102 virtual bool WriteGPR() = 0; 103 virtual bool WriteFPR() = 0; 104 }; 105 106 #endif // liblldb_RegisterContextPOSIX_arm64_h_ 107