@@ -202,58 +202,43 @@ ELFLinuxPrStatus::ELFLinuxPrStatus() {
202
202
203
203
Error ELFLinuxPrStatus::Parse (DataExtractor &data, ArchSpec &arch) {
204
204
Error error;
205
- ByteOrder byteorder = data.GetByteOrder ();
206
205
if (GetSize (arch) > data.GetByteSize ()) {
207
206
error.SetErrorStringWithFormat (
208
207
" NT_PRSTATUS size should be %zu, but the remaining bytes are: %" PRIu64,
209
208
GetSize (arch), data.GetByteSize ());
210
209
return error;
211
210
}
212
211
213
- switch (arch.GetCore ()) {
214
- case ArchSpec::eCore_s390x_generic:
215
- case ArchSpec::eCore_x86_64_x86_64:
216
- data.ExtractBytes (0 , sizeof (ELFLinuxPrStatus), byteorder, this );
217
- break ;
218
- case ArchSpec::eCore_x86_32_i386:
219
- case ArchSpec::eCore_x86_32_i486: {
220
- // Parsing from a 32 bit ELF core file, and populating/reusing the structure
221
- // properly, because the struct is for the 64 bit version
222
- offset_t offset = 0 ;
223
- si_signo = data.GetU32 (&offset);
224
- si_code = data.GetU32 (&offset);
225
- si_errno = data.GetU32 (&offset);
212
+ // Read field by field to correctly account for endianess
213
+ // of both the core dump and the platform running lldb.
214
+ offset_t offset = 0 ;
215
+ si_signo = data.GetU32 (&offset);
216
+ si_code = data.GetU32 (&offset);
217
+ si_errno = data.GetU32 (&offset);
226
218
227
- pr_cursig = data.GetU16 (&offset);
228
- offset += 2 ; // pad
219
+ pr_cursig = data.GetU16 (&offset);
220
+ offset += 2 ; // pad
229
221
230
- pr_sigpend = data.GetU32 (&offset);
231
- pr_sighold = data.GetU32 (&offset);
222
+ pr_sigpend = data.GetPointer (&offset);
223
+ pr_sighold = data.GetPointer (&offset);
232
224
233
- pr_pid = data.GetU32 (&offset);
234
- pr_ppid = data.GetU32 (&offset);
235
- pr_pgrp = data.GetU32 (&offset);
236
- pr_sid = data.GetU32 (&offset);
225
+ pr_pid = data.GetU32 (&offset);
226
+ pr_ppid = data.GetU32 (&offset);
227
+ pr_pgrp = data.GetU32 (&offset);
228
+ pr_sid = data.GetU32 (&offset);
237
229
238
- pr_utime.tv_sec = data.GetU32 (&offset);
239
- pr_utime.tv_usec = data.GetU32 (&offset);
230
+ pr_utime.tv_sec = data.GetPointer (&offset);
231
+ pr_utime.tv_usec = data.GetPointer (&offset);
240
232
241
- pr_stime.tv_sec = data.GetU32 (&offset);
242
- pr_stime.tv_usec = data.GetU32 (&offset);
233
+ pr_stime.tv_sec = data.GetPointer (&offset);
234
+ pr_stime.tv_usec = data.GetPointer (&offset);
243
235
244
- pr_cutime.tv_sec = data.GetU32 (&offset);
245
- pr_cutime.tv_usec = data.GetU32 (&offset);
236
+ pr_cutime.tv_sec = data.GetPointer (&offset);
237
+ pr_cutime.tv_usec = data.GetPointer (&offset);
246
238
247
- pr_cstime.tv_sec = data.GetU32 (&offset);
248
- pr_cstime.tv_usec = data.GetU32 (&offset);
239
+ pr_cstime.tv_sec = data.GetPointer (&offset);
240
+ pr_cstime.tv_usec = data.GetPointer (&offset);
249
241
250
- break ;
251
- }
252
- default :
253
- error.SetErrorStringWithFormat (" ELFLinuxPrStatus::%s Unknown architecture" ,
254
- __FUNCTION__);
255
- break ;
256
- }
257
242
258
243
return error;
259
244
}
@@ -274,49 +259,37 @@ Error ELFLinuxPrPsInfo::Parse(DataExtractor &data, ArchSpec &arch) {
274
259
GetSize (arch), data.GetByteSize ());
275
260
return error;
276
261
}
277
-
278
- switch (arch.GetCore ()) {
279
- case ArchSpec::eCore_s390x_generic:
280
- case ArchSpec::eCore_x86_64_x86_64:
281
- data.ExtractBytes (0 , sizeof (ELFLinuxPrPsInfo), byteorder, this );
282
- break ;
283
- case ArchSpec::eCore_x86_32_i386:
284
- case ArchSpec::eCore_x86_32_i486: {
285
- // Parsing from a 32 bit ELF core file, and populating/reusing the structure
286
- // properly, because the struct is for the 64 bit version
287
- size_t size = 0 ;
288
- offset_t offset = 0 ;
289
-
290
- pr_state = data.GetU8 (&offset);
291
- pr_sname = data.GetU8 (&offset);
292
- pr_zomb = data.GetU8 (&offset);
293
- pr_nice = data.GetU8 (&offset);
294
-
295
- pr_flag = data.GetU32 (&offset);
296
- pr_uid = data.GetU16 (&offset);
297
- pr_gid = data.GetU16 (&offset);
298
-
299
- pr_pid = data.GetU32 (&offset);
300
- pr_ppid = data.GetU32 (&offset);
301
- pr_pgrp = data.GetU32 (&offset);
302
- pr_sid = data.GetU32 (&offset);
303
-
304
- size = 16 ;
305
- data.ExtractBytes (offset, size, byteorder, pr_fname);
306
- offset += size;
307
-
308
- size = 80 ;
309
- data.ExtractBytes (offset, size, byteorder, pr_psargs);
310
- offset += size;
311
-
312
- break ;
313
- }
314
- default :
315
- error.SetErrorStringWithFormat (" ELFLinuxPrPsInfo::%s Unknown architecture" ,
316
- __FUNCTION__);
317
- break ;
262
+ size_t size = 0 ;
263
+ offset_t offset = 0 ;
264
+
265
+ pr_state = data.GetU8 (&offset);
266
+ pr_sname = data.GetU8 (&offset);
267
+ pr_zomb = data.GetU8 (&offset);
268
+ pr_nice = data.GetU8 (&offset);
269
+ if (data.GetAddressByteSize () == 8 ) {
270
+ // Word align the next field on 64 bit.
271
+ offset += 4 ;
318
272
}
319
273
274
+ pr_flag = data.GetPointer (&offset);
275
+
276
+ // 16 bit on 32 bit platforms, 32 bit on 64 bit platforms
277
+ pr_uid = data.GetMaxU64 (&offset, data.GetAddressByteSize () >> 1 );
278
+ pr_gid = data.GetMaxU64 (&offset, data.GetAddressByteSize () >> 1 );
279
+
280
+ pr_pid = data.GetU32 (&offset);
281
+ pr_ppid = data.GetU32 (&offset);
282
+ pr_pgrp = data.GetU32 (&offset);
283
+ pr_sid = data.GetU32 (&offset);
284
+
285
+ size = 16 ;
286
+ data.ExtractBytes (offset, size, byteorder, pr_fname);
287
+ offset += size;
288
+
289
+ size = 80 ;
290
+ data.ExtractBytes (offset, size, byteorder, pr_psargs);
291
+ offset += size;
292
+
320
293
return error;
321
294
}
322
295
@@ -329,35 +302,19 @@ ELFLinuxSigInfo::ELFLinuxSigInfo() {
329
302
330
303
Error ELFLinuxSigInfo::Parse (DataExtractor &data, const ArchSpec &arch) {
331
304
Error error;
332
- ByteOrder byteorder = data.GetByteOrder ();
333
305
if (GetSize (arch) > data.GetByteSize ()) {
334
306
error.SetErrorStringWithFormat (
335
307
" NT_SIGINFO size should be %zu, but the remaining bytes are: %" PRIu64,
336
308
GetSize (arch), data.GetByteSize ());
337
309
return error;
338
310
}
339
311
340
- switch (arch.GetCore ()) {
341
- case ArchSpec::eCore_x86_64_x86_64:
342
- data.ExtractBytes (0 , sizeof (ELFLinuxPrStatus), byteorder, this );
343
- break ;
344
- case ArchSpec::eCore_s390x_generic:
345
- case ArchSpec::eCore_x86_32_i386:
346
- case ArchSpec::eCore_x86_32_i486: {
347
- // Parsing from a 32 bit ELF core file, and populating/reusing the structure
348
- // properly, because the struct is for the 64 bit version
349
- offset_t offset = 0 ;
350
- si_signo = data.GetU32 (&offset);
351
- si_code = data.GetU32 (&offset);
352
- si_errno = data.GetU32 (&offset);
353
-
354
- break ;
355
- }
356
- default :
357
- error.SetErrorStringWithFormat (" ELFLinuxSigInfo::%s Unknown architecture" ,
358
- __FUNCTION__);
359
- break ;
360
- }
312
+ // Parsing from a 32 bit ELF core file, and populating/reusing the structure
313
+ // properly, because the struct is for the 64 bit version
314
+ offset_t offset = 0 ;
315
+ si_signo = data.GetU32 (&offset);
316
+ si_code = data.GetU32 (&offset);
317
+ si_errno = data.GetU32 (&offset);
361
318
362
319
return error;
363
320
}
0 commit comments