180814287SRaphael Isemann //===-- RegisterContextFreeBSD_powerpc.cpp --------------------------------===//
26256a0eaSJustin Hibbits //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66256a0eaSJustin Hibbits //
76256a0eaSJustin Hibbits //===---------------------------------------------------------------------===//
86256a0eaSJustin Hibbits 
96256a0eaSJustin Hibbits #include "RegisterContextFreeBSD_powerpc.h"
10b9c1b51eSKate Stone #include "RegisterContextPOSIX_powerpc.h"
11b9c1b51eSKate Stone #include <vector>
126256a0eaSJustin Hibbits 
136256a0eaSJustin Hibbits using namespace lldb_private;
146256a0eaSJustin Hibbits using namespace lldb;
156256a0eaSJustin Hibbits 
166256a0eaSJustin Hibbits // http://svnweb.freebsd.org/base/head/sys/powerpc/include/reg.h
17b9c1b51eSKate Stone typedef struct _GPR64 {
186256a0eaSJustin Hibbits   uint64_t r0;
196256a0eaSJustin Hibbits   uint64_t r1;
206256a0eaSJustin Hibbits   uint64_t r2;
216256a0eaSJustin Hibbits   uint64_t r3;
226256a0eaSJustin Hibbits   uint64_t r4;
236256a0eaSJustin Hibbits   uint64_t r5;
246256a0eaSJustin Hibbits   uint64_t r6;
256256a0eaSJustin Hibbits   uint64_t r7;
266256a0eaSJustin Hibbits   uint64_t r8;
276256a0eaSJustin Hibbits   uint64_t r9;
286256a0eaSJustin Hibbits   uint64_t r10;
296256a0eaSJustin Hibbits   uint64_t r11;
306256a0eaSJustin Hibbits   uint64_t r12;
316256a0eaSJustin Hibbits   uint64_t r13;
326256a0eaSJustin Hibbits   uint64_t r14;
336256a0eaSJustin Hibbits   uint64_t r15;
346256a0eaSJustin Hibbits   uint64_t r16;
356256a0eaSJustin Hibbits   uint64_t r17;
366256a0eaSJustin Hibbits   uint64_t r18;
376256a0eaSJustin Hibbits   uint64_t r19;
386256a0eaSJustin Hibbits   uint64_t r20;
396256a0eaSJustin Hibbits   uint64_t r21;
406256a0eaSJustin Hibbits   uint64_t r22;
416256a0eaSJustin Hibbits   uint64_t r23;
426256a0eaSJustin Hibbits   uint64_t r24;
436256a0eaSJustin Hibbits   uint64_t r25;
446256a0eaSJustin Hibbits   uint64_t r26;
456256a0eaSJustin Hibbits   uint64_t r27;
466256a0eaSJustin Hibbits   uint64_t r28;
476256a0eaSJustin Hibbits   uint64_t r29;
486256a0eaSJustin Hibbits   uint64_t r30;
496256a0eaSJustin Hibbits   uint64_t r31;
506256a0eaSJustin Hibbits   uint64_t lr;
516256a0eaSJustin Hibbits   uint64_t cr;
526256a0eaSJustin Hibbits   uint64_t xer;
536256a0eaSJustin Hibbits   uint64_t ctr;
546256a0eaSJustin Hibbits   uint64_t pc;
556256a0eaSJustin Hibbits } GPR64;
566256a0eaSJustin Hibbits 
57b9c1b51eSKate Stone typedef struct _GPR32 {
586256a0eaSJustin Hibbits   uint32_t r0;
596256a0eaSJustin Hibbits   uint32_t r1;
606256a0eaSJustin Hibbits   uint32_t r2;
616256a0eaSJustin Hibbits   uint32_t r3;
626256a0eaSJustin Hibbits   uint32_t r4;
636256a0eaSJustin Hibbits   uint32_t r5;
646256a0eaSJustin Hibbits   uint32_t r6;
656256a0eaSJustin Hibbits   uint32_t r7;
666256a0eaSJustin Hibbits   uint32_t r8;
676256a0eaSJustin Hibbits   uint32_t r9;
686256a0eaSJustin Hibbits   uint32_t r10;
696256a0eaSJustin Hibbits   uint32_t r11;
706256a0eaSJustin Hibbits   uint32_t r12;
716256a0eaSJustin Hibbits   uint32_t r13;
726256a0eaSJustin Hibbits   uint32_t r14;
736256a0eaSJustin Hibbits   uint32_t r15;
746256a0eaSJustin Hibbits   uint32_t r16;
756256a0eaSJustin Hibbits   uint32_t r17;
766256a0eaSJustin Hibbits   uint32_t r18;
776256a0eaSJustin Hibbits   uint32_t r19;
786256a0eaSJustin Hibbits   uint32_t r20;
796256a0eaSJustin Hibbits   uint32_t r21;
806256a0eaSJustin Hibbits   uint32_t r22;
816256a0eaSJustin Hibbits   uint32_t r23;
826256a0eaSJustin Hibbits   uint32_t r24;
836256a0eaSJustin Hibbits   uint32_t r25;
846256a0eaSJustin Hibbits   uint32_t r26;
856256a0eaSJustin Hibbits   uint32_t r27;
866256a0eaSJustin Hibbits   uint32_t r28;
876256a0eaSJustin Hibbits   uint32_t r29;
886256a0eaSJustin Hibbits   uint32_t r30;
896256a0eaSJustin Hibbits   uint32_t r31;
906256a0eaSJustin Hibbits   uint32_t lr;
916256a0eaSJustin Hibbits   uint32_t cr;
926256a0eaSJustin Hibbits   uint32_t xer;
936256a0eaSJustin Hibbits   uint32_t ctr;
946256a0eaSJustin Hibbits   uint32_t pc;
956256a0eaSJustin Hibbits } GPR32;
966256a0eaSJustin Hibbits 
97b9c1b51eSKate Stone typedef struct _FPR {
986256a0eaSJustin Hibbits   uint64_t f0;
996256a0eaSJustin Hibbits   uint64_t f1;
1006256a0eaSJustin Hibbits   uint64_t f2;
1016256a0eaSJustin Hibbits   uint64_t f3;
1026256a0eaSJustin Hibbits   uint64_t f4;
1036256a0eaSJustin Hibbits   uint64_t f5;
1046256a0eaSJustin Hibbits   uint64_t f6;
1056256a0eaSJustin Hibbits   uint64_t f7;
1066256a0eaSJustin Hibbits   uint64_t f8;
1076256a0eaSJustin Hibbits   uint64_t f9;
1086256a0eaSJustin Hibbits   uint64_t f10;
1096256a0eaSJustin Hibbits   uint64_t f11;
1106256a0eaSJustin Hibbits   uint64_t f12;
1116256a0eaSJustin Hibbits   uint64_t f13;
1126256a0eaSJustin Hibbits   uint64_t f14;
1136256a0eaSJustin Hibbits   uint64_t f15;
1146256a0eaSJustin Hibbits   uint64_t f16;
1156256a0eaSJustin Hibbits   uint64_t f17;
1166256a0eaSJustin Hibbits   uint64_t f18;
1176256a0eaSJustin Hibbits   uint64_t f19;
1186256a0eaSJustin Hibbits   uint64_t f20;
1196256a0eaSJustin Hibbits   uint64_t f21;
1206256a0eaSJustin Hibbits   uint64_t f22;
1216256a0eaSJustin Hibbits   uint64_t f23;
1226256a0eaSJustin Hibbits   uint64_t f24;
1236256a0eaSJustin Hibbits   uint64_t f25;
1246256a0eaSJustin Hibbits   uint64_t f26;
1256256a0eaSJustin Hibbits   uint64_t f27;
1266256a0eaSJustin Hibbits   uint64_t f28;
1276256a0eaSJustin Hibbits   uint64_t f29;
1286256a0eaSJustin Hibbits   uint64_t f30;
1296256a0eaSJustin Hibbits   uint64_t f31;
1306256a0eaSJustin Hibbits   uint64_t fpscr;
1316256a0eaSJustin Hibbits } FPR;
1326256a0eaSJustin Hibbits 
133b9c1b51eSKate Stone typedef struct _VMX {
134f9ec0d1eSJustin Hibbits   uint32_t v0[4];
135f9ec0d1eSJustin Hibbits   uint32_t v1[4];
136f9ec0d1eSJustin Hibbits   uint32_t v2[4];
137f9ec0d1eSJustin Hibbits   uint32_t v3[4];
138f9ec0d1eSJustin Hibbits   uint32_t v4[4];
139f9ec0d1eSJustin Hibbits   uint32_t v5[4];
140f9ec0d1eSJustin Hibbits   uint32_t v6[4];
141f9ec0d1eSJustin Hibbits   uint32_t v7[4];
142f9ec0d1eSJustin Hibbits   uint32_t v8[4];
143f9ec0d1eSJustin Hibbits   uint32_t v9[4];
144f9ec0d1eSJustin Hibbits   uint32_t v10[4];
145f9ec0d1eSJustin Hibbits   uint32_t v11[4];
146f9ec0d1eSJustin Hibbits   uint32_t v12[4];
147f9ec0d1eSJustin Hibbits   uint32_t v13[4];
148f9ec0d1eSJustin Hibbits   uint32_t v14[4];
149f9ec0d1eSJustin Hibbits   uint32_t v15[4];
150f9ec0d1eSJustin Hibbits   uint32_t v16[4];
151f9ec0d1eSJustin Hibbits   uint32_t v17[4];
152f9ec0d1eSJustin Hibbits   uint32_t v18[4];
153f9ec0d1eSJustin Hibbits   uint32_t v19[4];
154f9ec0d1eSJustin Hibbits   uint32_t v20[4];
155f9ec0d1eSJustin Hibbits   uint32_t v21[4];
156f9ec0d1eSJustin Hibbits   uint32_t v22[4];
157f9ec0d1eSJustin Hibbits   uint32_t v23[4];
158f9ec0d1eSJustin Hibbits   uint32_t v24[4];
159f9ec0d1eSJustin Hibbits   uint32_t v25[4];
160f9ec0d1eSJustin Hibbits   uint32_t v26[4];
161f9ec0d1eSJustin Hibbits   uint32_t v27[4];
162f9ec0d1eSJustin Hibbits   uint32_t v28[4];
163f9ec0d1eSJustin Hibbits   uint32_t v29[4];
164f9ec0d1eSJustin Hibbits   uint32_t v30[4];
165f9ec0d1eSJustin Hibbits   uint32_t v31[4];
166f9ec0d1eSJustin Hibbits   uint32_t pad[2];
167f9ec0d1eSJustin Hibbits   uint32_t vrsave;
168f9ec0d1eSJustin Hibbits   uint32_t vscr;
169f9ec0d1eSJustin Hibbits } VMX;
170f9ec0d1eSJustin Hibbits 
171b9c1b51eSKate Stone // Include RegisterInfos_powerpc to declare our g_register_infos_powerpc
172b9c1b51eSKate Stone // structure.
1736256a0eaSJustin Hibbits #define DECLARE_REGISTER_INFOS_POWERPC_STRUCT
1746256a0eaSJustin Hibbits #include "RegisterInfos_powerpc.h"
1756256a0eaSJustin Hibbits #undef DECLARE_REGISTER_INFOS_POWERPC_STRUCT
1766256a0eaSJustin Hibbits 
RegisterContextFreeBSD_powerpc(const ArchSpec & target_arch)177b9c1b51eSKate Stone RegisterContextFreeBSD_powerpc::RegisterContextFreeBSD_powerpc(
178b9c1b51eSKate Stone     const ArchSpec &target_arch)
179b9c1b51eSKate Stone     : RegisterInfoInterface(target_arch) {}
1806256a0eaSJustin Hibbits 
181*fd2433e1SJonas Devlieghere RegisterContextFreeBSD_powerpc::~RegisterContextFreeBSD_powerpc() = default;
1826256a0eaSJustin Hibbits 
GetGPRSize() const183b9c1b51eSKate Stone size_t RegisterContextFreeBSD_powerpc::GetGPRSize() const {
18489e6f385SJustin Hibbits   // This is an 'abstract' base, so no GPR struct.
18589e6f385SJustin Hibbits   return 0;
1866256a0eaSJustin Hibbits }
1876256a0eaSJustin Hibbits 
GetRegisterInfo() const188b9c1b51eSKate Stone const RegisterInfo *RegisterContextFreeBSD_powerpc::GetRegisterInfo() const {
1896256a0eaSJustin Hibbits   // assert (m_target_arch.GetCore() == ArchSpec::eCore_powerpc);
1906256a0eaSJustin Hibbits   llvm_unreachable("Abstract class!");
191248a1305SKonrad Kleine   return nullptr;
1926256a0eaSJustin Hibbits }
1936256a0eaSJustin Hibbits 
GetRegisterCount() const194b9c1b51eSKate Stone uint32_t RegisterContextFreeBSD_powerpc::GetRegisterCount() const { return 0; }
1956256a0eaSJustin Hibbits 
RegisterContextFreeBSD_powerpc32(const ArchSpec & target_arch)196b9c1b51eSKate Stone RegisterContextFreeBSD_powerpc32::RegisterContextFreeBSD_powerpc32(
197b9c1b51eSKate Stone     const ArchSpec &target_arch)
198b9c1b51eSKate Stone     : RegisterContextFreeBSD_powerpc(target_arch) {}
1996256a0eaSJustin Hibbits 
200*fd2433e1SJonas Devlieghere RegisterContextFreeBSD_powerpc32::~RegisterContextFreeBSD_powerpc32() = default;
2016256a0eaSJustin Hibbits 
GetGPRSize() const202b9c1b51eSKate Stone size_t RegisterContextFreeBSD_powerpc32::GetGPRSize() const {
2036256a0eaSJustin Hibbits   return sizeof(GPR32);
2046256a0eaSJustin Hibbits }
2056256a0eaSJustin Hibbits 
GetRegisterInfo() const206b9c1b51eSKate Stone const RegisterInfo *RegisterContextFreeBSD_powerpc32::GetRegisterInfo() const {
2076256a0eaSJustin Hibbits   // assert (m_target_arch.GetCore() == ArchSpec::eCore_powerpc);
2086256a0eaSJustin Hibbits   return g_register_infos_powerpc32;
2096256a0eaSJustin Hibbits }
2106256a0eaSJustin Hibbits 
GetRegisterCount() const211b9c1b51eSKate Stone uint32_t RegisterContextFreeBSD_powerpc32::GetRegisterCount() const {
212b9c1b51eSKate Stone   return static_cast<uint32_t>(sizeof(g_register_infos_powerpc32) /
213b9c1b51eSKate Stone                                sizeof(g_register_infos_powerpc32[0]));
2146256a0eaSJustin Hibbits }
2156256a0eaSJustin Hibbits 
RegisterContextFreeBSD_powerpc64(const ArchSpec & target_arch)216b9c1b51eSKate Stone RegisterContextFreeBSD_powerpc64::RegisterContextFreeBSD_powerpc64(
217b9c1b51eSKate Stone     const ArchSpec &target_arch)
218b9c1b51eSKate Stone     : RegisterContextFreeBSD_powerpc(target_arch) {}
2196256a0eaSJustin Hibbits 
220*fd2433e1SJonas Devlieghere RegisterContextFreeBSD_powerpc64::~RegisterContextFreeBSD_powerpc64() = default;
2216256a0eaSJustin Hibbits 
GetGPRSize() const222b9c1b51eSKate Stone size_t RegisterContextFreeBSD_powerpc64::GetGPRSize() const {
2236256a0eaSJustin Hibbits   return sizeof(GPR64);
2246256a0eaSJustin Hibbits }
2256256a0eaSJustin Hibbits 
GetRegisterInfo() const226b9c1b51eSKate Stone const RegisterInfo *RegisterContextFreeBSD_powerpc64::GetRegisterInfo() const {
2276256a0eaSJustin Hibbits   // assert (m_target_arch.GetCore() == ArchSpec::eCore_powerpc);
22889e6f385SJustin Hibbits   if (m_target_arch.GetMachine() == llvm::Triple::ppc)
22989e6f385SJustin Hibbits     return g_register_infos_powerpc64_32;
2306256a0eaSJustin Hibbits   return g_register_infos_powerpc64;
2316256a0eaSJustin Hibbits }
2326256a0eaSJustin Hibbits 
GetRegisterCount() const233b9c1b51eSKate Stone uint32_t RegisterContextFreeBSD_powerpc64::GetRegisterCount() const {
234b9c1b51eSKate Stone   return static_cast<uint32_t>(sizeof(g_register_infos_powerpc64) /
235b9c1b51eSKate Stone                                sizeof(g_register_infos_powerpc64[0]));
2366256a0eaSJustin Hibbits }
237