1*061da546Spatrick //===-- NativeRegisterContextOpenBSD.cpp -------------------------*- C++ -*-===//
2*061da546Spatrick //
3*061da546Spatrick // The LLVM Compiler Infrastructure
4*061da546Spatrick //
5*061da546Spatrick // This file is distributed under the University of Illinois Open Source
6*061da546Spatrick // License. See LICENSE.TXT for details.
7*061da546Spatrick //
8*061da546Spatrick //===----------------------------------------------------------------------===//
9*061da546Spatrick
10*061da546Spatrick #include "NativeRegisterContextOpenBSD.h"
11*061da546Spatrick
12*061da546Spatrick #include "lldb/Host/common/NativeProcessProtocol.h"
13*061da546Spatrick
14*061da546Spatrick using namespace lldb_private;
15*061da546Spatrick using namespace lldb_private::process_openbsd;
16*061da546Spatrick
17*061da546Spatrick // clang-format off
18*061da546Spatrick #include <sys/types.h>
19*061da546Spatrick #include <sys/ptrace.h>
20*061da546Spatrick // clang-format on
21*061da546Spatrick
NativeRegisterContextOpenBSD(NativeThreadProtocol & native_thread,RegisterInfoInterface * reg_info_interface_p)22*061da546Spatrick NativeRegisterContextOpenBSD::NativeRegisterContextOpenBSD(
23*061da546Spatrick NativeThreadProtocol &native_thread,
24*061da546Spatrick RegisterInfoInterface *reg_info_interface_p)
25*061da546Spatrick : NativeRegisterContextRegisterInfo(native_thread,
26*061da546Spatrick reg_info_interface_p) {}
27*061da546Spatrick
ReadGPR()28*061da546Spatrick Status NativeRegisterContextOpenBSD::ReadGPR() {
29*061da546Spatrick void *buf = GetGPRBuffer();
30*061da546Spatrick if (!buf)
31*061da546Spatrick return Status("GPR buffer is NULL");
32*061da546Spatrick
33*061da546Spatrick return DoReadGPR(buf);
34*061da546Spatrick }
35*061da546Spatrick
WriteGPR()36*061da546Spatrick Status NativeRegisterContextOpenBSD::WriteGPR() {
37*061da546Spatrick void *buf = GetGPRBuffer();
38*061da546Spatrick if (!buf)
39*061da546Spatrick return Status("GPR buffer is NULL");
40*061da546Spatrick
41*061da546Spatrick return DoWriteGPR(buf);
42*061da546Spatrick }
43*061da546Spatrick
ReadFPR()44*061da546Spatrick Status NativeRegisterContextOpenBSD::ReadFPR() {
45*061da546Spatrick void *buf = GetFPRBuffer();
46*061da546Spatrick if (!buf)
47*061da546Spatrick return Status("FPR buffer is NULL");
48*061da546Spatrick
49*061da546Spatrick return DoReadFPR(buf);
50*061da546Spatrick }
51*061da546Spatrick
WriteFPR()52*061da546Spatrick Status NativeRegisterContextOpenBSD::WriteFPR() {
53*061da546Spatrick void *buf = GetFPRBuffer();
54*061da546Spatrick if (!buf)
55*061da546Spatrick return Status("FPR buffer is NULL");
56*061da546Spatrick
57*061da546Spatrick return DoWriteFPR(buf);
58*061da546Spatrick }
59*061da546Spatrick
DoReadGPR(void * buf)60*061da546Spatrick Status NativeRegisterContextOpenBSD::DoReadGPR(void *buf) {
61*061da546Spatrick #ifdef PT_GETREGS
62*061da546Spatrick return NativeProcessOpenBSD::PtraceWrapper(PT_GETREGS, GetProcessPid(), buf,
63*061da546Spatrick m_thread.GetID());
64*061da546Spatrick #else
65*061da546Spatrick return Status("PT_GETREGS not supported on this platform");
66*061da546Spatrick #endif
67*061da546Spatrick }
68*061da546Spatrick
DoWriteGPR(void * buf)69*061da546Spatrick Status NativeRegisterContextOpenBSD::DoWriteGPR(void *buf) {
70*061da546Spatrick #ifdef PT_SETREGS
71*061da546Spatrick return NativeProcessOpenBSD::PtraceWrapper(PT_SETREGS, GetProcessPid(), buf,
72*061da546Spatrick m_thread.GetID());
73*061da546Spatrick #else
74*061da546Spatrick return Status("PT_SETREGS not supported on this platform");
75*061da546Spatrick #endif
76*061da546Spatrick }
77*061da546Spatrick
DoReadFPR(void * buf)78*061da546Spatrick Status NativeRegisterContextOpenBSD::DoReadFPR(void *buf) {
79*061da546Spatrick #ifdef PT_GETFPREGS
80*061da546Spatrick return NativeProcessOpenBSD::PtraceWrapper(PT_GETFPREGS, GetProcessPid(), buf,
81*061da546Spatrick m_thread.GetID());
82*061da546Spatrick #else
83*061da546Spatrick return Status("PT_GETFPREGS not supported on this platform");
84*061da546Spatrick #endif
85*061da546Spatrick }
86*061da546Spatrick
DoWriteFPR(void * buf)87*061da546Spatrick Status NativeRegisterContextOpenBSD::DoWriteFPR(void *buf) {
88*061da546Spatrick #ifdef PT_SETFPREGS
89*061da546Spatrick return NativeProcessOpenBSD::PtraceWrapper(PT_SETFPREGS, GetProcessPid(), buf,
90*061da546Spatrick m_thread.GetID());
91*061da546Spatrick #else
92*061da546Spatrick return Status("PT_SETFPREGS not supported on this platform");
93*061da546Spatrick #endif
94*061da546Spatrick }
95*061da546Spatrick
GetProcess()96*061da546Spatrick NativeProcessOpenBSD &NativeRegisterContextOpenBSD::GetProcess() {
97*061da546Spatrick return static_cast<NativeProcessOpenBSD &>(m_thread.GetProcess());
98*061da546Spatrick }
99*061da546Spatrick
GetProcessPid()100*061da546Spatrick ::pid_t NativeRegisterContextOpenBSD::GetProcessPid() {
101*061da546Spatrick return GetProcess().GetID();
102*061da546Spatrick }
103