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