Skip to content

Commit f9ec0d1

Browse files
author
Justin Hibbits
committedFeb 5, 2015
Implement initial Altivec support
Summary: This adds the register plumbing, as well as register reading in FreeBSD core dumps. Further work on the POSIX/FreeBSD ProcessMonitor is required in order to support ptrace access to these registers. Reviewers: tfiala, emaste Reviewed By: emaste Subscribers: emaste, lldb-commits Differential Revision: http://reviews.llvm.org/D7039 llvm-svn: 228278
1 parent b07ee8d commit f9ec0d1

14 files changed

+317
-20
lines changed
 

‎lldb/source/Plugins/ABI/SysV-ppc/ABISysV_ppc.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -685,9 +685,7 @@ ABISysV_ppc::GetReturnValueObjectSimple (Thread &thread,
685685
if (byte_size > 0)
686686
{
687687

688-
const RegisterInfo *altivec_reg = reg_ctx->GetRegisterInfoByName("v0", 0);
689-
if (altivec_reg == NULL)
690-
altivec_reg = reg_ctx->GetRegisterInfoByName("mm0", 0);
688+
const RegisterInfo *altivec_reg = reg_ctx->GetRegisterInfoByName("v2", 0);
691689
if (altivec_reg)
692690
{
693691
if (byte_size <= altivec_reg->byte_size)

‎lldb/source/Plugins/ABI/SysV-ppc64/ABISysV_ppc64.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -685,9 +685,7 @@ ABISysV_ppc64::GetReturnValueObjectSimple (Thread &thread,
685685
if (byte_size > 0)
686686
{
687687

688-
const RegisterInfo *altivec_reg = reg_ctx->GetRegisterInfoByName("v0", 0);
689-
if (altivec_reg == NULL)
690-
altivec_reg = reg_ctx->GetRegisterInfoByName("mm0", 0);
688+
const RegisterInfo *altivec_reg = reg_ctx->GetRegisterInfoByName("v2", 0);
691689
if (altivec_reg)
692690
{
693691
if (byte_size <= altivec_reg->byte_size)

‎lldb/source/Plugins/Process/POSIX/RegisterContextPOSIXProcessMonitor_powerpc.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,13 @@ RegisterContextPOSIXProcessMonitor_powerpc::ReadFPR()
4949
return monitor.ReadFPR(m_thread.GetID(), &m_fpr_powerpc, sizeof(m_fpr_powerpc));
5050
}
5151

52+
bool
53+
RegisterContextPOSIXProcessMonitor_powerpc::ReadVMX()
54+
{
55+
// XXX: Need a way to read/write process VMX registers with ptrace.
56+
return false;
57+
}
58+
5259
bool
5360
RegisterContextPOSIXProcessMonitor_powerpc::WriteGPR()
5461
{
@@ -63,6 +70,13 @@ RegisterContextPOSIXProcessMonitor_powerpc::WriteFPR()
6370
return monitor.WriteFPR(m_thread.GetID(), &m_fpr_powerpc, sizeof(m_fpr_powerpc));
6471
}
6572

73+
bool
74+
RegisterContextPOSIXProcessMonitor_powerpc::WriteVMX()
75+
{
76+
// XXX: Need a way to read/write process VMX registers with ptrace.
77+
return false;
78+
}
79+
6680
bool
6781
RegisterContextPOSIXProcessMonitor_powerpc::ReadRegister(const unsigned reg,
6882
RegisterValue &value)

‎lldb/source/Plugins/Process/POSIX/RegisterContextPOSIXProcessMonitor_powerpc.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,27 @@ class RegisterContextPOSIXProcessMonitor_powerpc:
2222
lldb_private::RegisterInfoInterface *register_info);
2323

2424
protected:
25+
bool
26+
IsVMX();
27+
2528
bool
2629
ReadGPR();
2730

2831
bool
2932
ReadFPR();
3033

34+
bool
35+
ReadVMX();
36+
3137
bool
3238
WriteGPR();
3339

3440
bool
3541
WriteFPR();
3642

43+
bool
44+
WriteVMX();
45+
3746
// lldb_private::RegisterContext
3847
bool
3948
ReadRegister(const unsigned reg, lldb_private::RegisterValue &value);

‎lldb/source/Plugins/Process/Utility/RegisterContextFreeBSD_powerpc.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,45 @@ typedef struct _FPR
134134
uint64_t fpscr;
135135
} FPR;
136136

137+
typedef struct _VMX
138+
{
139+
uint32_t v0[4];
140+
uint32_t v1[4];
141+
uint32_t v2[4];
142+
uint32_t v3[4];
143+
uint32_t v4[4];
144+
uint32_t v5[4];
145+
uint32_t v6[4];
146+
uint32_t v7[4];
147+
uint32_t v8[4];
148+
uint32_t v9[4];
149+
uint32_t v10[4];
150+
uint32_t v11[4];
151+
uint32_t v12[4];
152+
uint32_t v13[4];
153+
uint32_t v14[4];
154+
uint32_t v15[4];
155+
uint32_t v16[4];
156+
uint32_t v17[4];
157+
uint32_t v18[4];
158+
uint32_t v19[4];
159+
uint32_t v20[4];
160+
uint32_t v21[4];
161+
uint32_t v22[4];
162+
uint32_t v23[4];
163+
uint32_t v24[4];
164+
uint32_t v25[4];
165+
uint32_t v26[4];
166+
uint32_t v27[4];
167+
uint32_t v28[4];
168+
uint32_t v29[4];
169+
uint32_t v30[4];
170+
uint32_t v31[4];
171+
uint32_t pad[2];
172+
uint32_t vrsave;
173+
uint32_t vscr;
174+
} VMX;
175+
137176
//---------------------------------------------------------------------------
138177
// Include RegisterInfos_powerpc to declare our g_register_infos_powerpc structure.
139178
//---------------------------------------------------------------------------

‎lldb/source/Plugins/Process/Utility/RegisterContextPOSIX_powerpc.cpp

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,17 +106,57 @@ uint32_t g_fpr_regnums[] =
106106
fpr_fpscr_powerpc,
107107
};
108108

109+
static const
110+
uint32_t g_vmx_regnums[] =
111+
{
112+
vmx_v0_powerpc,
113+
vmx_v1_powerpc,
114+
vmx_v2_powerpc,
115+
vmx_v3_powerpc,
116+
vmx_v4_powerpc,
117+
vmx_v5_powerpc,
118+
vmx_v6_powerpc,
119+
vmx_v7_powerpc,
120+
vmx_v8_powerpc,
121+
vmx_v9_powerpc,
122+
vmx_v10_powerpc,
123+
vmx_v11_powerpc,
124+
vmx_v12_powerpc,
125+
vmx_v13_powerpc,
126+
vmx_v14_powerpc,
127+
vmx_v15_powerpc,
128+
vmx_v16_powerpc,
129+
vmx_v17_powerpc,
130+
vmx_v18_powerpc,
131+
vmx_v19_powerpc,
132+
vmx_v20_powerpc,
133+
vmx_v21_powerpc,
134+
vmx_v22_powerpc,
135+
vmx_v23_powerpc,
136+
vmx_v24_powerpc,
137+
vmx_v25_powerpc,
138+
vmx_v26_powerpc,
139+
vmx_v27_powerpc,
140+
vmx_v28_powerpc,
141+
vmx_v29_powerpc,
142+
vmx_v30_powerpc,
143+
vmx_v31_powerpc,
144+
vmx_vrsave_powerpc,
145+
vmx_vscr_powerpc,
146+
};
147+
109148
// Number of register sets provided by this context.
110149
enum
111150
{
112-
k_num_register_sets = 2
151+
k_num_register_sets = 3
113152
};
114153

115154
static const RegisterSet
116155
g_reg_sets_powerpc[k_num_register_sets] =
117156
{
118157
{ "General Purpose Registers", "gpr", k_num_gpr_registers_powerpc, g_gpr_regnums },
119158
{ "Floating Point Registers", "fpr", k_num_fpr_registers_powerpc, g_fpr_regnums },
159+
{ "Altivec/VMX Registers", "vmx", k_num_vmx_registers_powerpc, g_vmx_regnums },
120160
};
121161

122162
bool RegisterContextPOSIX_powerpc::IsGPR(unsigned reg)
@@ -127,10 +167,15 @@ bool RegisterContextPOSIX_powerpc::IsGPR(unsigned reg)
127167
bool
128168
RegisterContextPOSIX_powerpc::IsFPR(unsigned reg)
129169
{
130-
// XXX
131170
return (reg >= k_first_fpr) && (reg <= k_last_fpr);
132171
}
133172

173+
bool
174+
RegisterContextPOSIX_powerpc::IsVMX(unsigned reg)
175+
{
176+
return (reg >= k_first_vmx) && (reg <= k_last_vmx);
177+
}
178+
134179
RegisterContextPOSIX_powerpc::RegisterContextPOSIX_powerpc(Thread &thread,
135180
uint32_t concrete_frame_idx,
136181
RegisterInfoInterface *register_info)

‎lldb/source/Plugins/Process/Utility/RegisterContextPOSIX_powerpc.h

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,47 @@ enum
9797
fpr_fpscr_powerpc,
9898
k_last_fpr = fpr_fpscr_powerpc,
9999

100+
k_first_vmx,
101+
vmx_v0_powerpc = k_first_vmx,
102+
vmx_v1_powerpc,
103+
vmx_v2_powerpc,
104+
vmx_v3_powerpc,
105+
vmx_v4_powerpc,
106+
vmx_v5_powerpc,
107+
vmx_v6_powerpc,
108+
vmx_v7_powerpc,
109+
vmx_v8_powerpc,
110+
vmx_v9_powerpc,
111+
vmx_v10_powerpc,
112+
vmx_v11_powerpc,
113+
vmx_v12_powerpc,
114+
vmx_v13_powerpc,
115+
vmx_v14_powerpc,
116+
vmx_v15_powerpc,
117+
vmx_v16_powerpc,
118+
vmx_v17_powerpc,
119+
vmx_v18_powerpc,
120+
vmx_v19_powerpc,
121+
vmx_v20_powerpc,
122+
vmx_v21_powerpc,
123+
vmx_v22_powerpc,
124+
vmx_v23_powerpc,
125+
vmx_v24_powerpc,
126+
vmx_v25_powerpc,
127+
vmx_v26_powerpc,
128+
vmx_v27_powerpc,
129+
vmx_v28_powerpc,
130+
vmx_v29_powerpc,
131+
vmx_v30_powerpc,
132+
vmx_v31_powerpc,
133+
vmx_vrsave_powerpc,
134+
vmx_vscr_powerpc,
135+
k_last_vmx = vmx_vscr_powerpc,
136+
100137
k_num_registers_powerpc,
101138
k_num_gpr_registers_powerpc = k_last_gpr_powerpc - k_first_gpr_powerpc + 1,
102139
k_num_fpr_registers_powerpc = k_last_fpr - k_first_fpr + 1,
140+
k_num_vmx_registers_powerpc = k_last_vmx - k_first_vmx + 1,
103141
};
104142

105143
class RegisterContextPOSIX_powerpc
@@ -148,6 +186,7 @@ class RegisterContextPOSIX_powerpc
148186
protected:
149187
uint64_t m_gpr_powerpc[k_num_gpr_registers_powerpc]; // general purpose registers.
150188
uint64_t m_fpr_powerpc[k_num_fpr_registers_powerpc]; // floating point registers.
189+
uint32_t m_vmx_powerpc[k_num_vmx_registers_powerpc][4];
151190
std::unique_ptr<lldb_private::RegisterInfoInterface> m_register_info_ap; // Register Info Interface (FreeBSD or Linux)
152191

153192
// Determines if an extended register set is supported on the processor running the inferior process.
@@ -163,12 +202,17 @@ class RegisterContextPOSIX_powerpc
163202
bool
164203
IsFPR(unsigned reg);
165204

205+
bool
206+
IsVMX(unsigned reg);
207+
166208
lldb::ByteOrder GetByteOrder();
167209

168210
virtual bool ReadGPR() = 0;
169211
virtual bool ReadFPR() = 0;
212+
virtual bool ReadVMX() = 0;
170213
virtual bool WriteGPR() = 0;
171214
virtual bool WriteFPR() = 0;
215+
virtual bool WriteVMX() = 0;
172216
};
173217

