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