| 1 | //===-- RegisterContextFreeBSD_mips64.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 "RegisterContextFreeBSD_mips64.h" |
| 10 | #include "RegisterContextPOSIX_mips64.h" |
| 11 | #include "lldb-mips-freebsd-register-enums.h" |
| 12 | #include <vector> |
| 13 | |
| 14 | using namespace lldb_private; |
| 15 | using namespace lldb; |
| 16 | |
| 17 | static const uint32_t g_gp_regnums_mips64[] = { |
| 18 | gpr_zero_mips64, gpr_r1_mips64, gpr_r2_mips64, gpr_r3_mips64, |
| 19 | gpr_r4_mips64, gpr_r5_mips64, gpr_r6_mips64, gpr_r7_mips64, |
| 20 | gpr_r8_mips64, gpr_r9_mips64, gpr_r10_mips64, gpr_r11_mips64, |
| 21 | gpr_r12_mips64, gpr_r13_mips64, gpr_r14_mips64, gpr_r15_mips64, |
| 22 | gpr_r16_mips64, gpr_r17_mips64, gpr_r18_mips64, gpr_r19_mips64, |
| 23 | gpr_r20_mips64, gpr_r21_mips64, gpr_r22_mips64, gpr_r23_mips64, |
| 24 | gpr_r24_mips64, gpr_r25_mips64, gpr_r26_mips64, gpr_r27_mips64, |
| 25 | gpr_gp_mips64, gpr_sp_mips64, gpr_r30_mips64, gpr_ra_mips64, |
| 26 | gpr_sr_mips64, gpr_mullo_mips64, gpr_mulhi_mips64, gpr_badvaddr_mips64, |
| 27 | gpr_cause_mips64, gpr_pc_mips64, gpr_ic_mips64, gpr_dummy_mips64, |
| 28 | LLDB_INVALID_REGNUM // register sets need to end with this flag |
| 29 | }; |
| 30 | |
| 31 | static_assert((sizeof(g_gp_regnums_mips64) / sizeof(g_gp_regnums_mips64[0])) - |
| 32 | 1 == |
| 33 | k_num_gpr_registers_mips64, |
| 34 | "g_gp_regnums_mips64 has wrong number of register infos" ); |
| 35 | |
| 36 | const uint32_t g_fp_regnums_mips64[] = { |
| 37 | fpr_f0_mips64, fpr_f1_mips64, fpr_f2_mips64, fpr_f3_mips64, |
| 38 | fpr_f4_mips64, fpr_f5_mips64, fpr_f6_mips64, fpr_f7_mips64, |
| 39 | fpr_f8_mips64, fpr_f9_mips64, fpr_f10_mips64, fpr_f11_mips64, |
| 40 | fpr_f12_mips64, fpr_f13_mips64, fpr_f14_mips64, fpr_f15_mips64, |
| 41 | fpr_f16_mips64, fpr_f17_mips64, fpr_f18_mips64, fpr_f19_mips64, |
| 42 | fpr_f20_mips64, fpr_f21_mips64, fpr_f22_mips64, fpr_f23_mips64, |
| 43 | fpr_f24_mips64, fpr_f25_mips64, fpr_f26_mips64, fpr_f27_mips64, |
| 44 | fpr_f28_mips64, fpr_f29_mips64, fpr_f30_mips64, fpr_f31_mips64, |
| 45 | fpr_fcsr_mips64, fpr_fir_mips64, |
| 46 | LLDB_INVALID_REGNUM // register sets need to end with this flag |
| 47 | }; |
| 48 | |
| 49 | static_assert((sizeof(g_fp_regnums_mips64) / sizeof(g_fp_regnums_mips64[0])) - |
| 50 | 1 == |
| 51 | k_num_fpr_registers_mips64, |
| 52 | "g_fp_regnums_mips64 has wrong number of register infos" ); |
| 53 | |
| 54 | // Number of register sets provided by this context. |
| 55 | constexpr size_t k_num_register_sets = 2; |
| 56 | |
| 57 | static const RegisterSet g_reg_sets_mips64[k_num_register_sets] = { |
| 58 | {.name: "General Purpose Registers" , .short_name: "gpr" , .num_registers: k_num_gpr_registers_mips64, |
| 59 | .registers: g_gp_regnums_mips64}, |
| 60 | {.name: "Floating Point Registers" , .short_name: "fpu" , .num_registers: k_num_fpr_registers_mips64, |
| 61 | .registers: g_fp_regnums_mips64}, |
| 62 | }; |
| 63 | |
| 64 | // http://svnweb.freebsd.org/base/head/sys/mips/include/regnum.h |
| 65 | typedef struct _GPR { |
| 66 | uint64_t zero; |
| 67 | uint64_t r1; |
| 68 | uint64_t r2; |
| 69 | uint64_t r3; |
| 70 | uint64_t r4; |
| 71 | uint64_t r5; |
| 72 | uint64_t r6; |
| 73 | uint64_t r7; |
| 74 | uint64_t r8; |
| 75 | uint64_t r9; |
| 76 | uint64_t r10; |
| 77 | uint64_t r11; |
| 78 | uint64_t r12; |
| 79 | uint64_t r13; |
| 80 | uint64_t r14; |
| 81 | uint64_t r15; |
| 82 | uint64_t r16; |
| 83 | uint64_t r17; |
| 84 | uint64_t r18; |
| 85 | uint64_t r19; |
| 86 | uint64_t r20; |
| 87 | uint64_t r21; |
| 88 | uint64_t r22; |
| 89 | uint64_t r23; |
| 90 | uint64_t r24; |
| 91 | uint64_t r25; |
| 92 | uint64_t r26; |
| 93 | uint64_t r27; |
| 94 | uint64_t gp; |
| 95 | uint64_t sp; |
| 96 | uint64_t r30; |
| 97 | uint64_t ra; |
| 98 | uint64_t sr; |
| 99 | uint64_t mullo; |
| 100 | uint64_t mulhi; |
| 101 | uint64_t badvaddr; |
| 102 | uint64_t cause; |
| 103 | uint64_t pc; |
| 104 | uint64_t ic; |
| 105 | uint64_t dummy; |
| 106 | } GPR_freebsd_mips; |
| 107 | |
| 108 | typedef struct _FPR { |
| 109 | uint64_t f0; |
| 110 | uint64_t f1; |
| 111 | uint64_t f2; |
| 112 | uint64_t f3; |
| 113 | uint64_t f4; |
| 114 | uint64_t f5; |
| 115 | uint64_t f6; |
| 116 | uint64_t f7; |
| 117 | uint64_t f8; |
| 118 | uint64_t f9; |
| 119 | uint64_t f10; |
| 120 | uint64_t f11; |
| 121 | uint64_t f12; |
| 122 | uint64_t f13; |
| 123 | uint64_t f14; |
| 124 | uint64_t f15; |
| 125 | uint64_t f16; |
| 126 | uint64_t f17; |
| 127 | uint64_t f18; |
| 128 | uint64_t f19; |
| 129 | uint64_t f20; |
| 130 | uint64_t f21; |
| 131 | uint64_t f22; |
| 132 | uint64_t f23; |
| 133 | uint64_t f24; |
| 134 | uint64_t f25; |
| 135 | uint64_t f26; |
| 136 | uint64_t f27; |
| 137 | uint64_t f28; |
| 138 | uint64_t f29; |
| 139 | uint64_t f30; |
| 140 | uint64_t f31; |
| 141 | uint64_t fcsr; |
| 142 | uint64_t fir; |
| 143 | } FPR_freebsd_mips; |
| 144 | |
| 145 | // Include RegisterInfos_mips64 to declare our g_register_infos_mips64 |
| 146 | // structure. |
| 147 | #define DECLARE_REGISTER_INFOS_MIPS64_STRUCT |
| 148 | #include "RegisterInfos_mips64.h" |
| 149 | #undef DECLARE_REGISTER_INFOS_MIPS64_STRUCT |
| 150 | |
| 151 | RegisterContextFreeBSD_mips64::RegisterContextFreeBSD_mips64( |
| 152 | const ArchSpec &target_arch) |
| 153 | : RegisterInfoInterface(target_arch) {} |
| 154 | |
| 155 | size_t RegisterContextFreeBSD_mips64::GetGPRSize() const { |
| 156 | return sizeof(GPR_freebsd_mips); |
| 157 | } |
| 158 | |
| 159 | const RegisterSet * |
| 160 | RegisterContextFreeBSD_mips64::GetRegisterSet(size_t set) const { |
| 161 | // Check if RegisterSet is available |
| 162 | if (set < k_num_register_sets) |
| 163 | return &g_reg_sets_mips64[set]; |
| 164 | return nullptr; |
| 165 | } |
| 166 | |
| 167 | size_t RegisterContextFreeBSD_mips64::GetRegisterSetCount() const { |
| 168 | return k_num_register_sets; |
| 169 | } |
| 170 | |
| 171 | const RegisterInfo *RegisterContextFreeBSD_mips64::GetRegisterInfo() const { |
| 172 | assert(GetTargetArchitecture().GetCore() == ArchSpec::eCore_mips64); |
| 173 | return g_register_infos_mips64; |
| 174 | } |
| 175 | |
| 176 | uint32_t RegisterContextFreeBSD_mips64::GetRegisterCount() const { |
| 177 | return static_cast<uint32_t>(sizeof(g_register_infos_mips64) / |
| 178 | sizeof(g_register_infos_mips64[0])); |
| 179 | } |
| 180 | |