1//===-- RegisterContextPOSIXCore_x86_64.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_x86_64.h" 10#include "lldb/Target/Thread.h" 11#include "lldb/Utility/DataExtractor.h" 12#include "lldb/Utility/RegisterValue.h" 13 14using namespace lldb_private; 15 16RegisterContextCorePOSIX_x86_64::RegisterContextCorePOSIX_x86_64( 17 Thread &thread, RegisterInfoInterface *register_info, 18 const DataExtractor &gpregset, llvm::ArrayRef<CoreNote> notes) 19 : RegisterContextPOSIX_x86(thread, 0, register_info) { 20 size_t size, len; 21 22 size = GetGPRSize(); 23 m_gpregset.reset(new uint8_t[size]); 24 len = 25 gpregset.ExtractBytes(0, size, lldb::eByteOrderLittle, m_gpregset.get()); 26 if (len != size) 27 m_gpregset.reset(); 28 29 DataExtractor fpregset = getRegset( 30 notes, register_info->GetTargetArchitecture().GetTriple(), FPR_Desc); 31 size = sizeof(FXSAVE); 32 m_fpregset.reset(new uint8_t[size]); 33 len = 34 fpregset.ExtractBytes(0, size, lldb::eByteOrderLittle, m_fpregset.get()); 35 if (len != size) 36 m_fpregset.reset(); 37} 38 39bool RegisterContextCorePOSIX_x86_64::ReadGPR() { 40 return m_gpregset != nullptr; 41} 42 43bool RegisterContextCorePOSIX_x86_64::ReadFPR() { 44 return m_fpregset != nullptr; 45} 46 47bool RegisterContextCorePOSIX_x86_64::WriteGPR() { 48 assert(0); 49 return false; 50} 51 52bool RegisterContextCorePOSIX_x86_64::WriteFPR() { 53 assert(0); 54 return false; 55} 56 57bool RegisterContextCorePOSIX_x86_64::ReadRegister(const RegisterInfo *reg_info, 58 RegisterValue &value) { 59 const uint8_t *src; 60 size_t offset; 61 const size_t fxsave_offset = reg_info->byte_offset - GetFXSAVEOffset(); 62 // make the offset relative to the beginning of the FXSAVE structure because 63 // this is the data that we have (not the entire UserArea) 64 65 if (m_gpregset && reg_info->byte_offset < GetGPRSize()) { 66 src = m_gpregset.get(); 67 offset = reg_info->byte_offset; 68 } else if (m_fpregset && fxsave_offset < sizeof(FXSAVE)) { 69 src = m_fpregset.get(); 70 offset = fxsave_offset; 71 } else { 72 return false; 73 } 74 75 Status error; 76 value.SetFromMemoryData(*reg_info, src + offset, reg_info->byte_size, 77 lldb::eByteOrderLittle, error); 78 79 return error.Success(); 80} 81 82bool RegisterContextCorePOSIX_x86_64::ReadAllRegisterValues( 83 lldb::WritableDataBufferSP &data_sp) { 84 return false; 85} 86 87bool RegisterContextCorePOSIX_x86_64::WriteRegister( 88 const RegisterInfo *reg_info, const RegisterValue &value) { 89 return false; 90} 91 92bool RegisterContextCorePOSIX_x86_64::WriteAllRegisterValues( 93 const lldb::DataBufferSP &data_sp) { 94 return false; 95} 96 97bool RegisterContextCorePOSIX_x86_64::HardwareSingleStep(bool enable) { 98 return false; 99} 100