174218
#endif // #ifndef liblldb_RegisterContextPOSIX_powerpc_H_

‎lldb/source/Plugins/Process/Utility/RegisterContext_powerpc.h

Lines changed: 74 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,45 @@ enum
7979
gcc_dwarf_f31_powerpc,
8080
gcc_dwarf_cr_powerpc,
8181
gcc_dwarf_fpscr_powerpc,
82+
gcc_dwarf_msr_powerpc,
83+
gcc_dwarf_vscr_powerpc,
8284
gcc_dwarf_xer_powerpc = 101,
8385
gcc_dwarf_lr_powerpc = 108,
8486
gcc_dwarf_ctr_powerpc,
8587
gcc_dwarf_pc_powerpc,
88+
gcc_dwarf_vrsave_powerpc = 356,
89+
gcc_dwarf_v0_powerpc = 1124,
90+
gcc_dwarf_v1_powerpc,
91+
gcc_dwarf_v2_powerpc,
92+
gcc_dwarf_v3_powerpc,
93+
gcc_dwarf_v4_powerpc,
94+
gcc_dwarf_v5_powerpc,
95+
gcc_dwarf_v6_powerpc,
96+
gcc_dwarf_v7_powerpc,
97+
gcc_dwarf_v8_powerpc,
98+
gcc_dwarf_v9_powerpc,
99+
gcc_dwarf_v10_powerpc,
100+
gcc_dwarf_v11_powerpc,
101+
gcc_dwarf_v12_powerpc,
102+
gcc_dwarf_v13_powerpc,
103+
gcc_dwarf_v14_powerpc,
104+
gcc_dwarf_v15_powerpc,
105+
gcc_dwarf_v16_powerpc,
106+
gcc_dwarf_v17_powerpc,
107+
gcc_dwarf_v18_powerpc,
108+
gcc_dwarf_v19_powerpc,
109+
gcc_dwarf_v20_powerpc,
110+
gcc_dwarf_v21_powerpc,
111+
gcc_dwarf_v22_powerpc,
112+
gcc_dwarf_v23_powerpc,
113+
gcc_dwarf_v24_powerpc,
114+
gcc_dwarf_v25_powerpc,
115+
gcc_dwarf_v26_powerpc,
116+
gcc_dwarf_v27_powerpc,
117+
gcc_dwarf_v28_powerpc,
118+
gcc_dwarf_v29_powerpc,
119+
gcc_dwarf_v30_powerpc,
120+
gcc_dwarf_v31_powerpc,
86121
};
87122

