brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.3 KiB · f70ddeb Raw
184 lines · cpp
1//===-- RegisterContextPOSIX_ppc64le.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 <cerrno>10#include <cstdint>11#include <cstring>12 13#include "lldb/Target/Process.h"14#include "lldb/Target/Target.h"15#include "lldb/Target/Thread.h"16#include "lldb/Utility/DataBufferHeap.h"17#include "lldb/Utility/DataExtractor.h"18#include "lldb/Utility/Endian.h"19#include "lldb/Utility/RegisterValue.h"20#include "lldb/Utility/Scalar.h"21#include "llvm/Support/Compiler.h"22 23#include "RegisterContextPOSIX_ppc64le.h"24 25using namespace lldb_private;26using namespace lldb;27 28static const uint32_t g_gpr_regnums[] = {29    gpr_r0_ppc64le,   gpr_r1_ppc64le,  gpr_r2_ppc64le,     gpr_r3_ppc64le,30    gpr_r4_ppc64le,   gpr_r5_ppc64le,  gpr_r6_ppc64le,     gpr_r7_ppc64le,31    gpr_r8_ppc64le,   gpr_r9_ppc64le,  gpr_r10_ppc64le,    gpr_r11_ppc64le,32    gpr_r12_ppc64le,  gpr_r13_ppc64le, gpr_r14_ppc64le,    gpr_r15_ppc64le,33    gpr_r16_ppc64le,  gpr_r17_ppc64le, gpr_r18_ppc64le,    gpr_r19_ppc64le,34    gpr_r20_ppc64le,  gpr_r21_ppc64le, gpr_r22_ppc64le,    gpr_r23_ppc64le,35    gpr_r24_ppc64le,  gpr_r25_ppc64le, gpr_r26_ppc64le,    gpr_r27_ppc64le,36    gpr_r28_ppc64le,  gpr_r29_ppc64le, gpr_r30_ppc64le,    gpr_r31_ppc64le,37    gpr_pc_ppc64le,   gpr_msr_ppc64le, gpr_origr3_ppc64le, gpr_ctr_ppc64le,38    gpr_lr_ppc64le,   gpr_xer_ppc64le, gpr_cr_ppc64le,     gpr_softe_ppc64le,39    gpr_trap_ppc64le,40};41 42static const uint32_t g_fpr_regnums[] = {43    fpr_f0_ppc64le,    fpr_f1_ppc64le,  fpr_f2_ppc64le,  fpr_f3_ppc64le,44    fpr_f4_ppc64le,    fpr_f5_ppc64le,  fpr_f6_ppc64le,  fpr_f7_ppc64le,45    fpr_f8_ppc64le,    fpr_f9_ppc64le,  fpr_f10_ppc64le, fpr_f11_ppc64le,46    fpr_f12_ppc64le,   fpr_f13_ppc64le, fpr_f14_ppc64le, fpr_f15_ppc64le,47    fpr_f16_ppc64le,   fpr_f17_ppc64le, fpr_f18_ppc64le, fpr_f19_ppc64le,48    fpr_f20_ppc64le,   fpr_f21_ppc64le, fpr_f22_ppc64le, fpr_f23_ppc64le,49    fpr_f24_ppc64le,   fpr_f25_ppc64le, fpr_f26_ppc64le, fpr_f27_ppc64le,50    fpr_f28_ppc64le,   fpr_f29_ppc64le, fpr_f30_ppc64le, fpr_f31_ppc64le,51    fpr_fpscr_ppc64le,52};53 54static const uint32_t g_vmx_regnums[] = {55    vmx_vr0_ppc64le,  vmx_vr1_ppc64le,    vmx_vr2_ppc64le,  vmx_vr3_ppc64le,56    vmx_vr4_ppc64le,  vmx_vr5_ppc64le,    vmx_vr6_ppc64le,  vmx_vr7_ppc64le,57    vmx_vr8_ppc64le,  vmx_vr9_ppc64le,    vmx_vr10_ppc64le, vmx_vr11_ppc64le,58    vmx_vr12_ppc64le, vmx_vr13_ppc64le,   vmx_vr14_ppc64le, vmx_vr15_ppc64le,59    vmx_vr16_ppc64le, vmx_vr17_ppc64le,   vmx_vr18_ppc64le, vmx_vr19_ppc64le,60    vmx_vr20_ppc64le, vmx_vr21_ppc64le,   vmx_vr22_ppc64le, vmx_vr23_ppc64le,61    vmx_vr24_ppc64le, vmx_vr25_ppc64le,   vmx_vr26_ppc64le, vmx_vr27_ppc64le,62    vmx_vr28_ppc64le, vmx_vr29_ppc64le,   vmx_vr30_ppc64le, vmx_vr31_ppc64le,63    vmx_vscr_ppc64le, vmx_vrsave_ppc64le,64};65 66static const uint32_t g_vsx_regnums[] = {67    vsx_vs0_ppc64le,  vsx_vs1_ppc64le,  vsx_vs2_ppc64le,  vsx_vs3_ppc64le,68    vsx_vs4_ppc64le,  vsx_vs5_ppc64le,  vsx_vs6_ppc64le,  vsx_vs7_ppc64le,69    vsx_vs8_ppc64le,  vsx_vs9_ppc64le,  vsx_vs10_ppc64le, vsx_vs11_ppc64le,70    vsx_vs12_ppc64le, vsx_vs13_ppc64le, vsx_vs14_ppc64le, vsx_vs15_ppc64le,71    vsx_vs16_ppc64le, vsx_vs17_ppc64le, vsx_vs18_ppc64le, vsx_vs19_ppc64le,72    vsx_vs20_ppc64le, vsx_vs21_ppc64le, vsx_vs22_ppc64le, vsx_vs23_ppc64le,73    vsx_vs24_ppc64le, vsx_vs25_ppc64le, vsx_vs26_ppc64le, vsx_vs27_ppc64le,74    vsx_vs28_ppc64le, vsx_vs29_ppc64le, vsx_vs30_ppc64le, vsx_vs31_ppc64le,75    vsx_vs32_ppc64le, vsx_vs33_ppc64le, vsx_vs34_ppc64le, vsx_vs35_ppc64le,76    vsx_vs36_ppc64le, vsx_vs37_ppc64le, vsx_vs38_ppc64le, vsx_vs39_ppc64le,77    vsx_vs40_ppc64le, vsx_vs41_ppc64le, vsx_vs42_ppc64le, vsx_vs43_ppc64le,78    vsx_vs44_ppc64le, vsx_vs45_ppc64le, vsx_vs46_ppc64le, vsx_vs47_ppc64le,79    vsx_vs48_ppc64le, vsx_vs49_ppc64le, vsx_vs50_ppc64le, vsx_vs51_ppc64le,80    vsx_vs52_ppc64le, vsx_vs53_ppc64le, vsx_vs54_ppc64le, vsx_vs55_ppc64le,81    vsx_vs56_ppc64le, vsx_vs57_ppc64le, vsx_vs58_ppc64le, vsx_vs59_ppc64le,82    vsx_vs60_ppc64le, vsx_vs61_ppc64le, vsx_vs62_ppc64le, vsx_vs63_ppc64le,83};84 85// Number of register sets provided by this context.86enum { k_num_register_sets = 4 };87 88static const RegisterSet g_reg_sets_ppc64le[k_num_register_sets] = {89    {"General Purpose Registers", "gpr", k_num_gpr_registers_ppc64le,90     g_gpr_regnums},91    {"Floating Point Registers", "fpr", k_num_fpr_registers_ppc64le,92     g_fpr_regnums},93    {"Altivec/VMX Registers", "vmx", k_num_vmx_registers_ppc64le,94     g_vmx_regnums},95    {"VSX Registers", "vsx", k_num_vsx_registers_ppc64le, g_vsx_regnums},96};97 98bool RegisterContextPOSIX_ppc64le::IsGPR(unsigned reg) {99  return (reg <= k_last_gpr_ppc64le); // GPR's come first.100}101 102bool RegisterContextPOSIX_ppc64le::IsFPR(unsigned reg) {103  return (reg >= k_first_fpr_ppc64le) && (reg <= k_last_fpr_ppc64le);104}105 106bool RegisterContextPOSIX_ppc64le::IsVMX(unsigned reg) {107  return (reg >= k_first_vmx_ppc64le) && (reg <= k_last_vmx_ppc64le);108}109 110bool RegisterContextPOSIX_ppc64le::IsVSX(unsigned reg) {111  return (reg >= k_first_vsx_ppc64le) && (reg <= k_last_vsx_ppc64le);112}113 114RegisterContextPOSIX_ppc64le::RegisterContextPOSIX_ppc64le(115    Thread &thread, uint32_t concrete_frame_idx,116    RegisterInfoInterface *register_info)117    : RegisterContext(thread, concrete_frame_idx) {118  m_register_info_up.reset(register_info);119}120 121void RegisterContextPOSIX_ppc64le::InvalidateAllRegisters() {}122 123unsigned RegisterContextPOSIX_ppc64le::GetRegisterOffset(unsigned reg) {124  assert(reg < k_num_registers_ppc64le && "Invalid register number.");125  return GetRegisterInfo()[reg].byte_offset;126}127 128unsigned RegisterContextPOSIX_ppc64le::GetRegisterSize(unsigned reg) {129  assert(reg < k_num_registers_ppc64le && "Invalid register number.");130  return GetRegisterInfo()[reg].byte_size;131}132 133size_t RegisterContextPOSIX_ppc64le::GetRegisterCount() {134  size_t num_registers = k_num_registers_ppc64le;135  return num_registers;136}137 138size_t RegisterContextPOSIX_ppc64le::GetGPRSize() {139  return m_register_info_up->GetGPRSize();140}141 142const RegisterInfo *RegisterContextPOSIX_ppc64le::GetRegisterInfo() {143  // Commonly, this method is overridden and g_register_infos is copied and144  // specialized. So, use GetRegisterInfo() rather than g_register_infos in145  // this scope.146  return m_register_info_up->GetRegisterInfo();147}148 149const RegisterInfo *150RegisterContextPOSIX_ppc64le::GetRegisterInfoAtIndex(size_t reg) {151  if (reg < k_num_registers_ppc64le)152    return &GetRegisterInfo()[reg];153  else154    return nullptr;155}156 157size_t RegisterContextPOSIX_ppc64le::GetRegisterSetCount() {158  size_t sets = 0;159  for (size_t set = 0; set < k_num_register_sets; ++set) {160    if (IsRegisterSetAvailable(set))161      ++sets;162  }163 164  return sets;165}166 167const RegisterSet *RegisterContextPOSIX_ppc64le::GetRegisterSet(size_t set) {168  if (IsRegisterSetAvailable(set))169    return &g_reg_sets_ppc64le[set];170  else171    return nullptr;172}173 174const char *RegisterContextPOSIX_ppc64le::GetRegisterName(unsigned reg) {175  assert(reg < k_num_registers_ppc64le && "Invalid register offset.");176  return GetRegisterInfo()[reg].name;177}178 179bool RegisterContextPOSIX_ppc64le::IsRegisterSetAvailable(size_t set_index) {180  size_t num_sets = k_num_register_sets;181 182  return (set_index < num_sets);183}184