LLDB  mainline
RegisterContextPOSIXCore_s390x.cpp
Go to the documentation of this file.
1 //===-- RegisterContextPOSIXCore_s390x.cpp ----------------------*- 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 
10 
11 #include "lldb/Target/Thread.h"
14 
15 #include <memory>
16 
17 using namespace lldb_private;
18 
20  Thread &thread, RegisterInfoInterface *register_info,
21  const DataExtractor &gpregset, llvm::ArrayRef<CoreNote> notes)
22  : RegisterContextPOSIX_s390x(thread, 0, 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  DataExtractor fpregset = getRegset(
29  notes, register_info->GetTargetArchitecture().GetTriple(), FPR_Desc);
30  m_fpr_buffer = std::make_shared<DataBufferHeap>(fpregset.GetDataStart(),
31  fpregset.GetByteSize());
32  m_fpr.SetData(m_fpr_buffer);
33  m_fpr.SetByteOrder(fpregset.GetByteOrder());
34 }
35 
37 
39 
41 
43  assert(0);
44  return false;
45 }
46 
48  assert(0);
49  return false;
50 }
51 
52 bool RegisterContextCorePOSIX_s390x::ReadRegister(const RegisterInfo *reg_info,
53  RegisterValue &value) {
54  const uint32_t reg = reg_info->kinds[lldb::eRegisterKindLLDB];
55  if (reg == LLDB_INVALID_REGNUM)
56  return false;
57 
58  if (IsGPR(reg)) {
59  lldb::offset_t offset = reg_info->byte_offset;
60  uint64_t v = m_gpr.GetMaxU64(&offset, reg_info->byte_size);
61  if (offset == reg_info->byte_offset + reg_info->byte_size) {
62  value.SetUInt(v, reg_info->byte_size);
63  return true;
64  }
65  }
66 
67  if (IsFPR(reg)) {
68  lldb::offset_t offset = reg_info->byte_offset;
69  uint64_t v = m_fpr.GetMaxU64(&offset, reg_info->byte_size);
70  if (offset == reg_info->byte_offset + reg_info->byte_size) {
71  value.SetUInt(v, reg_info->byte_size);
72  return true;
73  }
74  }
75 
76  return false;
77 }
78 
80  lldb::DataBufferSP &data_sp) {
81  return false;
82 }
83 
84 bool RegisterContextCorePOSIX_s390x::WriteRegister(const RegisterInfo *reg_info,
85  const RegisterValue &value) {
86  return false;
87 }
88 
90  const lldb::DataBufferSP &data_sp) {
91  return false;
92 }
93 
95  return false;
96 }
An data extractor class.
Definition: DataExtractor.h:47
bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override
Enumerations for broadcasting.
Definition: SBLaunchInfo.h:14
bool ReadAllRegisterValues(lldb::DataBufferSP &data_sp) override
RegisterInfo interface to patch RegisterInfo structure for archs.
constexpr RegsetDesc FPR_Desc[]
const lldb_private::ArchSpec & GetTargetArchitecture() const
llvm::Triple & GetTriple()
Architecture triple accessor.
Definition: ArchSpec.h:431
bool SetUInt(uint64_t uint, uint32_t byte_size)
lldb::offset_t SetData(const void *bytes, lldb::offset_t length, lldb::ByteOrder byte_order)
Set data with a buffer that is caller owned.
uint64_t offset_t
Definition: lldb-types.h:87
lldb::ByteOrder GetByteOrder() const
Get the current byte order value.
uint64_t GetMaxU64(lldb::offset_t *offset_ptr, size_t byte_size) const
Extract an unsigned integer of size byte_size from *offset_ptr.
uint64_t GetByteSize() const
Get the number of bytes contained in this object.
DataExtractor getRegset(llvm::ArrayRef< CoreNote > Notes, const llvm::Triple &Triple, llvm::ArrayRef< RegsetDesc > RegsetDescs)
RegisterContextCorePOSIX_s390x(lldb_private::Thread &thread, lldb_private::RegisterInfoInterface *register_info, const lldb_private::DataExtractor &gpregset, llvm::ArrayRef< lldb_private::CoreNote > notes)
const uint8_t * GetDataStart() const
Get the data start pointer.
bool ReadRegister(const lldb_private::RegisterInfo *reg_info, lldb_private::RegisterValue &value) override
bool WriteRegister(const lldb_private::RegisterInfo *reg_info, const lldb_private::RegisterValue &value) override
void SetByteOrder(lldb::ByteOrder byte_order)
Set the byte_order value.
#define LLDB_INVALID_REGNUM
Definition: lldb-defines.h:90