88123
// GDB Register numbers (eRegisterKindGDB)
@@ -152,12 +187,46 @@ enum
152187
gdb_f29_powerpc,
153188
gdb_f30_powerpc,
154189
gdb_f31_powerpc,
155-
gdb_cr_powerpc,
156-
gdb_fpscr_powerpc,
157-
gdb_xer_powerpc = 101,
158-
gdb_lr_powerpc = 108,
159-
gdb_ctr_powerpc,
160190
gdb_pc_powerpc,
191+
gdb_cr_powerpc = 66,
192+
gdb_lr_powerpc,
193+
gdb_ctr_powerpc,
194+
gdb_xer_powerpc,
195+
gdb_fpscr_powerpc,
196+
gdb_v0_powerpc = 106,
197+
gdb_v1_powerpc,
198+
gdb_v2_powerpc,
199+
gdb_v3_powerpc,
200+
gdb_v4_powerpc,
201+
gdb_v5_powerpc,
202+
gdb_v6_powerpc,
203+
gdb_v7_powerpc,
204+
gdb_v8_powerpc,
205+
gdb_v9_powerpc,
206+
gdb_v10_powerpc,
207+
gdb_v11_powerpc,
208+
gdb_v12_powerpc,
209+
gdb_v13_powerpc,
210+
gdb_v14_powerpc,
211+
gdb_v15_powerpc,
212+
gdb_v16_powerpc,
213+
gdb_v17_powerpc,
214+
gdb_v18_powerpc,
215+
gdb_v19_powerpc,
216+
gdb_v20_powerpc,
217+
gdb_v21_powerpc,
218+
gdb_v22_powerpc,
219+
gdb_v23_powerpc,
220+
gdb_v24_powerpc,
221+
gdb_v25_powerpc,
222+
gdb_v26_powerpc,
223+
gdb_v27_powerpc,
224+
gdb_v28_powerpc,
225+
gdb_v29_powerpc,
226+
gdb_v30_powerpc,
227+
gdb_v31_powerpc,
228+
gdb_vscr_powerpc,
229+
gdb_vrsave_powerpc,
161230
};
162231

