Path: blob/main/contrib/llvm-project/lldb/source/Plugins/Process/Utility/RegisterContextFreeBSD_mips64.cpp
96381 views
//===-- RegisterContextFreeBSD_mips64.cpp ---------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===---------------------------------------------------------------------===//78#include "RegisterContextFreeBSD_mips64.h"9#include "RegisterContextPOSIX_mips64.h"10#include "lldb-mips-freebsd-register-enums.h"11#include <vector>1213using namespace lldb_private;14using namespace lldb;1516static const uint32_t g_gp_regnums_mips64[] = {17gpr_zero_mips64, gpr_r1_mips64, gpr_r2_mips64, gpr_r3_mips64,18gpr_r4_mips64, gpr_r5_mips64, gpr_r6_mips64, gpr_r7_mips64,19gpr_r8_mips64, gpr_r9_mips64, gpr_r10_mips64, gpr_r11_mips64,20gpr_r12_mips64, gpr_r13_mips64, gpr_r14_mips64, gpr_r15_mips64,21gpr_r16_mips64, gpr_r17_mips64, gpr_r18_mips64, gpr_r19_mips64,22gpr_r20_mips64, gpr_r21_mips64, gpr_r22_mips64, gpr_r23_mips64,23gpr_r24_mips64, gpr_r25_mips64, gpr_r26_mips64, gpr_r27_mips64,24gpr_gp_mips64, gpr_sp_mips64, gpr_r30_mips64, gpr_ra_mips64,25gpr_sr_mips64, gpr_mullo_mips64, gpr_mulhi_mips64, gpr_badvaddr_mips64,26gpr_cause_mips64, gpr_pc_mips64, gpr_ic_mips64, gpr_dummy_mips64,27LLDB_INVALID_REGNUM // register sets need to end with this flag28};2930static_assert((sizeof(g_gp_regnums_mips64) / sizeof(g_gp_regnums_mips64[0])) -311 ==32k_num_gpr_registers_mips64,33"g_gp_regnums_mips64 has wrong number of register infos");3435const uint32_t g_fp_regnums_mips64[] = {36fpr_f0_mips64, fpr_f1_mips64, fpr_f2_mips64, fpr_f3_mips64,37fpr_f4_mips64, fpr_f5_mips64, fpr_f6_mips64, fpr_f7_mips64,38fpr_f8_mips64, fpr_f9_mips64, fpr_f10_mips64, fpr_f11_mips64,39fpr_f12_mips64, fpr_f13_mips64, fpr_f14_mips64, fpr_f15_mips64,40fpr_f16_mips64, fpr_f17_mips64, fpr_f18_mips64, fpr_f19_mips64,41fpr_f20_mips64, fpr_f21_mips64, fpr_f22_mips64, fpr_f23_mips64,42fpr_f24_mips64, fpr_f25_mips64, fpr_f26_mips64, fpr_f27_mips64,43fpr_f28_mips64, fpr_f29_mips64, fpr_f30_mips64, fpr_f31_mips64,44fpr_fcsr_mips64, fpr_fir_mips64,45LLDB_INVALID_REGNUM // register sets need to end with this flag46};4748static_assert((sizeof(g_fp_regnums_mips64) / sizeof(g_fp_regnums_mips64[0])) -491 ==50k_num_fpr_registers_mips64,51"g_fp_regnums_mips64 has wrong number of register infos");5253// Number of register sets provided by this context.54constexpr size_t k_num_register_sets = 2;5556static const RegisterSet g_reg_sets_mips64[k_num_register_sets] = {57{"General Purpose Registers", "gpr", k_num_gpr_registers_mips64,58g_gp_regnums_mips64},59{"Floating Point Registers", "fpu", k_num_fpr_registers_mips64,60g_fp_regnums_mips64},61};6263// http://svnweb.freebsd.org/base/head/sys/mips/include/regnum.h64typedef struct _GPR {65uint64_t zero;66uint64_t r1;67uint64_t r2;68uint64_t r3;69uint64_t r4;70uint64_t r5;71uint64_t r6;72uint64_t r7;73uint64_t r8;74uint64_t r9;75uint64_t r10;76uint64_t r11;77uint64_t r12;78uint64_t r13;79uint64_t r14;80uint64_t r15;81uint64_t r16;82uint64_t r17;83uint64_t r18;84uint64_t r19;85uint64_t r20;86uint64_t r21;87uint64_t r22;88uint64_t r23;89uint64_t r24;90uint64_t r25;91uint64_t r26;92uint64_t r27;93uint64_t gp;94uint64_t sp;95uint64_t r30;96uint64_t ra;97uint64_t sr;98uint64_t mullo;99uint64_t mulhi;100uint64_t badvaddr;101uint64_t cause;102uint64_t pc;103uint64_t ic;104uint64_t dummy;105} GPR_freebsd_mips;106107typedef struct _FPR {108uint64_t f0;109uint64_t f1;110uint64_t f2;111uint64_t f3;112uint64_t f4;113uint64_t f5;114uint64_t f6;115uint64_t f7;116uint64_t f8;117uint64_t f9;118uint64_t f10;119uint64_t f11;120uint64_t f12;121uint64_t f13;122uint64_t f14;123uint64_t f15;124uint64_t f16;125uint64_t f17;126uint64_t f18;127uint64_t f19;128uint64_t f20;129uint64_t f21;130uint64_t f22;131uint64_t f23;132uint64_t f24;133uint64_t f25;134uint64_t f26;135uint64_t f27;136uint64_t f28;137uint64_t f29;138uint64_t f30;139uint64_t f31;140uint64_t fcsr;141uint64_t fir;142} FPR_freebsd_mips;143144// Include RegisterInfos_mips64 to declare our g_register_infos_mips64145// structure.146#define DECLARE_REGISTER_INFOS_MIPS64_STRUCT147#include "RegisterInfos_mips64.h"148#undef DECLARE_REGISTER_INFOS_MIPS64_STRUCT149150RegisterContextFreeBSD_mips64::RegisterContextFreeBSD_mips64(151const ArchSpec &target_arch)152: RegisterInfoInterface(target_arch) {}153154size_t RegisterContextFreeBSD_mips64::GetGPRSize() const {155return sizeof(GPR_freebsd_mips);156}157158const RegisterSet *159RegisterContextFreeBSD_mips64::GetRegisterSet(size_t set) const {160// Check if RegisterSet is available161if (set < k_num_register_sets)162return &g_reg_sets_mips64[set];163return nullptr;164}165166size_t RegisterContextFreeBSD_mips64::GetRegisterSetCount() const {167return k_num_register_sets;168}169170const RegisterInfo *RegisterContextFreeBSD_mips64::GetRegisterInfo() const {171assert(GetTargetArchitecture().GetCore() == ArchSpec::eCore_mips64);172return g_register_infos_mips64;173}174175uint32_t RegisterContextFreeBSD_mips64::GetRegisterCount() const {176return static_cast<uint32_t>(sizeof(g_register_infos_mips64) /177sizeof(g_register_infos_mips64[0]));178}179180181