LLDB mainline
RegisterContextFreeBSDKernelCore_riscv64.cpp
Go to the documentation of this file.
1//===----------------------------------------------------------------------===//
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/Process.h"
12#include "lldb/Target/Thread.h"
14#include "llvm/Support/Endian.h"
15
16#if defined(__FreeBSD__) && defined(__riscv) && __riscv_xlen == 64
17#include <machine/pcb.h>
18#endif
19
20using namespace lldb;
21using namespace lldb_private;
22
25 Thread &thread,
26 std::unique_ptr<RegisterInfoPOSIX_riscv64> register_info_up,
27 lldb::addr_t pcb_addr)
28 : RegisterContextPOSIX_riscv64(thread, std::move(register_info_up)),
29 m_pcb_addr(pcb_addr) {}
30
32
34
36 assert(0);
37 return false;
38}
39
41 assert(0);
42 return false;
43}
44
46 const RegisterInfo *reg_info, RegisterValue &value) {
48 return false;
49
50 // https://cgit.freebsd.org/src/tree/sys/riscv/include/pcb.h
51 struct {
52 llvm::support::ulittle64_t ra;
53 llvm::support::ulittle64_t sp;
54 llvm::support::ulittle64_t gp;
55 llvm::support::ulittle64_t tp;
56 llvm::support::ulittle64_t s[12];
57 } pcb;
58
59#if defined(__FreeBSD__) && defined(__riscv) && __riscv_xlen == 64
60 static_assert(offsetof(struct pcb, pcb_ra) == offsetof(decltype(pcb), ra));
61 static_assert(offsetof(struct pcb, pcb_sp) == offsetof(decltype(pcb), sp));
62 static_assert(offsetof(struct pcb, pcb_gp) == offsetof(decltype(pcb), gp));
63 static_assert(offsetof(struct pcb, pcb_tp) == offsetof(decltype(pcb), tp));
64 static_assert(offsetof(struct pcb, pcb_s) == offsetof(decltype(pcb), s));
65#endif
66
68 size_t rd =
69 m_thread.GetProcess()->ReadMemory(m_pcb_addr, &pcb, sizeof(pcb), error);
70 if (rd != sizeof(pcb))
71 return false;
72
73 uint32_t reg = reg_info->kinds[lldb::eRegisterKindLLDB];
74 switch (reg) {
75 case gpr_pc_riscv:
76 case gpr_ra_riscv:
77 // Supply the RA as PC as well to simulate the PC as if the thread had just
78 // returned.
79 value = pcb.ra;
80 break;
81 case gpr_sp_riscv:
82 value = pcb.sp;
83 break;
84 case gpr_gp_riscv:
85 value = pcb.gp;
86 break;
87 case gpr_tp_riscv:
88 value = pcb.tp;
89 break;
90 case gpr_fp_riscv:
91 value = pcb.s[0];
92 break;
93 case gpr_s1_riscv:
94 value = pcb.s[1];
95 break;
96 case gpr_s2_riscv:
97 case gpr_s3_riscv:
98 case gpr_s4_riscv:
99 case gpr_s5_riscv:
100 case gpr_s6_riscv:
101 case gpr_s7_riscv:
102 case gpr_s8_riscv:
103 case gpr_s9_riscv:
104 case gpr_s10_riscv:
105 case gpr_s11_riscv:
106 value = pcb.s[reg - gpr_s2_riscv + 2];
107 break;
108 default:
109 return false;
110 }
111 return true;
112}
113
115 const RegisterInfo *reg_info, const RegisterValue &value) {
116 return false;
117}
static llvm::raw_ostream & error(Stream &strm)
bool ReadRegister(const lldb_private::RegisterInfo *reg_info, lldb_private::RegisterValue &value) override
RegisterContextFreeBSDKernelCore_riscv64(lldb_private::Thread &thread, std::unique_ptr< RegisterInfoPOSIX_riscv64 > register_info_up, lldb::addr_t pcb_addr)
bool WriteRegister(const lldb_private::RegisterInfo *reg_info, const lldb_private::RegisterValue &value) override
RegisterContextPOSIX_riscv64(lldb_private::Thread &thread, std::unique_ptr< RegisterInfoPOSIX_riscv64 > register_info)
An error handling class.
Definition Status.h:118
#define LLDB_INVALID_ADDRESS
A class that represents a running process on the host machine.
uint64_t addr_t
Definition lldb-types.h:80
@ eRegisterKindLLDB
lldb's internal register numbers
Every register is described in detail including its name, alternate name (optional),...
uint32_t kinds[lldb::kNumRegisterKinds]
Holds all of the various register numbers for all register kinds.