1 //===-- RegisterContextKDP_arm64.cpp ------------------------------*- C++
2 //-*-===//
3 //
4 //                     The LLVM Compiler Infrastructure
5 //
6 // This file is distributed under the University of Illinois Open Source
7 // License. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10 
11 #include "RegisterContextKDP_arm64.h"
12 
13 #include "ProcessKDP.h"
14 #include "ThreadKDP.h"
15 
16 using namespace lldb;
17 using namespace lldb_private;
18 
19 RegisterContextKDP_arm64::RegisterContextKDP_arm64(ThreadKDP &thread,
20                                                    uint32_t concrete_frame_idx)
21     : RegisterContextDarwin_arm64(thread, concrete_frame_idx),
22       m_kdp_thread(thread) {}
23 
24 RegisterContextKDP_arm64::~RegisterContextKDP_arm64() {}
25 
26 int RegisterContextKDP_arm64::DoReadGPR(lldb::tid_t tid, int flavor, GPR &gpr) {
27   ProcessSP process_sp(CalculateProcess());
28   if (process_sp) {
29     Status error;
30     if (static_cast<ProcessKDP *>(process_sp.get())
31             ->GetCommunication()
32             .SendRequestReadRegisters(tid, GPRRegSet, &gpr, sizeof(gpr),
33                                       error)) {
34       if (error.Success())
35         return 0;
36     }
37   }
38   return -1;
39 }
40 
41 int RegisterContextKDP_arm64::DoReadFPU(lldb::tid_t tid, int flavor, FPU &fpu) {
42   ProcessSP process_sp(CalculateProcess());
43   if (process_sp) {
44     Status error;
45     if (static_cast<ProcessKDP *>(process_sp.get())
46             ->GetCommunication()
47             .SendRequestReadRegisters(tid, FPURegSet, &fpu, sizeof(fpu),
48                                       error)) {
49       if (error.Success())
50         return 0;
51     }
52   }
53   return -1;
54 }
55 
56 int RegisterContextKDP_arm64::DoReadEXC(lldb::tid_t tid, int flavor, EXC &exc) {
57   ProcessSP process_sp(CalculateProcess());
58   if (process_sp) {
59     Status error;
60     if (static_cast<ProcessKDP *>(process_sp.get())
61             ->GetCommunication()
62             .SendRequestReadRegisters(tid, EXCRegSet, &exc, sizeof(exc),
63                                       error)) {
64       if (error.Success())
65         return 0;
66     }
67   }
68   return -1;
69 }
70 
71 int RegisterContextKDP_arm64::DoReadDBG(lldb::tid_t tid, int flavor, DBG &dbg) {
72   ProcessSP process_sp(CalculateProcess());
73   if (process_sp) {
74     Status error;
75     if (static_cast<ProcessKDP *>(process_sp.get())
76             ->GetCommunication()
77             .SendRequestReadRegisters(tid, DBGRegSet, &dbg, sizeof(dbg),
78                                       error)) {
79       if (error.Success())
80         return 0;
81     }
82   }
83   return -1;
84 }
85 
86 int RegisterContextKDP_arm64::DoWriteGPR(lldb::tid_t tid, int flavor,
87                                          const GPR &gpr) {
88   ProcessSP process_sp(CalculateProcess());
89   if (process_sp) {
90     Status error;
91     if (static_cast<ProcessKDP *>(process_sp.get())
92             ->GetCommunication()
93             .SendRequestWriteRegisters(tid, GPRRegSet, &gpr, sizeof(gpr),
94                                        error)) {
95       if (error.Success())
96         return 0;
97     }
98   }
99   return -1;
100 }
101 
102 int RegisterContextKDP_arm64::DoWriteFPU(lldb::tid_t tid, int flavor,
103                                          const FPU &fpu) {
104   ProcessSP process_sp(CalculateProcess());
105   if (process_sp) {
106     Status error;
107     if (static_cast<ProcessKDP *>(process_sp.get())
108             ->GetCommunication()
109             .SendRequestWriteRegisters(tid, FPURegSet, &fpu, sizeof(fpu),
110                                        error)) {
111       if (error.Success())
112         return 0;
113     }
114   }
115   return -1;
116 }
117 
118 int RegisterContextKDP_arm64::DoWriteEXC(lldb::tid_t tid, int flavor,
119                                          const EXC &exc) {
120   ProcessSP process_sp(CalculateProcess());
121   if (process_sp) {
122     Status error;
123     if (static_cast<ProcessKDP *>(process_sp.get())
124             ->GetCommunication()
125             .SendRequestWriteRegisters(tid, EXCRegSet, &exc, sizeof(exc),
126                                        error)) {
127       if (error.Success())
128         return 0;
129     }
130   }
131   return -1;
132 }
133 
134 int RegisterContextKDP_arm64::DoWriteDBG(lldb::tid_t tid, int flavor,
135                                          const DBG &dbg) {
136   ProcessSP process_sp(CalculateProcess());
137   if (process_sp) {
138     Status error;
139     if (static_cast<ProcessKDP *>(process_sp.get())
140             ->GetCommunication()
141             .SendRequestWriteRegisters(tid, DBGRegSet, &dbg, sizeof(dbg),
142                                        error)) {
143       if (error.Success())
144         return 0;
145     }
146   }
147   return -1;
148 }
149