330 lines · c
1//===-- RegisterInfos_ppc64.h -----------------------------------*- C++ -*-===//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#ifdef DECLARE_REGISTER_INFOS_PPC64_STRUCT10 11#include <cstddef>12 13// Computes the offset of the given GPR_PPC64 in the user data area.14#define GPR_PPC64_OFFSET(regname) (offsetof(GPR_PPC64, regname))15#define FPR_PPC64_OFFSET(regname) (offsetof(FPR_PPC64, regname) \16 + sizeof(GPR_PPC64))17#define VMX_PPC64_OFFSET(regname) (offsetof(VMX_PPC64, regname) \18 + sizeof(GPR_PPC64) + sizeof(FPR_PPC64))19#define GPR_PPC64_SIZE(regname) (sizeof(((GPR_PPC64 *)NULL)->regname))20 21#include "Utility/PPC64_DWARF_Registers.h"22#include "lldb-ppc64-register-enums.h"23 24// Note that the size and offset will be updated by platform-specific classes.25#define DEFINE_GPR_PPC64(reg, alt, lldb_kind) \26 { \27 #reg, alt, GPR_PPC64_SIZE(reg), GPR_PPC64_OFFSET(reg), lldb::eEncodingUint,\28 lldb::eFormatHex, \29 {ppc64_dwarf::dwarf_##reg##_ppc64, \30 ppc64_dwarf::dwarf_##reg##_ppc64, \31 lldb_kind, \32 LLDB_INVALID_REGNUM, \33 gpr_##reg##_ppc64 }, \34 NULL, NULL, NULL, \35 }36#define DEFINE_FPR_PPC64(reg, alt, lldb_kind) \37 { \38#reg, alt, 8, FPR_PPC64_OFFSET(reg), lldb::eEncodingIEEE754, \39 lldb::eFormatFloat, \40 {ppc64_dwarf::dwarf_##reg##_ppc64, \41 ppc64_dwarf::dwarf_##reg##_ppc64, lldb_kind, LLDB_INVALID_REGNUM, \42 fpr_##reg##_ppc64 }, \43 NULL, NULL, NULL, \44 }45#define DEFINE_VMX_PPC64(reg, lldb_kind) \46 { \47#reg, NULL, 16, VMX_PPC64_OFFSET(reg), lldb::eEncodingVector, \48 lldb::eFormatVectorOfUInt32, \49 {ppc64_dwarf::dwarf_##reg##_ppc64, \50 ppc64_dwarf::dwarf_##reg##_ppc64, lldb_kind, LLDB_INVALID_REGNUM, \51 vmx_##reg##_ppc64 }, \52 NULL, NULL, NULL, \53 }54 55// General purpose registers.56// EH_Frame, Generic, Process Plugin57#define PPC64_REGS \58 DEFINE_GPR_PPC64(r0, NULL, LLDB_INVALID_REGNUM) \59 , DEFINE_GPR_PPC64(r1, NULL, LLDB_REGNUM_GENERIC_SP), \60 DEFINE_GPR_PPC64(r2, NULL, LLDB_INVALID_REGNUM), \61 DEFINE_GPR_PPC64(r3, NULL, LLDB_REGNUM_GENERIC_ARG1), \62 DEFINE_GPR_PPC64(r4, NULL, LLDB_REGNUM_GENERIC_ARG2), \63 DEFINE_GPR_PPC64(r5, NULL, LLDB_REGNUM_GENERIC_ARG3), \64 DEFINE_GPR_PPC64(r6, NULL, LLDB_REGNUM_GENERIC_ARG4), \65 DEFINE_GPR_PPC64(r7, NULL, LLDB_REGNUM_GENERIC_ARG5), \66 DEFINE_GPR_PPC64(r8, NULL, LLDB_REGNUM_GENERIC_ARG6), \67 DEFINE_GPR_PPC64(r9, NULL, LLDB_REGNUM_GENERIC_ARG7), \68 DEFINE_GPR_PPC64(r10, NULL, LLDB_REGNUM_GENERIC_ARG8), \69 DEFINE_GPR_PPC64(r11, NULL, LLDB_INVALID_REGNUM), \70 DEFINE_GPR_PPC64(r12, NULL, LLDB_INVALID_REGNUM), \71 DEFINE_GPR_PPC64(r13, NULL, LLDB_INVALID_REGNUM), \72 DEFINE_GPR_PPC64(r14, NULL, LLDB_INVALID_REGNUM), \73 DEFINE_GPR_PPC64(r15, NULL, LLDB_INVALID_REGNUM), \74 DEFINE_GPR_PPC64(r16, NULL, LLDB_INVALID_REGNUM), \75 DEFINE_GPR_PPC64(r17, NULL, LLDB_INVALID_REGNUM), \76 DEFINE_GPR_PPC64(r18, NULL, LLDB_INVALID_REGNUM), \77 DEFINE_GPR_PPC64(r19, NULL, LLDB_INVALID_REGNUM), \78 DEFINE_GPR_PPC64(r20, NULL, LLDB_INVALID_REGNUM), \79 DEFINE_GPR_PPC64(r21, NULL, LLDB_INVALID_REGNUM), \80 DEFINE_GPR_PPC64(r22, NULL, LLDB_INVALID_REGNUM), \81 DEFINE_GPR_PPC64(r23, NULL, LLDB_INVALID_REGNUM), \82 DEFINE_GPR_PPC64(r24, NULL, LLDB_INVALID_REGNUM), \83 DEFINE_GPR_PPC64(r25, NULL, LLDB_INVALID_REGNUM), \84 DEFINE_GPR_PPC64(r26, NULL, LLDB_INVALID_REGNUM), \85 DEFINE_GPR_PPC64(r27, NULL, LLDB_INVALID_REGNUM), \86 DEFINE_GPR_PPC64(r28, NULL, LLDB_INVALID_REGNUM), \87 DEFINE_GPR_PPC64(r29, NULL, LLDB_INVALID_REGNUM), \88 DEFINE_GPR_PPC64(r30, NULL, LLDB_INVALID_REGNUM), \89 DEFINE_GPR_PPC64(r31, NULL, LLDB_INVALID_REGNUM), \90 DEFINE_GPR_PPC64(cr, NULL, LLDB_REGNUM_GENERIC_FLAGS), \91 DEFINE_GPR_PPC64(msr, NULL, LLDB_INVALID_REGNUM), \92 DEFINE_GPR_PPC64(xer, NULL, LLDB_INVALID_REGNUM), \93 DEFINE_GPR_PPC64(lr, NULL, LLDB_REGNUM_GENERIC_RA), \94 DEFINE_GPR_PPC64(ctr, NULL, LLDB_INVALID_REGNUM), \95 DEFINE_GPR_PPC64(pc, NULL, LLDB_REGNUM_GENERIC_PC), \96 DEFINE_FPR_PPC64(f0, NULL, LLDB_INVALID_REGNUM), \97 DEFINE_FPR_PPC64(f1, NULL, LLDB_INVALID_REGNUM), \98 DEFINE_FPR_PPC64(f2, NULL, LLDB_INVALID_REGNUM), \99 DEFINE_FPR_PPC64(f3, NULL, LLDB_INVALID_REGNUM), \100 DEFINE_FPR_PPC64(f4, NULL, LLDB_INVALID_REGNUM), \101 DEFINE_FPR_PPC64(f5, NULL, LLDB_INVALID_REGNUM), \102 DEFINE_FPR_PPC64(f6, NULL, LLDB_INVALID_REGNUM), \103 DEFINE_FPR_PPC64(f7, NULL, LLDB_INVALID_REGNUM), \104 DEFINE_FPR_PPC64(f8, NULL, LLDB_INVALID_REGNUM), \105 DEFINE_FPR_PPC64(f9, NULL, LLDB_INVALID_REGNUM), \106 DEFINE_FPR_PPC64(f10, NULL, LLDB_INVALID_REGNUM), \107 DEFINE_FPR_PPC64(f11, NULL, LLDB_INVALID_REGNUM), \108 DEFINE_FPR_PPC64(f12, NULL, LLDB_INVALID_REGNUM), \109 DEFINE_FPR_PPC64(f13, NULL, LLDB_INVALID_REGNUM), \110 DEFINE_FPR_PPC64(f14, NULL, LLDB_INVALID_REGNUM), \111 DEFINE_FPR_PPC64(f15, NULL, LLDB_INVALID_REGNUM), \112 DEFINE_FPR_PPC64(f16, NULL, LLDB_INVALID_REGNUM), \113 DEFINE_FPR_PPC64(f17, NULL, LLDB_INVALID_REGNUM), \114 DEFINE_FPR_PPC64(f18, NULL, LLDB_INVALID_REGNUM), \115 DEFINE_FPR_PPC64(f19, NULL, LLDB_INVALID_REGNUM), \116 DEFINE_FPR_PPC64(f20, NULL, LLDB_INVALID_REGNUM), \117 DEFINE_FPR_PPC64(f21, NULL, LLDB_INVALID_REGNUM), \118 DEFINE_FPR_PPC64(f22, NULL, LLDB_INVALID_REGNUM), \119 DEFINE_FPR_PPC64(f23, NULL, LLDB_INVALID_REGNUM), \120 DEFINE_FPR_PPC64(f24, NULL, LLDB_INVALID_REGNUM), \121 DEFINE_FPR_PPC64(f25, NULL, LLDB_INVALID_REGNUM), \122 DEFINE_FPR_PPC64(f26, NULL, LLDB_INVALID_REGNUM), \123 DEFINE_FPR_PPC64(f27, NULL, LLDB_INVALID_REGNUM), \124 DEFINE_FPR_PPC64(f28, NULL, LLDB_INVALID_REGNUM), \125 DEFINE_FPR_PPC64(f29, NULL, LLDB_INVALID_REGNUM), \126 DEFINE_FPR_PPC64(f30, NULL, LLDB_INVALID_REGNUM), \127 DEFINE_FPR_PPC64(f31, NULL, LLDB_INVALID_REGNUM), \128 {"fpscr", \129 NULL, \130 8, \131 FPR_PPC64_OFFSET(fpscr), \132 lldb::eEncodingUint, \133 lldb::eFormatHex, \134 {ppc64_dwarf::dwarf_fpscr_ppc64, \135 ppc64_dwarf::dwarf_fpscr_ppc64, LLDB_INVALID_REGNUM, \136 LLDB_INVALID_REGNUM, fpr_fpscr_ppc64}, \137 NULL, \138 NULL, \139 NULL, \140 }, \141 DEFINE_VMX_PPC64(vr0, LLDB_INVALID_REGNUM), \142 DEFINE_VMX_PPC64(vr1, LLDB_INVALID_REGNUM), \143 DEFINE_VMX_PPC64(vr2, LLDB_INVALID_REGNUM), \144 DEFINE_VMX_PPC64(vr3, LLDB_INVALID_REGNUM), \145 DEFINE_VMX_PPC64(vr4, LLDB_INVALID_REGNUM), \146 DEFINE_VMX_PPC64(vr5, LLDB_INVALID_REGNUM), \147 DEFINE_VMX_PPC64(vr6, LLDB_INVALID_REGNUM), \148 DEFINE_VMX_PPC64(vr7, LLDB_INVALID_REGNUM), \149 DEFINE_VMX_PPC64(vr8, LLDB_INVALID_REGNUM), \150 DEFINE_VMX_PPC64(vr9, LLDB_INVALID_REGNUM), \151 DEFINE_VMX_PPC64(vr10, LLDB_INVALID_REGNUM), \152 DEFINE_VMX_PPC64(vr11, LLDB_INVALID_REGNUM), \153 DEFINE_VMX_PPC64(vr12, LLDB_INVALID_REGNUM), \154 DEFINE_VMX_PPC64(vr13, LLDB_INVALID_REGNUM), \155 DEFINE_VMX_PPC64(vr14, LLDB_INVALID_REGNUM), \156 DEFINE_VMX_PPC64(vr15, LLDB_INVALID_REGNUM), \157 DEFINE_VMX_PPC64(vr16, LLDB_INVALID_REGNUM), \158 DEFINE_VMX_PPC64(vr17, LLDB_INVALID_REGNUM), \159 DEFINE_VMX_PPC64(vr18, LLDB_INVALID_REGNUM), \160 DEFINE_VMX_PPC64(vr19, LLDB_INVALID_REGNUM), \161 DEFINE_VMX_PPC64(vr20, LLDB_INVALID_REGNUM), \162 DEFINE_VMX_PPC64(vr21, LLDB_INVALID_REGNUM), \163 DEFINE_VMX_PPC64(vr22, LLDB_INVALID_REGNUM), \164 DEFINE_VMX_PPC64(vr23, LLDB_INVALID_REGNUM), \165 DEFINE_VMX_PPC64(vr24, LLDB_INVALID_REGNUM), \166 DEFINE_VMX_PPC64(vr25, LLDB_INVALID_REGNUM), \167 DEFINE_VMX_PPC64(vr26, LLDB_INVALID_REGNUM), \168 DEFINE_VMX_PPC64(vr27, LLDB_INVALID_REGNUM), \169 DEFINE_VMX_PPC64(vr28, LLDB_INVALID_REGNUM), \170 DEFINE_VMX_PPC64(vr29, LLDB_INVALID_REGNUM), \171 DEFINE_VMX_PPC64(vr30, LLDB_INVALID_REGNUM), \172 DEFINE_VMX_PPC64(vr31, LLDB_INVALID_REGNUM), \173 {"vscr", \174 NULL, \175 4, \176 VMX_PPC64_OFFSET(vscr), \177 lldb::eEncodingUint, \178 lldb::eFormatHex, \179 {ppc64_dwarf::dwarf_vscr_ppc64, ppc64_dwarf::dwarf_vscr_ppc64, \180 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, vmx_vscr_ppc64}, \181 NULL, \182 NULL, \183 NULL, \184 }, \185 {"vrsave", \186 NULL, \187 4, \188 VMX_PPC64_OFFSET(vrsave), \189 lldb::eEncodingUint, \190 lldb::eFormatHex, \191 {ppc64_dwarf::dwarf_vrsave_ppc64, \192 ppc64_dwarf::dwarf_vrsave_ppc64, LLDB_INVALID_REGNUM, \193 LLDB_INVALID_REGNUM, vmx_vrsave_ppc64}, \194 NULL, \195 NULL, \196 NULL, \197 }, /* */198 199typedef struct _GPR_PPC64 {200 uint64_t r0;201 uint64_t r1;202 uint64_t r2;203 uint64_t r3;204 uint64_t r4;205 uint64_t r5;206 uint64_t r6;207 uint64_t r7;208 uint64_t r8;209 uint64_t r9;210 uint64_t r10;211 uint64_t r11;212 uint64_t r12;213 uint64_t r13;214 uint64_t r14;215 uint64_t r15;216 uint64_t r16;217 uint64_t r17;218 uint64_t r18;219 uint64_t r19;220 uint64_t r20;221 uint64_t r21;222 uint64_t r22;223 uint64_t r23;224 uint64_t r24;225 uint64_t r25;226 uint64_t r26;227 uint64_t r27;228 uint64_t r28;229 uint64_t r29;230 uint64_t r30;231 uint64_t r31;232 uint64_t cr;233 uint64_t msr;234 uint64_t xer;235 uint64_t lr;236 uint64_t ctr;237 uint64_t pc;238 uint64_t pad[3];239} GPR_PPC64;240 241typedef struct _FPR_PPC64 {242 uint64_t f0;243 uint64_t f1;244 uint64_t f2;245 uint64_t f3;246 uint64_t f4;247 uint64_t f5;248 uint64_t f6;249 uint64_t f7;250 uint64_t f8;251 uint64_t f9;252 uint64_t f10;253 uint64_t f11;254 uint64_t f12;255 uint64_t f13;256 uint64_t f14;257 uint64_t f15;258 uint64_t f16;259 uint64_t f17;260 uint64_t f18;261 uint64_t f19;262 uint64_t f20;263 uint64_t f21;264 uint64_t f22;265 uint64_t f23;266 uint64_t f24;267 uint64_t f25;268 uint64_t f26;269 uint64_t f27;270 uint64_t f28;271 uint64_t f29;272 uint64_t f30;273 uint64_t f31;274 uint64_t fpscr;275} FPR_PPC64;276 277typedef struct _VMX_PPC64 {278 uint32_t vr0[4];279 uint32_t vr1[4];280 uint32_t vr2[4];281 uint32_t vr3[4];282 uint32_t vr4[4];283 uint32_t vr5[4];284 uint32_t vr6[4];285 uint32_t vr7[4];286 uint32_t vr8[4];287 uint32_t vr9[4];288 uint32_t vr10[4];289 uint32_t vr11[4];290 uint32_t vr12[4];291 uint32_t vr13[4];292 uint32_t vr14[4];293 uint32_t vr15[4];294 uint32_t vr16[4];295 uint32_t vr17[4];296 uint32_t vr18[4];297 uint32_t vr19[4];298 uint32_t vr20[4];299 uint32_t vr21[4];300 uint32_t vr22[4];301 uint32_t vr23[4];302 uint32_t vr24[4];303 uint32_t vr25[4];304 uint32_t vr26[4];305 uint32_t vr27[4];306 uint32_t vr28[4];307 uint32_t vr29[4];308 uint32_t vr30[4];309 uint32_t vr31[4];310 uint32_t pad[2];311 uint32_t vscr[2];312 uint32_t vrsave;313} VMX_PPC64;314 315 316static lldb_private::RegisterInfo g_register_infos_ppc64[] = {317 PPC64_REGS318};319 320static_assert((sizeof(g_register_infos_ppc64) /321 sizeof(g_register_infos_ppc64[0])) ==322 k_num_registers_ppc64,323 "g_register_infos_powerpc64 has wrong number of register infos");324 325#undef DEFINE_FPR_PPC64326#undef DEFINE_GPR_PPC64327#undef DEFINE_VMX_PPC64328 329#endif // DECLARE_REGISTER_INFOS_PPC64_STRUCT330