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 AndricRegisterContextFreeBSD_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 Andricsize_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 Andricconst RegisterInfo *RegisterContextFreeBSD_powerpc::GetRegisterInfo() const { 1890b57cec5SDimitry Andric llvm_unreachable("Abstract class!"); 1900b57cec5SDimitry Andric return nullptr; 1910b57cec5SDimitry Andric } 1920b57cec5SDimitry Andric GetRegisterCount() const1930b57cec5SDimitry Andricuint32_t RegisterContextFreeBSD_powerpc::GetRegisterCount() const { return 0; } 1940b57cec5SDimitry Andric RegisterContextFreeBSD_powerpc32(const ArchSpec & target_arch)1950b57cec5SDimitry AndricRegisterContextFreeBSD_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 Andricsize_t RegisterContextFreeBSD_powerpc32::GetGPRSize() const { 2020b57cec5SDimitry Andric return sizeof(GPR32); 2030b57cec5SDimitry Andric } 2040b57cec5SDimitry Andric GetRegisterInfo() const2050b57cec5SDimitry Andricconst RegisterInfo *RegisterContextFreeBSD_powerpc32::GetRegisterInfo() const { 2060b57cec5SDimitry Andric return g_register_infos_powerpc32; 2070b57cec5SDimitry Andric } 2080b57cec5SDimitry Andric GetRegisterCount() const2090b57cec5SDimitry Andricuint32_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 AndricRegisterContextFreeBSD_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 Andricsize_t RegisterContextFreeBSD_powerpc64::GetGPRSize() const { 2210b57cec5SDimitry Andric return sizeof(GPR64); 2220b57cec5SDimitry Andric } 2230b57cec5SDimitry Andric GetRegisterInfo() const2240b57cec5SDimitry Andricconst 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 Andricuint32_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