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