1//===-- RegisterContextPOSIXCore_riscv32.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_riscv32.h"
10#include "lldb/Utility/DataBufferHeap.h"
11
12using namespace lldb_private;
13
14std::unique_ptr<RegisterContextCorePOSIX_riscv32>
15RegisterContextCorePOSIX_riscv32::Create(Thread &thread, const ArchSpec &arch,
16 const DataExtractor &gpregset,
17 llvm::ArrayRef<CoreNote> notes) {
18 Flags opt_regsets = RegisterInfoPOSIX_riscv32::eRegsetMaskDefault;
19
20 return std::unique_ptr<RegisterContextCorePOSIX_riscv32>(
21 new RegisterContextCorePOSIX_riscv32(
22 thread,
23 std::make_unique<RegisterInfoPOSIX_riscv32>(args: arch, args&: opt_regsets),
24 gpregset, notes));
25}
26
27RegisterContextCorePOSIX_riscv32::RegisterContextCorePOSIX_riscv32(
28 Thread &thread, std::unique_ptr<RegisterInfoPOSIX_riscv32> register_info,
29 const DataExtractor &gpregset, llvm::ArrayRef<CoreNote> notes)
30 : RegisterContextPOSIX_riscv32(thread, std::move(register_info)) {
31
32 m_gpr.SetData(data_sp: std::make_shared<DataBufferHeap>(args: gpregset.GetDataStart(),
33 args: gpregset.GetByteSize()));
34 m_gpr.SetByteOrder(gpregset.GetByteOrder());
35
36 if (m_register_info_up->IsFPPresent()) {
37 ArchSpec arch = m_register_info_up->GetTargetArchitecture();
38 m_fpr = getRegset(Notes: notes, Triple: arch.GetTriple(), RegsetDescs: FPR_Desc);
39 }
40}
41
42RegisterContextCorePOSIX_riscv32::~RegisterContextCorePOSIX_riscv32() = default;
43
44bool RegisterContextCorePOSIX_riscv32::ReadGPR() { return true; }
45
46bool RegisterContextCorePOSIX_riscv32::ReadFPR() { return true; }
47
48bool RegisterContextCorePOSIX_riscv32::WriteGPR() {
49 assert(false && "Writing registers is not allowed for core dumps");
50 return false;
51}
52
53bool RegisterContextCorePOSIX_riscv32::WriteFPR() {
54 assert(false && "Writing registers is not allowed for core dumps");
55 return false;
56}
57
58bool RegisterContextCorePOSIX_riscv32::ReadRegister(
59 const RegisterInfo *reg_info, RegisterValue &value) {
60 const uint8_t *src = nullptr;
61 lldb::offset_t offset = reg_info->byte_offset;
62
63 if (IsGPR(reg: reg_info->kinds[lldb::eRegisterKindLLDB])) {
64 src = m_gpr.GetDataStart();
65 } else if (IsFPR(reg: reg_info->kinds[lldb::eRegisterKindLLDB])) {
66 src = m_fpr.GetDataStart();
67 offset -= GetGPRSize();
68 } else {
69 return false;
70 }
71
72 Status error;
73 value.SetFromMemoryData(reg_info: *reg_info, src: src + offset, src_len: reg_info->byte_size,
74 src_byte_order: lldb::eByteOrderLittle, error);
75 return error.Success();
76}
77
78bool RegisterContextCorePOSIX_riscv32::WriteRegister(
79 const RegisterInfo *reg_info, const RegisterValue &value) {
80 return false;
81}
82

source code of lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_riscv32.cpp