brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.4 KiB · ff57842 Raw
89 lines · cpp
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-exception6//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 16using namespace lldb;17using namespace lldb_private;18 19RegisterContextFreeBSDKernel_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 24bool RegisterContextFreeBSDKernel_x86_64::ReadGPR() { return true; }25 26bool RegisterContextFreeBSDKernel_x86_64::ReadFPR() { return true; }27 28bool RegisterContextFreeBSDKernel_x86_64::WriteGPR() {29  assert(0);30  return false;31}32 33bool RegisterContextFreeBSDKernel_x86_64::WriteFPR() {34  assert(0);35  return false;36}37 38bool 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 REG77 78  default:79    return false;80  }81 82  return true;83}84 85bool RegisterContextFreeBSDKernel_x86_64::WriteRegister(86    const RegisterInfo *reg_info, const RegisterValue &value) {87  return false;88}89