180814287SRaphael Isemann //===-- RegisterContextKDP_arm.cpp ----------------------------------------===//
2a63d08c9SGreg Clayton //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6a63d08c9SGreg Clayton //
7a63d08c9SGreg Clayton //===----------------------------------------------------------------------===//
8a63d08c9SGreg Clayton 
9a63d08c9SGreg Clayton #include "RegisterContextKDP_arm.h"
10a63d08c9SGreg Clayton 
11a63d08c9SGreg Clayton #include "ProcessKDP.h"
12a63d08c9SGreg Clayton #include "ThreadKDP.h"
13a63d08c9SGreg Clayton 
14a63d08c9SGreg Clayton using namespace lldb;
15a63d08c9SGreg Clayton using namespace lldb_private;
16a63d08c9SGreg Clayton 
RegisterContextKDP_arm(ThreadKDP & thread,uint32_t concrete_frame_idx)17b9c1b51eSKate Stone RegisterContextKDP_arm::RegisterContextKDP_arm(ThreadKDP &thread,
18b9c1b51eSKate Stone                                                uint32_t concrete_frame_idx)
19b9c1b51eSKate Stone     : RegisterContextDarwin_arm(thread, concrete_frame_idx),
20b9c1b51eSKate Stone       m_kdp_thread(thread) {}
21a63d08c9SGreg Clayton 
22*fd2433e1SJonas Devlieghere RegisterContextKDP_arm::~RegisterContextKDP_arm() = default;
23a63d08c9SGreg Clayton 
DoReadGPR(lldb::tid_t tid,int flavor,GPR & gpr)24b9c1b51eSKate Stone int RegisterContextKDP_arm::DoReadGPR(lldb::tid_t tid, int flavor, GPR &gpr) {
251ac04c30SGreg Clayton   ProcessSP process_sp(CalculateProcess());
26b9c1b51eSKate Stone   if (process_sp) {
2797206d57SZachary Turner     Status error;
28b9c1b51eSKate Stone     if (static_cast<ProcessKDP *>(process_sp.get())
29b9c1b51eSKate Stone             ->GetCommunication()
30b9c1b51eSKate Stone             .SendRequestReadRegisters(tid, GPRRegSet, &gpr, sizeof(gpr),
31b9c1b51eSKate Stone                                       error)) {
32a63d08c9SGreg Clayton       if (error.Success())
33a63d08c9SGreg Clayton         return 0;
34a63d08c9SGreg Clayton     }
351ac04c30SGreg Clayton   }
36a63d08c9SGreg Clayton   return -1;
37a63d08c9SGreg Clayton }
38a63d08c9SGreg Clayton 
DoReadFPU(lldb::tid_t tid,int flavor,FPU & fpu)39b9c1b51eSKate Stone int RegisterContextKDP_arm::DoReadFPU(lldb::tid_t tid, int flavor, FPU &fpu) {
401ac04c30SGreg Clayton   ProcessSP process_sp(CalculateProcess());
41b9c1b51eSKate Stone   if (process_sp) {
4297206d57SZachary Turner     Status error;
43b9c1b51eSKate Stone     if (static_cast<ProcessKDP *>(process_sp.get())
44b9c1b51eSKate Stone             ->GetCommunication()
45b9c1b51eSKate Stone             .SendRequestReadRegisters(tid, FPURegSet, &fpu, sizeof(fpu),
46b9c1b51eSKate Stone                                       error)) {
470c54d8a9SGreg Clayton       if (error.Success())
480c54d8a9SGreg Clayton         return 0;
490c54d8a9SGreg Clayton     }
501ac04c30SGreg Clayton   }
51a63d08c9SGreg Clayton   return -1;
52a63d08c9SGreg Clayton }
53a63d08c9SGreg Clayton 
DoReadEXC(lldb::tid_t tid,int flavor,EXC & exc)54b9c1b51eSKate Stone int RegisterContextKDP_arm::DoReadEXC(lldb::tid_t tid, int flavor, EXC &exc) {
551ac04c30SGreg Clayton   ProcessSP process_sp(CalculateProcess());
56b9c1b51eSKate Stone   if (process_sp) {
5797206d57SZachary Turner     Status error;
58b9c1b51eSKate Stone     if (static_cast<ProcessKDP *>(process_sp.get())
59b9c1b51eSKate Stone             ->GetCommunication()
60b9c1b51eSKate Stone             .SendRequestReadRegisters(tid, EXCRegSet, &exc, sizeof(exc),
61b9c1b51eSKate Stone                                       error)) {
620c54d8a9SGreg Clayton       if (error.Success())
630c54d8a9SGreg Clayton         return 0;
640c54d8a9SGreg Clayton     }
651ac04c30SGreg Clayton   }
66a63d08c9SGreg Clayton   return -1;
67a63d08c9SGreg Clayton }
68a63d08c9SGreg Clayton 
DoReadDBG(lldb::tid_t tid,int flavor,DBG & dbg)69b9c1b51eSKate Stone int RegisterContextKDP_arm::DoReadDBG(lldb::tid_t tid, int flavor, DBG &dbg) {
701ac04c30SGreg Clayton   ProcessSP process_sp(CalculateProcess());
71b9c1b51eSKate Stone   if (process_sp) {
7297206d57SZachary Turner     Status error;
73b9c1b51eSKate Stone     if (static_cast<ProcessKDP *>(process_sp.get())
74b9c1b51eSKate Stone             ->GetCommunication()
75b9c1b51eSKate Stone             .SendRequestReadRegisters(tid, DBGRegSet, &dbg, sizeof(dbg),
76b9c1b51eSKate Stone                                       error)) {
770c54d8a9SGreg Clayton       if (error.Success())
780c54d8a9SGreg Clayton         return 0;
790c54d8a9SGreg Clayton     }
801ac04c30SGreg Clayton   }
81a63d08c9SGreg Clayton   return -1;
82a63d08c9SGreg Clayton }
83a63d08c9SGreg Clayton 
DoWriteGPR(lldb::tid_t tid,int flavor,const GPR & gpr)84b9c1b51eSKate Stone int RegisterContextKDP_arm::DoWriteGPR(lldb::tid_t tid, int flavor,
85b9c1b51eSKate Stone                                        const GPR &gpr) {
864b1b8b3eSGreg Clayton   ProcessSP process_sp(CalculateProcess());
87b9c1b51eSKate Stone   if (process_sp) {
8897206d57SZachary Turner     Status error;
89b9c1b51eSKate Stone     if (static_cast<ProcessKDP *>(process_sp.get())
90b9c1b51eSKate Stone             ->GetCommunication()
91b9c1b51eSKate Stone             .SendRequestWriteRegisters(tid, GPRRegSet, &gpr, sizeof(gpr),
92b9c1b51eSKate Stone                                        error)) {
934b1b8b3eSGreg Clayton       if (error.Success())
944b1b8b3eSGreg Clayton         return 0;
954b1b8b3eSGreg Clayton     }
964b1b8b3eSGreg Clayton   }
97a63d08c9SGreg Clayton   return -1;
98a63d08c9SGreg Clayton }
99a63d08c9SGreg Clayton 
DoWriteFPU(lldb::tid_t tid,int flavor,const FPU & fpu)100b9c1b51eSKate Stone int RegisterContextKDP_arm::DoWriteFPU(lldb::tid_t tid, int flavor,
101b9c1b51eSKate Stone                                        const FPU &fpu) {
1024b1b8b3eSGreg Clayton   ProcessSP process_sp(CalculateProcess());
103b9c1b51eSKate Stone   if (process_sp) {
10497206d57SZachary Turner     Status error;
105b9c1b51eSKate Stone     if (static_cast<ProcessKDP *>(process_sp.get())
106b9c1b51eSKate Stone             ->GetCommunication()
107b9c1b51eSKate Stone             .SendRequestWriteRegisters(tid, FPURegSet, &fpu, sizeof(fpu),
108b9c1b51eSKate Stone                                        error)) {
1094b1b8b3eSGreg Clayton       if (error.Success())
1104b1b8b3eSGreg Clayton         return 0;
1114b1b8b3eSGreg Clayton     }
1124b1b8b3eSGreg Clayton   }
113a63d08c9SGreg Clayton   return -1;
114a63d08c9SGreg Clayton }
115a63d08c9SGreg Clayton 
DoWriteEXC(lldb::tid_t tid,int flavor,const EXC & exc)116b9c1b51eSKate Stone int RegisterContextKDP_arm::DoWriteEXC(lldb::tid_t tid, int flavor,
117b9c1b51eSKate Stone                                        const EXC &exc) {
1184b1b8b3eSGreg Clayton   ProcessSP process_sp(CalculateProcess());
119b9c1b51eSKate Stone   if (process_sp) {
12097206d57SZachary Turner     Status error;
121b9c1b51eSKate Stone     if (static_cast<ProcessKDP *>(process_sp.get())
122b9c1b51eSKate Stone             ->GetCommunication()
123b9c1b51eSKate Stone             .SendRequestWriteRegisters(tid, EXCRegSet, &exc, sizeof(exc),
124b9c1b51eSKate Stone                                        error)) {
1254b1b8b3eSGreg Clayton       if (error.Success())
1264b1b8b3eSGreg Clayton         return 0;
1274b1b8b3eSGreg Clayton     }
1284b1b8b3eSGreg Clayton   }
129a63d08c9SGreg Clayton   return -1;
130a63d08c9SGreg Clayton }
131a63d08c9SGreg Clayton 
DoWriteDBG(lldb::tid_t tid,int flavor,const DBG & dbg)132b9c1b51eSKate Stone int RegisterContextKDP_arm::DoWriteDBG(lldb::tid_t tid, int flavor,
133b9c1b51eSKate Stone                                        const DBG &dbg) {
1344b1b8b3eSGreg Clayton   ProcessSP process_sp(CalculateProcess());
135b9c1b51eSKate Stone   if (process_sp) {
13697206d57SZachary Turner     Status error;
137b9c1b51eSKate Stone     if (static_cast<ProcessKDP *>(process_sp.get())
138b9c1b51eSKate Stone             ->GetCommunication()
139b9c1b51eSKate Stone             .SendRequestWriteRegisters(tid, DBGRegSet, &dbg, sizeof(dbg),
140b9c1b51eSKate Stone                                        error)) {
1414b1b8b3eSGreg Clayton       if (error.Success())
1424b1b8b3eSGreg Clayton         return 0;
1434b1b8b3eSGreg Clayton     }
1444b1b8b3eSGreg Clayton   }
145a63d08c9SGreg Clayton   return -1;
146a63d08c9SGreg Clayton }
147