LLDB mainline
RegisterContextFreeBSDKernelCore_ppc64le.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(__powerpc64__) && defined(__LITTLE_ENDIAN__)
17#include <machine/pcb.h>
18#endif
19
20using namespace lldb;
21using namespace lldb_private;
22
29
31 const RegisterInfo *reg_info, RegisterValue &value) {
33 return false;
34
35 // https://cgit.freebsd.org/src/tree/sys/powerpc/include/pcb.h
36 struct {
37 llvm::support::ulittle64_t context[20];
38 llvm::support::ulittle64_t cr;
39 llvm::support::ulittle64_t sp;
40 llvm::support::ulittle64_t toc;
41 llvm::support::ulittle64_t lr;
42 } pcb;
43
44#if defined(__FreeBSD__) && defined(__powerpc64__) && defined(__LITTLE_ENDIAN__)
45 static_assert(offsetof(struct pcb, pcb_context) ==
46 offsetof(decltype(pcb), context));
47 static_assert(offsetof(struct pcb, pcb_cr) == offsetof(decltype(pcb), cr));
48 static_assert(offsetof(struct pcb, pcb_sp) == offsetof(decltype(pcb), sp));
49 static_assert(offsetof(struct pcb, pcb_toc) == offsetof(decltype(pcb), toc));
50 static_assert(offsetof(struct pcb, pcb_lr) == offsetof(decltype(pcb), lr));
51#endif
52
54 size_t rd =
55 m_thread.GetProcess()->ReadMemory(m_pcb_addr, &pcb, sizeof(pcb), error);
56 if (rd != sizeof(pcb))
57 return false;
58
59 uint32_t reg = reg_info->kinds[lldb::eRegisterKindLLDB];
60 switch (reg) {
61 case gpr_r1_ppc64le:
62 // r1 is saved in the sp field
63 value = pcb.sp;
64 break;
65 case gpr_r2_ppc64le:
66 // r2 is saved in the toc field
67 value = pcb.toc;
68 break;
69 case gpr_r12_ppc64le:
70 case gpr_r13_ppc64le:
71 case gpr_r14_ppc64le:
72 case gpr_r15_ppc64le:
73 case gpr_r16_ppc64le:
74 case gpr_r17_ppc64le:
75 case gpr_r18_ppc64le:
76 case gpr_r19_ppc64le:
77 case gpr_r20_ppc64le:
78 case gpr_r21_ppc64le:
79 case gpr_r22_ppc64le:
80 case gpr_r23_ppc64le:
81 case gpr_r24_ppc64le:
82 case gpr_r25_ppc64le:
83 case gpr_r26_ppc64le:
84 case gpr_r27_ppc64le:
85 case gpr_r28_ppc64le:
86 case gpr_r29_ppc64le:
87 case gpr_r30_ppc64le:
88 case gpr_r31_ppc64le:
89 value = pcb.context[reg - gpr_r12_ppc64le];
90 break;
91 case gpr_pc_ppc64le:
92 case gpr_lr_ppc64le:
93 // The pc of crashing thread is stored in lr.
94 value = pcb.lr;
95 break;
96 case gpr_cr_ppc64le:
97 value = pcb.cr;
98 break;
99 default:
100 return false;
101 }
102 return true;
103}
104
106 const RegisterInfo *reg_info, const RegisterValue &value) {
107 return false;
108}
static llvm::raw_ostream & error(Stream &strm)
RegisterContextFreeBSDKernelCore_ppc64le(lldb_private::Thread &thread, lldb_private::RegisterInfoInterface *register_info, lldb::addr_t pcb_addr)
bool WriteRegister(const lldb_private::RegisterInfo *reg_info, const lldb_private::RegisterValue &value) override
bool ReadRegister(const lldb_private::RegisterInfo *reg_info, lldb_private::RegisterValue &value) override
RegisterContextPOSIX_ppc64le(lldb_private::Thread &thread, uint32_t concrete_frame_idx, lldb_private::RegisterInfoInterface *register_info)
RegisterInfo interface to patch RegisterInfo structure for archs.
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.