1 //===-- RegisterContextPOSIXCore_arm64.cpp --------------------------------===// 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 #include "RegisterContextPOSIXCore_arm64.h" 10 11 #include "Plugins/Process/elf-core/RegisterUtilities.h" 12 #include "lldb/Target/Thread.h" 13 #include "lldb/Utility/RegisterValue.h" 14 15 #include <memory> 16 17 using namespace lldb_private; 18 19 RegisterContextCorePOSIX_arm64::RegisterContextCorePOSIX_arm64( 20 Thread &thread, std::unique_ptr<RegisterInfoPOSIX_arm64> register_info, 21 const DataExtractor &gpregset, llvm::ArrayRef<CoreNote> notes) 22 : RegisterContextPOSIX_arm64(thread, std::move(register_info)) { 23 m_gpr_buffer = std::make_shared<DataBufferHeap>(gpregset.GetDataStart(), 24 gpregset.GetByteSize()); 25 m_gpr.SetData(m_gpr_buffer); 26 m_gpr.SetByteOrder(gpregset.GetByteOrder()); 27 28 m_fpregset = getRegset( 29 notes, m_register_info_up->GetTargetArchitecture().GetTriple(), FPR_Desc); 30 } 31 32 RegisterContextCorePOSIX_arm64::~RegisterContextCorePOSIX_arm64() {} 33 34 bool RegisterContextCorePOSIX_arm64::ReadGPR() { return true; } 35 36 bool RegisterContextCorePOSIX_arm64::ReadFPR() { return false; } 37 38 bool RegisterContextCorePOSIX_arm64::WriteGPR() { 39 assert(0); 40 return false; 41 } 42 43 bool RegisterContextCorePOSIX_arm64::WriteFPR() { 44 assert(0); 45 return false; 46 } 47 48 bool RegisterContextCorePOSIX_arm64::ReadRegister(const RegisterInfo *reg_info, 49 RegisterValue &value) { 50 lldb::offset_t offset = reg_info->byte_offset; 51 if (offset + reg_info->byte_size <= GetGPRSize()) { 52 uint64_t v = m_gpr.GetMaxU64(&offset, reg_info->byte_size); 53 if (offset == reg_info->byte_offset + reg_info->byte_size) { 54 value = v; 55 return true; 56 } 57 } 58 59 const uint32_t reg = reg_info->kinds[lldb::eRegisterKindLLDB]; 60 if (reg == LLDB_INVALID_REGNUM) 61 return false; 62 63 offset -= GetGPRSize(); 64 if (IsFPR(reg) && offset + reg_info->byte_size <= GetFPUSize()) { 65 Status error; 66 value.SetFromMemoryData(reg_info, m_fpregset.GetDataStart() + offset, 67 reg_info->byte_size, lldb::eByteOrderLittle, error); 68 return error.Success(); 69 } 70 71 return false; 72 } 73 74 bool RegisterContextCorePOSIX_arm64::ReadAllRegisterValues( 75 lldb::DataBufferSP &data_sp) { 76 return false; 77 } 78 79 bool RegisterContextCorePOSIX_arm64::WriteRegister(const RegisterInfo *reg_info, 80 const RegisterValue &value) { 81 return false; 82 } 83 84 bool RegisterContextCorePOSIX_arm64::WriteAllRegisterValues( 85 const lldb::DataBufferSP &data_sp) { 86 return false; 87 } 88 89 bool RegisterContextCorePOSIX_arm64::HardwareSingleStep(bool enable) { 90 return false; 91 } 92