163232
#endif // liblldb_RegisterContext_powerpc_H_

‎lldb/source/Plugins/Process/Utility/RegisterInfos_powerpc.h

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
(offsetof(GPR, regname))
1515
#define FPR_OFFSET(regname) \
1616
(offsetof(FPR, regname))
17+
#define VMX_OFFSET(regname) \
18+
(offsetof(VMX, regname))
1719
#define GPR_SIZE(regname) \
1820
(sizeof(((GPR*)NULL)->regname))
1921

@@ -26,6 +28,9 @@
2628
#define DEFINE_FPR(reg, lldb_kind) \
2729
{ #reg, NULL, 8, FPR_OFFSET(reg), eEncodingIEEE754, \
2830
eFormatFloat, { gcc_dwarf_##reg##_powerpc, gcc_dwarf_##reg##_powerpc, lldb_kind, gdb_##reg##_powerpc, fpr_##reg##_powerpc }, NULL, NULL }
31+
#define DEFINE_VMX(reg, lldb_kind) \
32+
{ #reg, NULL, 16, VMX_OFFSET(reg), eEncodingVector, \
33+
eFormatVectorOfUInt32, { gcc_dwarf_##reg##_powerpc, gcc_dwarf_##reg##_powerpc, lldb_kind, gdb_##reg##_powerpc, vmx_##reg##_powerpc }, NULL, NULL }
2934

3035
// General purpose registers. GCC, DWARF, Generic, GDB
3136
#define POWERPC_REGS \
@@ -98,7 +103,42 @@
98103
DEFINE_FPR(f29, LLDB_INVALID_REGNUM), \
99104
DEFINE_FPR(f30, LLDB_INVALID_REGNUM), \
100105
DEFINE_FPR(f31, LLDB_INVALID_REGNUM), \
101-
{ "fpscr", NULL, 8, FPR_OFFSET(fpscr), eEncodingUint, eFormatHex, { gcc_dwarf_fpscr_powerpc, gcc_dwarf_fpscr_powerpc, LLDB_INVALID_REGNUM, gdb_fpscr_powerpc, fpr_fpscr_powerpc }, NULL, NULL },
106+
{ "fpscr", NULL, 8, FPR_OFFSET(fpscr), eEncodingUint, eFormatHex, { gcc_dwarf_fpscr_powerpc, gcc_dwarf_fpscr_powerpc, LLDB_INVALID_REGNUM, gdb_fpscr_powerpc, fpr_fpscr_powerpc }, NULL, NULL }, \
107+
DEFINE_VMX(v0, LLDB_INVALID_REGNUM), \
108+
DEFINE_VMX(v1, LLDB_INVALID_REGNUM), \
109+
DEFINE_VMX(v2, LLDB_INVALID_REGNUM), \
110+
DEFINE_VMX(v3, LLDB_INVALID_REGNUM), \
111+
DEFINE_VMX(v4, LLDB_INVALID_REGNUM), \
112+
DEFINE_VMX(v5, LLDB_INVALID_REGNUM), \
113+
DEFINE_VMX(v6, LLDB_INVALID_REGNUM), \
114+
DEFINE_VMX(v7, LLDB_INVALID_REGNUM), \
115+
DEFINE_VMX(v8, LLDB_INVALID_REGNUM), \
116+
DEFINE_VMX(v9, LLDB_INVALID_REGNUM), \
117+
DEFINE_VMX(v10, LLDB_INVALID_REGNUM), \
118+
DEFINE_VMX(v11, LLDB_INVALID_REGNUM), \
119+
DEFINE_VMX(v12, LLDB_INVALID_REGNUM), \
120+
DEFINE_VMX(v13, LLDB_INVALID_REGNUM), \
121+
DEFINE_VMX(v14, LLDB_INVALID_REGNUM), \
122+
DEFINE_VMX(v15, LLDB_INVALID_REGNUM), \
123+
DEFINE_VMX(v16, LLDB_INVALID_REGNUM), \
124+
DEFINE_VMX(v17, LLDB_INVALID_REGNUM), \
125+
DEFINE_VMX(v18, LLDB_INVALID_REGNUM), \
126+
DEFINE_VMX(v19, LLDB_INVALID_REGNUM), \
127+
DEFINE_VMX(v20, LLDB_INVALID_REGNUM), \
128+
DEFINE_VMX(v21, LLDB_INVALID_REGNUM), \
129+
DEFINE_VMX(v22, LLDB_INVALID_REGNUM), \
130+
DEFINE_VMX(v23, LLDB_INVALID_REGNUM), \
131+
DEFINE_VMX(v24, LLDB_INVALID_REGNUM), \
132+
DEFINE_VMX(v25, LLDB_INVALID_REGNUM), \
133+
DEFINE_VMX(v26, LLDB_INVALID_REGNUM), \
134+
DEFINE_VMX(v27, LLDB_INVALID_REGNUM), \
135+
DEFINE_VMX(v28, LLDB_INVALID_REGNUM), \
136+
DEFINE_VMX(v29, LLDB_INVALID_REGNUM), \
137+
DEFINE_VMX(v30, LLDB_INVALID_REGNUM), \
138+
DEFINE_VMX(v31, LLDB_INVALID_REGNUM), \
139+
{ "vrsave", NULL, 4, VMX_OFFSET(vrsave), eEncodingUint, eFormatHex, { gcc_dwarf_vrsave_powerpc, gcc_dwarf_vrsave_powerpc, LLDB_INVALID_REGNUM, gdb_vrsave_powerpc, vmx_vrsave_powerpc }, NULL, NULL }, \
140+
{ "vscr", NULL, 4, VMX_OFFSET(vscr), eEncodingUint, eFormatHex, { gcc_dwarf_vscr_powerpc, gcc_dwarf_vscr_powerpc, LLDB_INVALID_REGNUM, gdb_vscr_powerpc, vmx_vscr_powerpc }, NULL, NULL },
141+
102142
static RegisterInfo
103143
g_register_infos_powerpc64[] =
104144
{

‎lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,8 @@ enum {
412412
NT_FPREGSET,
413413
NT_PRPSINFO,
414414
NT_THRMISC = 7,
415-
NT_PROCSTAT_AUXV = 16
415+
NT_PROCSTAT_AUXV = 16,
416+
NT_PPC_VMX = 0x100
416417
};
417418

418419
}
@@ -538,6 +539,9 @@ ProcessElfCore::ParseThreadContextsFromNoteSegment(const elf::ELFProgramHeader *
538539
// FIXME: FreeBSD sticks an int at the beginning of the note
539540
m_auxv = DataExtractor(segment_data, note_start + 4, note_size - 4);
540541
break;
542+
case FREEBSD::NT_PPC_VMX:
543+
thread_data->vregset = note_data;
544+
break;
541545
default:
542546
break;
543547
}

‎lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_powerpc.cpp

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ using namespace lldb_private;
1818
RegisterContextCorePOSIX_powerpc::RegisterContextCorePOSIX_powerpc(Thread &thread,
1919
RegisterInfoInterface *register_info,
2020
const DataExtractor &gpregset,
21-
const DataExtractor &fpregset)
21+
const DataExtractor &fpregset,
22+
const DataExtractor &vregset)
2223
: RegisterContextPOSIX_powerpc(thread, 0, register_info)
2324
{
2425
m_gpr_buffer.reset(new DataBufferHeap(gpregset.GetDataStart(), gpregset.GetByteSize()));
@@ -27,6 +28,9 @@ RegisterContextCorePOSIX_powerpc::RegisterContextCorePOSIX_powerpc(Thread &threa
2728
m_fpr_buffer.reset(new DataBufferHeap(fpregset.GetDataStart(), fpregset.GetByteSize()));
2829
m_fpr.SetData(m_fpr_buffer);
2930
m_fpr.SetByteOrder(fpregset.GetByteOrder());
31+
m_vec_buffer.reset(new DataBufferHeap(vregset.GetDataStart(), vregset.GetByteSize()));
32+
m_vec.SetData(m_vec_buffer);
33+
m_vec.SetByteOrder(fpregset.GetByteOrder());
3034
}
3135

3236
RegisterContextCorePOSIX_powerpc::~RegisterContextCorePOSIX_powerpc()
@@ -45,6 +49,12 @@ RegisterContextCorePOSIX_powerpc::ReadFPR()
4549
return true;
4650
}
4751

52+
bool
53+
RegisterContextCorePOSIX_powerpc::ReadVMX()
54+
{
55+
return true;
56+
}
57+
4858
bool
4959
RegisterContextCorePOSIX_powerpc::WriteGPR()
5060
{
@@ -59,17 +69,32 @@ RegisterContextCorePOSIX_powerpc::WriteFPR()
5969
return false;
6070
}
6171

72+
bool
73+
RegisterContextCorePOSIX_powerpc::WriteVMX()
74+
{
75+
assert(0);
76+
return false;
77+
}
78+
6279
bool
6380
RegisterContextCorePOSIX_powerpc::ReadRegister(const RegisterInfo *reg_info, RegisterValue &value)
6481
{
6582
lldb::offset_t offset = reg_info->byte_offset;
66-
if (reg_info->name[0] == 'f') {
83+
if (IsFPR(reg_info->kinds[lldb::eRegisterKindLLDB])) {
6784
uint64_t v = m_fpr.GetMaxU64(&offset, reg_info->byte_size);
6885
if (offset == reg_info->byte_offset + reg_info->byte_size)
6986
{
7087
value = v;
7188
return true;
7289
}
90+
} else if (IsVMX(reg_info->kinds[lldb::eRegisterKindLLDB])) {
91+
uint32_t v[4];
92+
offset = m_vec.CopyData(offset, reg_info->byte_size, &v);
93+
if (offset == reg_info->byte_size)
94+
{
95+
value.SetBytes(v, reg_info->byte_size, m_vec.GetByteOrder());
96+
return true;
97+
}
7398
} else {
7499
uint64_t v = m_gpr.GetMaxU64(&offset, reg_info->byte_size);
75100
if (offset == reg_info->byte_offset + reg_info->byte_size)

‎lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_powerpc.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ class RegisterContextCorePOSIX_powerpc :
2020
RegisterContextCorePOSIX_powerpc (lldb_private::Thread &thread,
2121
lldb_private::RegisterInfoInterface *register_info,
2222
const lldb_private::DataExtractor &gpregset,
23-
const lldb_private::DataExtractor &fpregset);
23+
const lldb_private::DataExtractor &fpregset,
24+
const lldb_private::DataExtractor &vregset);
2425

2526
~RegisterContextCorePOSIX_powerpc();
2627

@@ -46,17 +47,25 @@ class RegisterContextCorePOSIX_powerpc :
4647
bool
4748
ReadFPR();
4849

50+
bool
51+
ReadVMX();
52+
4953
bool
5054
WriteGPR();
5155

5256
bool
5357
WriteFPR();
5458

59+
bool
60+
WriteVMX();
61+
5562
private:
5663
lldb::DataBufferSP m_gpr_buffer;
5764
lldb::DataBufferSP m_fpr_buffer;
65+
lldb::DataBufferSP m_vec_buffer;
5866
lldb_private::DataExtractor m_gpr;
5967
lldb_private::DataExtractor m_fpr;
68+
lldb_private::DataExtractor m_vec;
6069
};
6170

6271
#endif // #ifndef liblldb_RegisterContextCorePOSIX_powerpc_H_

‎lldb/source/Plugins/Process/elf-core/ThreadElfCore.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ ThreadElfCore::ThreadElfCore (Process &process, tid_t tid,
3838
m_thread_reg_ctx_sp (),
3939
m_signo(td.signo),
4040
m_gpregset_data(td.gpregset),
41-
m_fpregset_data(td.fpregset)
41+
m_fpregset_data(td.fpregset),
42+
m_vregset_data(td.vregset)
4243
{
4344
}
4445

@@ -148,7 +149,7 @@ ThreadElfCore::CreateRegisterContextForFrame (StackFrame *frame)
148149
break;
149150
case llvm::Triple::ppc:
150151
case llvm::Triple::ppc64:
151-
m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_powerpc (*this, reg_interface, m_gpregset_data, m_fpregset_data));
152+
m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_powerpc (*this, reg_interface, m_gpregset_data, m_fpregset_data, m_vregset_data));
152153
break;
153154
case llvm::Triple::x86:
154155
case llvm::Triple::x86_64:

‎lldb/source/Plugins/Process/elf-core/ThreadElfCore.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ struct ThreadData
111111
{
112112
lldb_private::DataExtractor gpregset;
113113
lldb_private::DataExtractor fpregset;
114+
lldb_private::DataExtractor vregset;
114115
int signo;
115116
std::string name;
116117
};
@@ -170,6 +171,7 @@ class ThreadElfCore : public lldb_private::Thread
170171

171172
lldb_private::DataExtractor m_gpregset_data;
172173
lldb_private::DataExtractor m_fpregset_data;
174+
lldb_private::DataExtractor m_vregset_data;
173175

174176
virtual bool CalculateStopInfo();
175177

0 commit comments

Comments
 (0)
Please sign in to comment.