1 //===-- RegisterContextMinidump_ARM.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_MINIDUMP_REGISTERCONTEXTMINIDUMP_ARM_H 10 #define LLDB_SOURCE_PLUGINS_PROCESS_MINIDUMP_REGISTERCONTEXTMINIDUMP_ARM_H 11 12 #include "MinidumpTypes.h" 13 14 #include "Plugins/Process/Utility/RegisterInfoInterface.h" 15 16 #include "lldb/Target/RegisterContext.h" 17 18 #include "llvm/ADT/ArrayRef.h" 19 #include "llvm/ADT/BitmaskEnum.h" 20 21 // C includes 22 // C++ includes 23 24 namespace lldb_private { 25 26 namespace minidump { 27 28 LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE(); 29 30 class RegisterContextMinidump_ARM : public lldb_private::RegisterContext { 31 public: 32 RegisterContextMinidump_ARM(lldb_private::Thread &thread, 33 const DataExtractor &data, bool apple); 34 35 ~RegisterContextMinidump_ARM() override = default; 36 InvalidateAllRegisters()37 void InvalidateAllRegisters() override { 38 // Do nothing... registers are always valid... 39 } 40 41 // Used for unit testing. 42 static size_t GetRegisterCountStatic(); 43 // Used for unit testing. 44 static const lldb_private::RegisterInfo * 45 GetRegisterInfoAtIndexStatic(size_t reg, bool apple); 46 47 size_t GetRegisterCount() override; 48 49 const lldb_private::RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override; 50 51 size_t GetRegisterSetCount() override; 52 53 const lldb_private::RegisterSet *GetRegisterSet(size_t set) override; 54 55 const char *GetRegisterName(unsigned reg); 56 57 bool ReadRegister(const RegisterInfo *reg_info, 58 RegisterValue ®_value) override; 59 60 bool WriteRegister(const RegisterInfo *reg_info, 61 const RegisterValue ®_value) override; 62 63 uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind, 64 uint32_t num) override; 65 66 // Reference: see breakpad/crashpad source 67 struct QRegValue { 68 uint64_t lo; 69 uint64_t hi; 70 }; 71 72 struct Context { 73 uint32_t context_flags; 74 uint32_t r[16]; 75 uint32_t cpsr; 76 uint64_t fpscr; 77 union { 78 uint64_t d[32]; 79 uint32_t s[32]; 80 QRegValue q[16]; 81 }; 82 uint32_t extra[8]; 83 }; 84 85 protected: 86 enum class Flags : uint32_t { 87 ARM_Flag = 0x40000000, 88 Integer = ARM_Flag | 0x00000002, 89 FloatingPoint = ARM_Flag | 0x00000004, 90 LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ FloatingPoint) 91 }; 92 Context m_regs; 93 const bool m_apple; // True if this is an Apple ARM where FP is R7 94 }; 95 96 } // end namespace minidump 97 } // end namespace lldb_private 98 #endif // LLDB_SOURCE_PLUGINS_PROCESS_MINIDUMP_REGISTERCONTEXTMINIDUMP_ARM_H 99