1 //===-- RegisterContextKDP_x86_64.cpp -------------------------------------===// 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 9 #include "RegisterContextKDP_x86_64.h" 10 #include "ProcessKDP.h" 11 #include "ThreadKDP.h" 12 13 using namespace lldb; 14 using namespace lldb_private; 15 16 RegisterContextKDP_x86_64::RegisterContextKDP_x86_64( 17 ThreadKDP &thread, uint32_t concrete_frame_idx) 18 : RegisterContextDarwin_x86_64(thread, concrete_frame_idx), 19 m_kdp_thread(thread) {} 20 21 RegisterContextKDP_x86_64::~RegisterContextKDP_x86_64() = default; 22 23 int RegisterContextKDP_x86_64::DoReadGPR(lldb::tid_t tid, int flavor, 24 GPR &gpr) { 25 ProcessSP process_sp(CalculateProcess()); 26 if (process_sp) { 27 Status error; 28 if (static_cast<ProcessKDP *>(process_sp.get()) 29 ->GetCommunication() 30 .SendRequestReadRegisters(tid, GPRRegSet, &gpr, sizeof(gpr), 31 error)) { 32 if (error.Success()) 33 return 0; 34 } 35 } 36 return -1; 37 } 38 39 int RegisterContextKDP_x86_64::DoReadFPU(lldb::tid_t tid, int flavor, 40 FPU &fpu) { 41 ProcessSP process_sp(CalculateProcess()); 42 if (process_sp) { 43 Status error; 44 if (static_cast<ProcessKDP *>(process_sp.get()) 45 ->GetCommunication() 46 .SendRequestReadRegisters(tid, FPURegSet, &fpu, sizeof(fpu), 47 error)) { 48 if (error.Success()) 49 return 0; 50 } 51 } 52 return -1; 53 } 54 55 int RegisterContextKDP_x86_64::DoReadEXC(lldb::tid_t tid, int flavor, 56 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_x86_64::DoWriteGPR(lldb::tid_t tid, int flavor, 72 const GPR &gpr) { 73 ProcessSP process_sp(CalculateProcess()); 74 if (process_sp) { 75 Status error; 76 if (static_cast<ProcessKDP *>(process_sp.get()) 77 ->GetCommunication() 78 .SendRequestWriteRegisters(tid, GPRRegSet, &gpr, sizeof(gpr), 79 error)) { 80 if (error.Success()) 81 return 0; 82 } 83 } 84 return -1; 85 } 86 87 int RegisterContextKDP_x86_64::DoWriteFPU(lldb::tid_t tid, int flavor, 88 const FPU &fpu) { 89 ProcessSP process_sp(CalculateProcess()); 90 if (process_sp) { 91 Status error; 92 if (static_cast<ProcessKDP *>(process_sp.get()) 93 ->GetCommunication() 94 .SendRequestWriteRegisters(tid, FPURegSet, &fpu, sizeof(fpu), 95 error)) { 96 if (error.Success()) 97 return 0; 98 } 99 } 100 return -1; 101 } 102 103 int RegisterContextKDP_x86_64::DoWriteEXC(lldb::tid_t tid, int flavor, 104 const EXC &exc) { 105 ProcessSP process_sp(CalculateProcess()); 106 if (process_sp) { 107 Status error; 108 if (static_cast<ProcessKDP *>(process_sp.get()) 109 ->GetCommunication() 110 .SendRequestWriteRegisters(tid, EXCRegSet, &exc, sizeof(exc), 111 error)) { 112 if (error.Success()) 113 return 0; 114 } 115 } 116 return -1; 117 } 118