10b57cec5SDimitry Andric //===-- RegisterContextMinidump_ARM64.h -------------------------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 95ffd83dbSDimitry Andric #ifndef LLDB_SOURCE_PLUGINS_PROCESS_MINIDUMP_REGISTERCONTEXTMINIDUMP_ARM64_H 105ffd83dbSDimitry Andric #define LLDB_SOURCE_PLUGINS_PROCESS_MINIDUMP_REGISTERCONTEXTMINIDUMP_ARM64_H 110b57cec5SDimitry Andric 120b57cec5SDimitry Andric #include "MinidumpTypes.h" 130b57cec5SDimitry Andric 140b57cec5SDimitry Andric #include "Plugins/Process/Utility/RegisterInfoInterface.h" 150b57cec5SDimitry Andric #include "lldb/Target/RegisterContext.h" 160b57cec5SDimitry Andric 170b57cec5SDimitry Andric #include "llvm/ADT/ArrayRef.h" 180b57cec5SDimitry Andric #include "llvm/ADT/BitmaskEnum.h" 190b57cec5SDimitry Andric 200b57cec5SDimitry Andric // C includes 210b57cec5SDimitry Andric // C++ includes 220b57cec5SDimitry Andric 230b57cec5SDimitry Andric namespace lldb_private { 240b57cec5SDimitry Andric 250b57cec5SDimitry Andric namespace minidump { 260b57cec5SDimitry Andric 270b57cec5SDimitry Andric LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE(); 280b57cec5SDimitry Andric 290b57cec5SDimitry Andric class RegisterContextMinidump_ARM64 : public lldb_private::RegisterContext { 300b57cec5SDimitry Andric public: 310b57cec5SDimitry Andric RegisterContextMinidump_ARM64(lldb_private::Thread &thread, 320b57cec5SDimitry Andric const DataExtractor &data); 330b57cec5SDimitry Andric 340b57cec5SDimitry Andric ~RegisterContextMinidump_ARM64() override = default; 350b57cec5SDimitry Andric InvalidateAllRegisters()360b57cec5SDimitry Andric void InvalidateAllRegisters() override { 370b57cec5SDimitry Andric // Do nothing... registers are always valid... 380b57cec5SDimitry Andric } 390b57cec5SDimitry Andric 400b57cec5SDimitry Andric size_t GetRegisterCount() override; 410b57cec5SDimitry Andric 420b57cec5SDimitry Andric const lldb_private::RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override; 430b57cec5SDimitry Andric 440b57cec5SDimitry Andric size_t GetRegisterSetCount() override; 450b57cec5SDimitry Andric 460b57cec5SDimitry Andric const lldb_private::RegisterSet *GetRegisterSet(size_t set) override; 470b57cec5SDimitry Andric 480b57cec5SDimitry Andric const char *GetRegisterName(unsigned reg); 490b57cec5SDimitry Andric 500b57cec5SDimitry Andric bool ReadRegister(const RegisterInfo *reg_info, 510b57cec5SDimitry Andric RegisterValue ®_value) override; 520b57cec5SDimitry Andric 530b57cec5SDimitry Andric bool WriteRegister(const RegisterInfo *reg_info, 540b57cec5SDimitry Andric const RegisterValue ®_value) override; 550b57cec5SDimitry Andric 560b57cec5SDimitry Andric uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind, 570b57cec5SDimitry Andric uint32_t num) override; 580b57cec5SDimitry Andric 590b57cec5SDimitry Andric // Reference: see breakpad/crashpad source 600b57cec5SDimitry Andric struct Context { 610b57cec5SDimitry Andric uint64_t context_flags; 620b57cec5SDimitry Andric uint64_t x[32]; 630b57cec5SDimitry Andric uint64_t pc; 640b57cec5SDimitry Andric uint32_t cpsr; 650b57cec5SDimitry Andric uint32_t fpsr; 660b57cec5SDimitry Andric uint32_t fpcr; 670b57cec5SDimitry Andric uint8_t v[32 * 16]; // 32 128-bit floating point registers 680b57cec5SDimitry Andric }; 690b57cec5SDimitry Andric 700b57cec5SDimitry Andric enum class Flags : uint32_t { 710b57cec5SDimitry Andric ARM64_Flag = 0x80000000, 720b57cec5SDimitry Andric Integer = ARM64_Flag | 0x00000002, 730b57cec5SDimitry Andric FloatingPoint = ARM64_Flag | 0x00000004, 740b57cec5SDimitry Andric LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ FloatingPoint) 750b57cec5SDimitry Andric }; 765f757f3fSDimitry Andric 775f757f3fSDimitry Andric protected: 780b57cec5SDimitry Andric Context m_regs; 790b57cec5SDimitry Andric }; 800b57cec5SDimitry Andric 810b57cec5SDimitry Andric } // end namespace minidump 820b57cec5SDimitry Andric } // end namespace lldb_private 835ffd83dbSDimitry Andric #endif // LLDB_SOURCE_PLUGINS_PROCESS_MINIDUMP_REGISTERCONTEXTMINIDUMP_ARM64_H 84