| //===-- RegisterContextMinidump_ARM64.h -------------------------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLDB_SOURCE_PLUGINS_PROCESS_MINIDUMP_REGISTERCONTEXTMINIDUMP_ARM64_H |
| #define LLDB_SOURCE_PLUGINS_PROCESS_MINIDUMP_REGISTERCONTEXTMINIDUMP_ARM64_H |
| |
| #include "MinidumpTypes.h" |
| |
| #include "Plugins/Process/Utility/RegisterInfoInterface.h" |
| #include "lldb/Target/RegisterContext.h" |
| |
| #include "llvm/ADT/ArrayRef.h" |
| #include "llvm/ADT/BitmaskEnum.h" |
| |
| // C includes |
| // C++ includes |
| |
| namespace lldb_private { |
| |
| namespace minidump { |
| |
| LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE(); |
| |
| class RegisterContextMinidump_ARM64 : public lldb_private::RegisterContext { |
| public: |
| RegisterContextMinidump_ARM64(lldb_private::Thread &thread, |
| const DataExtractor &data); |
| |
| ~RegisterContextMinidump_ARM64() override = default; |
| |
| void InvalidateAllRegisters() override { |
| // Do nothing... registers are always valid... |
| } |
| |
| size_t GetRegisterCount() override; |
| |
| const lldb_private::RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override; |
| |
| size_t GetRegisterSetCount() override; |
| |
| const lldb_private::RegisterSet *GetRegisterSet(size_t set) override; |
| |
| const char *GetRegisterName(unsigned reg); |
| |
| bool ReadRegister(const RegisterInfo *reg_info, |
| RegisterValue ®_value) override; |
| |
| bool WriteRegister(const RegisterInfo *reg_info, |
| const RegisterValue ®_value) override; |
| |
| uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind, |
| uint32_t num) override; |
| |
| // Reference: see breakpad/crashpad source |
| struct Context { |
| uint64_t context_flags; |
| uint64_t x[32]; |
| uint64_t pc; |
| uint32_t cpsr; |
| uint32_t fpsr; |
| uint32_t fpcr; |
| uint8_t v[32 * 16]; // 32 128-bit floating point registers |
| }; |
| |
| protected: |
| enum class Flags : uint32_t { |
| ARM64_Flag = 0x80000000, |
| Integer = ARM64_Flag | 0x00000002, |
| FloatingPoint = ARM64_Flag | 0x00000004, |
| LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ FloatingPoint) |
| }; |
| Context m_regs; |
| }; |
| |
| } // end namespace minidump |
| } // end namespace lldb_private |
| #endif // LLDB_SOURCE_PLUGINS_PROCESS_MINIDUMP_REGISTERCONTEXTMINIDUMP_ARM64_H |