15ffd83dbSDimitry Andric //===-- RegisterContextFreeBSD_powerpc.cpp --------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===---------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "RegisterContextFreeBSD_powerpc.h"
100b57cec5SDimitry Andric #include "RegisterContextPOSIX_powerpc.h"
110b57cec5SDimitry Andric #include <vector>
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric using namespace lldb_private;
140b57cec5SDimitry Andric using namespace lldb;
150b57cec5SDimitry Andric 
160b57cec5SDimitry Andric // http://svnweb.freebsd.org/base/head/sys/powerpc/include/reg.h
170b57cec5SDimitry Andric typedef struct _GPR64 {
180b57cec5SDimitry Andric   uint64_t r0;
190b57cec5SDimitry Andric   uint64_t r1;
200b57cec5SDimitry Andric   uint64_t r2;
210b57cec5SDimitry Andric   uint64_t r3;
220b57cec5SDimitry Andric   uint64_t r4;
230b57cec5SDimitry Andric   uint64_t r5;
240b57cec5SDimitry Andric   uint64_t r6;
250b57cec5SDimitry Andric   uint64_t r7;
260b57cec5SDimitry Andric   uint64_t r8;
270b57cec5SDimitry Andric   uint64_t r9;
280b57cec5SDimitry Andric   uint64_t r10;
290b57cec5SDimitry Andric   uint64_t r11;
300b57cec5SDimitry Andric   uint64_t r12;
310b57cec5SDimitry Andric   uint64_t r13;
320b57cec5SDimitry Andric   uint64_t r14;
330b57cec5SDimitry Andric   uint64_t r15;
340b57cec5SDimitry Andric   uint64_t r16;
350b57cec5SDimitry Andric   uint64_t r17;
360b57cec5SDimitry Andric   uint64_t r18;
370b57cec5SDimitry Andric   uint64_t r19;
380b57cec5SDimitry Andric   uint64_t r20;
390b57cec5SDimitry Andric   uint64_t r21;
400b57cec5SDimitry Andric   uint64_t r22;
410b57cec5SDimitry Andric   uint64_t r23;
420b57cec5SDimitry Andric   uint64_t r24;
430b57cec5SDimitry Andric   uint64_t r25;
440b57cec5SDimitry Andric   uint64_t r26;
450b57cec5SDimitry Andric   uint64_t r27;
460b57cec5SDimitry Andric   uint64_t r28;
470b57cec5SDimitry Andric   uint64_t r29;
480b57cec5SDimitry Andric   uint64_t r30;
490b57cec5SDimitry Andric   uint64_t r31;
500b57cec5SDimitry Andric   uint64_t lr;
510b57cec5SDimitry Andric   uint64_t cr;
520b57cec5SDimitry Andric   uint64_t xer;
530b57cec5SDimitry Andric   uint64_t ctr;
540b57cec5SDimitry Andric   uint64_t pc;
550b57cec5SDimitry Andric } GPR64;
560b57cec5SDimitry Andric 
570b57cec5SDimitry Andric typedef struct _GPR32 {
580b57cec5SDimitry Andric   uint32_t r0;
590b57cec5SDimitry Andric   uint32_t r1;
600b57cec5SDimitry Andric   uint32_t r2;
610b57cec5SDimitry Andric   uint32_t r3;
620b57cec5SDimitry Andric   uint32_t r4;
630b57cec5SDimitry Andric   uint32_t r5;
640b57cec5SDimitry Andric   uint32_t r6;
650b57cec5SDimitry Andric   uint32_t r7;
660b57cec5SDimitry Andric   uint32_t r8;
670b57cec5SDimitry Andric   uint32_t r9;
680b57cec5SDimitry Andric   uint32_t r10;
690b57cec5SDimitry Andric   uint32_t r11;
700b57cec5SDimitry Andric   uint32_t r12;
710b57cec5SDimitry Andric   uint32_t r13;
720b57cec5SDimitry Andric   uint32_t r14;
730b57cec5SDimitry Andric   uint32_t r15;
740b57cec5SDimitry Andric   uint32_t r16;
750b57cec5SDimitry Andric   uint32_t r17;
760b57cec5SDimitry Andric   uint32_t r18;
770b57cec5SDimitry Andric   uint32_t r19;
780b57cec5SDimitry Andric   uint32_t r20;
790b57cec5SDimitry Andric   uint32_t r21;
800b57cec5SDimitry Andric   uint32_t r22;
810b57cec5SDimitry Andric   uint32_t r23;
820b57cec5SDimitry Andric   uint32_t r24;
830b57cec5SDimitry Andric   uint32_t r25;
840b57cec5SDimitry Andric   uint32_t r26;
850b57cec5SDimitry Andric   uint32_t r27;
860b57cec5SDimitry Andric   uint32_t r28;
870b57cec5SDimitry Andric   uint32_t r29;
880b57cec5SDimitry Andric   uint32_t r30;
890b57cec5SDimitry Andric   uint32_t r31;
900b57cec5SDimitry Andric   uint32_t lr;
910b57cec5SDimitry Andric   uint32_t cr;
920b57cec5SDimitry Andric   uint32_t xer;
930b57cec5SDimitry Andric   uint32_t ctr;
940b57cec5SDimitry Andric   uint32_t pc;
950b57cec5SDimitry Andric } GPR32;
960b57cec5SDimitry Andric 
970b57cec5SDimitry Andric typedef struct _FPR {
980b57cec5SDimitry Andric   uint64_t f0;
990b57cec5SDimitry Andric   uint64_t f1;
1000b57cec5SDimitry Andric   uint64_t f2;
1010b57cec5SDimitry Andric   uint64_t f3;
1020b57cec5SDimitry Andric   uint64_t f4;
1030b57cec5SDimitry Andric   uint64_t f5;
1040b57cec5SDimitry Andric   uint64_t f6;
1050b57cec5SDimitry Andric   uint64_t f7;
1060b57cec5SDimitry Andric   uint64_t f8;
1070b57cec5SDimitry Andric   uint64_t f9;
1080b57cec5SDimitry Andric   uint64_t f10;
1090b57cec5SDimitry Andric   uint64_t f11;
1100b57cec5SDimitry Andric   uint64_t f12;
1110b57cec5SDimitry Andric   uint64_t f13;
1120b57cec5SDimitry Andric   uint64_t f14;
1130b57cec5SDimitry Andric   uint64_t f15;
1140b57cec5SDimitry Andric   uint64_t f16;
1150b57cec5SDimitry Andric   uint64_t f17;
1160b57cec5SDimitry Andric   uint64_t f18;
1170b57cec5SDimitry Andric   uint64_t f19;
1180b57cec5SDimitry Andric   uint64_t f20;
1190b57cec5SDimitry Andric   uint64_t f21;
1200b57cec5SDimitry Andric   uint64_t f22;
1210b57cec5SDimitry Andric   uint64_t f23;
1220b57cec5SDimitry Andric   uint64_t f24;
1230b57cec5SDimitry Andric   uint64_t f25;
1240b57cec5SDimitry Andric   uint64_t f26;
1250b57cec5SDimitry Andric   uint64_t f27;
1260b57cec5SDimitry Andric   uint64_t f28;
1270b57cec5SDimitry Andric   uint64_t f29;
1280b57cec5SDimitry Andric   uint64_t f30;
1290b57cec5SDimitry Andric   uint64_t f31;
1300b57cec5SDimitry Andric   uint64_t fpscr;
1310b57cec5SDimitry Andric } FPR;
1320b57cec5SDimitry Andric 
1330b57cec5SDimitry Andric typedef struct _VMX {
1340b57cec5SDimitry Andric   uint32_t v0[4];
1350b57cec5SDimitry Andric   uint32_t v1[4];
1360b57cec5SDimitry Andric   uint32_t v2[4];
1370b57cec5SDimitry Andric   uint32_t v3[4];
1380b57cec5SDimitry Andric   uint32_t v4[4];
1390b57cec5SDimitry Andric   uint32_t v5[4];
1400b57cec5SDimitry Andric   uint32_t v6[4];
1410b57cec5SDimitry Andric   uint32_t v7[4];
1420b57cec5SDimitry Andric   uint32_t v8[4];
1430b57cec5SDimitry Andric   uint32_t v9[4];
1440b57cec5SDimitry Andric   uint32_t v10[4];
1450b57cec5SDimitry Andric   uint32_t v11[4];
1460b57cec5SDimitry Andric   uint32_t v12[4];
1470b57cec5SDimitry Andric   uint32_t v13[4];
1480b57cec5SDimitry Andric   uint32_t v14[4];
1490b57cec5SDimitry Andric   uint32_t v15[4];
1500b57cec5SDimitry Andric   uint32_t v16[4];
1510b57cec5SDimitry Andric   uint32_t v17[4];
1520b57cec5SDimitry Andric   uint32_t v18[4];
1530b57cec5SDimitry Andric   uint32_t v19[4];
1540b57cec5SDimitry Andric   uint32_t v20[4];
1550b57cec5SDimitry Andric   uint32_t v21[4];
1560b57cec5SDimitry Andric   uint32_t v22[4];
1570b57cec5SDimitry Andric   uint32_t v23[4];
1580b57cec5SDimitry Andric   uint32_t v24[4];
1590b57cec5SDimitry Andric   uint32_t v25[4];
1600b57cec5SDimitry Andric   uint32_t v26[4];
1610b57cec5SDimitry Andric   uint32_t v27[4];
1620b57cec5SDimitry Andric   uint32_t v28[4];
1630b57cec5SDimitry Andric   uint32_t v29[4];
1640b57cec5SDimitry Andric   uint32_t v30[4];
1650b57cec5SDimitry Andric   uint32_t v31[4];
1660b57cec5SDimitry Andric   uint32_t pad[2];
1670b57cec5SDimitry Andric   uint32_t vrsave;
1680b57cec5SDimitry Andric   uint32_t vscr;
1690b57cec5SDimitry Andric } VMX;
1700b57cec5SDimitry Andric 
1710b57cec5SDimitry Andric // Include RegisterInfos_powerpc to declare our g_register_infos_powerpc
1720b57cec5SDimitry Andric // structure.
1730b57cec5SDimitry Andric #define DECLARE_REGISTER_INFOS_POWERPC_STRUCT
1740b57cec5SDimitry Andric #include "RegisterInfos_powerpc.h"
1750b57cec5SDimitry Andric #undef DECLARE_REGISTER_INFOS_POWERPC_STRUCT
1760b57cec5SDimitry Andric 
RegisterContextFreeBSD_powerpc(const ArchSpec & target_arch)1770b57cec5SDimitry Andric RegisterContextFreeBSD_powerpc::RegisterContextFreeBSD_powerpc(
1780b57cec5SDimitry Andric     const ArchSpec &target_arch)
1790b57cec5SDimitry Andric     : RegisterInfoInterface(target_arch) {}
1800b57cec5SDimitry Andric 
181fe6060f1SDimitry Andric RegisterContextFreeBSD_powerpc::~RegisterContextFreeBSD_powerpc() = default;
1820b57cec5SDimitry Andric 
GetGPRSize() const1830b57cec5SDimitry Andric size_t RegisterContextFreeBSD_powerpc::GetGPRSize() const {
1840b57cec5SDimitry Andric   // This is an 'abstract' base, so no GPR struct.
1850b57cec5SDimitry Andric   return 0;
1860b57cec5SDimitry Andric }
1870b57cec5SDimitry Andric 
GetRegisterInfo() const1880b57cec5SDimitry Andric const RegisterInfo *RegisterContextFreeBSD_powerpc::GetRegisterInfo() const {
1890b57cec5SDimitry Andric   llvm_unreachable("Abstract class!");
1900b57cec5SDimitry Andric   return nullptr;
1910b57cec5SDimitry Andric }
1920b57cec5SDimitry Andric 
GetRegisterCount() const1930b57cec5SDimitry Andric uint32_t RegisterContextFreeBSD_powerpc::GetRegisterCount() const { return 0; }
1940b57cec5SDimitry Andric 
RegisterContextFreeBSD_powerpc32(const ArchSpec & target_arch)1950b57cec5SDimitry Andric RegisterContextFreeBSD_powerpc32::RegisterContextFreeBSD_powerpc32(
1960b57cec5SDimitry Andric     const ArchSpec &target_arch)
1970b57cec5SDimitry Andric     : RegisterContextFreeBSD_powerpc(target_arch) {}
1980b57cec5SDimitry Andric 
199fe6060f1SDimitry Andric RegisterContextFreeBSD_powerpc32::~RegisterContextFreeBSD_powerpc32() = default;
2000b57cec5SDimitry Andric 
GetGPRSize() const2010b57cec5SDimitry Andric size_t RegisterContextFreeBSD_powerpc32::GetGPRSize() const {
2020b57cec5SDimitry Andric   return sizeof(GPR32);
2030b57cec5SDimitry Andric }
2040b57cec5SDimitry Andric 
GetRegisterInfo() const2050b57cec5SDimitry Andric const RegisterInfo *RegisterContextFreeBSD_powerpc32::GetRegisterInfo() const {
2060b57cec5SDimitry Andric   return g_register_infos_powerpc32;
2070b57cec5SDimitry Andric }
2080b57cec5SDimitry Andric 
GetRegisterCount() const2090b57cec5SDimitry Andric uint32_t RegisterContextFreeBSD_powerpc32::GetRegisterCount() const {
2100b57cec5SDimitry Andric   return static_cast<uint32_t>(sizeof(g_register_infos_powerpc32) /
2110b57cec5SDimitry Andric                                sizeof(g_register_infos_powerpc32[0]));
2120b57cec5SDimitry Andric }
2130b57cec5SDimitry Andric 
RegisterContextFreeBSD_powerpc64(const ArchSpec & target_arch)2140b57cec5SDimitry Andric RegisterContextFreeBSD_powerpc64::RegisterContextFreeBSD_powerpc64(
2150b57cec5SDimitry Andric     const ArchSpec &target_arch)
2160b57cec5SDimitry Andric     : RegisterContextFreeBSD_powerpc(target_arch) {}
2170b57cec5SDimitry Andric 
218fe6060f1SDimitry Andric RegisterContextFreeBSD_powerpc64::~RegisterContextFreeBSD_powerpc64() = default;
2190b57cec5SDimitry Andric 
GetGPRSize() const2200b57cec5SDimitry Andric size_t RegisterContextFreeBSD_powerpc64::GetGPRSize() const {
2210b57cec5SDimitry Andric   return sizeof(GPR64);
2220b57cec5SDimitry Andric }
2230b57cec5SDimitry Andric 
GetRegisterInfo() const2240b57cec5SDimitry Andric const RegisterInfo *RegisterContextFreeBSD_powerpc64::GetRegisterInfo() const {
225bdd1243dSDimitry Andric   if (GetTargetArchitecture().GetMachine() == llvm::Triple::ppc)
2260b57cec5SDimitry Andric     return g_register_infos_powerpc64_32;
2270b57cec5SDimitry Andric   return g_register_infos_powerpc64;
2280b57cec5SDimitry Andric }
2290b57cec5SDimitry Andric 
GetRegisterCount() const2300b57cec5SDimitry Andric uint32_t RegisterContextFreeBSD_powerpc64::GetRegisterCount() const {
2310b57cec5SDimitry Andric   return static_cast<uint32_t>(sizeof(g_register_infos_powerpc64) /
2320b57cec5SDimitry Andric                                sizeof(g_register_infos_powerpc64[0]));
2330b57cec5SDimitry Andric }
234