1 //===-- RegisterContextFreeBSDKernel_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 "RegisterContextFreeBSDKernel_x86_64.h" 10 11 #include "lldb/Target/Process.h" 12 #include "lldb/Target/Thread.h" 13 #include "lldb/Utility/RegisterValue.h" 14 #include "llvm/Support/Endian.h" 15 16 using namespace lldb; 17 using namespace lldb_private; 18 19 RegisterContextFreeBSDKernel_x86_64::RegisterContextFreeBSDKernel_x86_64( 20 Thread &thread, RegisterInfoInterface *register_info, lldb::addr_t pcb_addr) 21 : RegisterContextPOSIX_x86(thread, 0, register_info), m_pcb_addr(pcb_addr) { 22 } 23 24 bool RegisterContextFreeBSDKernel_x86_64::ReadGPR() { return true; } 25 26 bool RegisterContextFreeBSDKernel_x86_64::ReadFPR() { return true; } 27 28 bool RegisterContextFreeBSDKernel_x86_64::WriteGPR() { 29 assert(0); 30 return false; 31 } 32 33 bool RegisterContextFreeBSDKernel_x86_64::WriteFPR() { 34 assert(0); 35 return false; 36 } 37 38 bool RegisterContextFreeBSDKernel_x86_64::ReadRegister( 39 const RegisterInfo *reg_info, RegisterValue &value) { 40 if (m_pcb_addr == LLDB_INVALID_ADDRESS) 41 return false; 42 43 struct { 44 llvm::support::ulittle64_t r15; 45 llvm::support::ulittle64_t r14; 46 llvm::support::ulittle64_t r13; 47 llvm::support::ulittle64_t r12; 48 llvm::support::ulittle64_t rbp; 49 llvm::support::ulittle64_t rsp; 50 llvm::support::ulittle64_t rbx; 51 llvm::support::ulittle64_t rip; 52 } pcb; 53 54 Status error; 55 size_t rd = 56 m_thread.GetProcess()->ReadMemory(m_pcb_addr, &pcb, sizeof(pcb), error); 57 if (rd != sizeof(pcb)) 58 return false; 59 60 uint32_t reg = reg_info->kinds[lldb::eRegisterKindLLDB]; 61 switch (reg) { 62 #define REG(x) \ 63 case lldb_##x##_x86_64: \ 64 value = pcb.x; \ 65 break; 66 67 REG(r15); 68 REG(r14); 69 REG(r13); 70 REG(r12); 71 REG(rbp); 72 REG(rsp); 73 REG(rbx); 74 REG(rip); 75 76 #undef REG 77 78 default: 79 return false; 80 } 81 82 return true; 83 } 84 85 bool RegisterContextFreeBSDKernel_x86_64::WriteRegister( 86 const RegisterInfo *reg_info, const RegisterValue &value) { 87 return false; 88 } 89