Skip to content

Commit dfcef35

Browse files
authored
[lldb][NFC][MachO] Clean up LC_THREAD reading code, remove i386 corefile (#146480)
While fixing bugs in the x86_64 LC_THREAD parser in ObjectFileMachO, I noticed that the other LC_THREAD parsers are all less clear than they should be. To recap, a Mach-O LC_THREAD load command has a byte size for the entire payload. Within the payload, there will be one or more register sets provided. A register set starts with a UInt32 "flavor", the type of register set defined in the system headers, and a UInt32 "count", the number of UInt32 words of memory for this register set. After one register set, there may be additional sets. A parser can skip an unknown register set flavor by using the count field to get to the next register set. When the total byte size of the LC_THREAD load command has been parsed, it is completed. This patch fixes the riscv/arm/arm64 LC_THREAD parsers to use the total byte size as the exit condition, and to skip past unrecognized register sets, instead of stopping parsing. Instead of fixing the i386 corefile support, I removed it. The last macOS that supported 32-bit Intel code was macOS 10.14 in 2018. I also removed i386 KDP support, 32-bit intel kernel debugging hasn't been supported for even longer than that. It would be preferable to do these things separately, but I couldn't bring myself to update the i386 LC_THREAD parser, and it required very few changes to remove this support entirely.
1 parent ed27f18 commit dfcef35

File tree

11 files changed

+13
-1600
lines changed

11 files changed

+13
-1600
lines changed

lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp

Lines changed: 13 additions & 177 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
#include "Plugins/Process/Utility/RegisterContextDarwin_arm.h"
1313
#include "Plugins/Process/Utility/RegisterContextDarwin_arm64.h"
14-
#include "Plugins/Process/Utility/RegisterContextDarwin_i386.h"
1514
#include "Plugins/Process/Utility/RegisterContextDarwin_riscv32.h"
1615
#include "Plugins/Process/Utility/RegisterContextDarwin_x86_64.h"
1716
#include "lldb/Core/Debugger.h"
@@ -81,9 +80,6 @@
8180
#ifdef CPU_TYPE_ARM64_32
8281
#undef CPU_TYPE_ARM64_32
8382
#endif
84-
#ifdef CPU_TYPE_I386
85-
#undef CPU_TYPE_I386
86-
#endif
8783
#ifdef CPU_TYPE_X86_64
8884
#undef CPU_TYPE_X86_64
8985
#endif
@@ -358,122 +354,6 @@ class RegisterContextDarwin_x86_64_Mach : public RegisterContextDarwin_x86_64 {
358354
}
359355
};
360356

361-
class RegisterContextDarwin_i386_Mach : public RegisterContextDarwin_i386 {
362-
public:
363-
RegisterContextDarwin_i386_Mach(lldb_private::Thread &thread,
364-
const DataExtractor &data)
365-
: RegisterContextDarwin_i386(thread, 0) {
366-
SetRegisterDataFrom_LC_THREAD(data);
367-
}
368-
369-
void InvalidateAllRegisters() override {
370-
// Do nothing... registers are always valid...
371-
}
372-
373-
void SetRegisterDataFrom_LC_THREAD(const DataExtractor &data) {
374-
lldb::offset_t offset = 0;
375-
SetError(GPRRegSet, Read, -1);
376-
SetError(FPURegSet, Read, -1);
377-
SetError(EXCRegSet, Read, -1);
378-
bool done = false;
379-
380-
while (!done) {
381-
int flavor = data.GetU32(&offset);
382-
if (flavor == 0)
383-
done = true;
384-
else {
385-
uint32_t i;
386-
uint32_t count = data.GetU32(&offset);
387-
switch (flavor) {
388-
case GPRRegSet:
389-
for (i = 0; i < count; ++i)
390-
(&gpr.eax)[i] = data.GetU32(&offset);
391-
SetError(GPRRegSet, Read, 0);
392-
done = true;
393-
394-
break;
395-
case FPURegSet:
396-
// TODO: fill in FPU regs....
397-
// SetError (FPURegSet, Read, -1);
398-
done = true;
399-
400-
break;
401-
case EXCRegSet:
402-
exc.trapno = data.GetU32(&offset);
403-
exc.err = data.GetU32(&offset);
404-
exc.faultvaddr = data.GetU32(&offset);
405-
SetError(EXCRegSet, Read, 0);
406-
done = true;
407-
break;
408-
case 7:
409-
case 8:
410-
case 9:
411-
// fancy flavors that encapsulate of the above flavors...
412-
break;
413-
414-
default:
415-
done = true;
416-
break;
417-
}
418-
}
419-
}
420-
}
421-
422-
static bool Create_LC_THREAD(Thread *thread, Stream &data) {
423-
RegisterContextSP reg_ctx_sp(thread->GetRegisterContext());
424-
if (reg_ctx_sp) {
425-
RegisterContext *reg_ctx = reg_ctx_sp.get();
426-
427-
data.PutHex32(GPRRegSet); // Flavor
428-
data.PutHex32(GPRWordCount);
429-
PrintRegisterValue(reg_ctx, "eax", nullptr, 4, data);
430-
PrintRegisterValue(reg_ctx, "ebx", nullptr, 4, data);
431-
PrintRegisterValue(reg_ctx, "ecx", nullptr, 4, data);
432-
PrintRegisterValue(reg_ctx, "edx", nullptr, 4, data);
433-
PrintRegisterValue(reg_ctx, "edi", nullptr, 4, data);
434-
PrintRegisterValue(reg_ctx, "esi", nullptr, 4, data);
435-
PrintRegisterValue(reg_ctx, "ebp", nullptr, 4, data);
436-
PrintRegisterValue(reg_ctx, "esp", nullptr, 4, data);
437-
PrintRegisterValue(reg_ctx, "ss", nullptr, 4, data);
438-
PrintRegisterValue(reg_ctx, "eflags", nullptr, 4, data);
439-
PrintRegisterValue(reg_ctx, "eip", nullptr, 4, data);
440-
PrintRegisterValue(reg_ctx, "cs", nullptr, 4, data);
441-
PrintRegisterValue(reg_ctx, "ds", nullptr, 4, data);
442-
PrintRegisterValue(reg_ctx, "es", nullptr, 4, data);
443-
PrintRegisterValue(reg_ctx, "fs", nullptr, 4, data);
444-
PrintRegisterValue(reg_ctx, "gs", nullptr, 4, data);
445-
446-
// Write out the EXC registers
447-
data.PutHex32(EXCRegSet);
448-
data.PutHex32(EXCWordCount);
449-
PrintRegisterValue(reg_ctx, "trapno", nullptr, 4, data);
450-
PrintRegisterValue(reg_ctx, "err", nullptr, 4, data);
451-
PrintRegisterValue(reg_ctx, "faultvaddr", nullptr, 4, data);
452-
return true;
453-
}
454-
return false;
455-
}
456-
457-
protected:
458-
int DoReadGPR(lldb::tid_t tid, int flavor, GPR &gpr) override { return 0; }
459-
460-
int DoReadFPU(lldb::tid_t tid, int flavor, FPU &fpu) override { return 0; }
461-
462-
int DoReadEXC(lldb::tid_t tid, int flavor, EXC &exc) override { return 0; }
463-
464-
int DoWriteGPR(lldb::tid_t tid, int flavor, const GPR &gpr) override {
465-
return 0;
466-
}
467-
468-
int DoWriteFPU(lldb::tid_t tid, int flavor, const FPU &fpu) override {
469-
return 0;
470-
}
471-
472-
int DoWriteEXC(lldb::tid_t tid, int flavor, const EXC &exc) override {
473-
return 0;
474-
}
475-
};
476-
477357
class RegisterContextDarwin_arm_Mach : public RegisterContextDarwin_arm {
478358
public:
479359
RegisterContextDarwin_arm_Mach(lldb_private::Thread &thread,
@@ -491,12 +371,11 @@ class RegisterContextDarwin_arm_Mach : public RegisterContextDarwin_arm {
491371
SetError(GPRRegSet, Read, -1);
492372
SetError(FPURegSet, Read, -1);
493373
SetError(EXCRegSet, Read, -1);
494-
bool done = false;
495374

496-
while (!done) {
375+
while (offset < data.GetByteSize()) {
497376
int flavor = data.GetU32(&offset);
498377
uint32_t count = data.GetU32(&offset);
499-
lldb::offset_t next_thread_state = offset + (count * 4);
378+
offset_t next_thread_state = offset + (count * 4);
500379
switch (flavor) {
501380
case GPRAltRegSet:
502381
case GPRRegSet: {
@@ -510,9 +389,7 @@ class RegisterContextDarwin_arm_Mach : public RegisterContextDarwin_arm {
510389

511390
SetError(GPRRegSet, Read, 0);
512391
}
513-
}
514-
offset = next_thread_state;
515-
break;
392+
} break;
516393

517394
case FPURegSet: {
518395
uint8_t *fpu_reg_buf = (uint8_t *)&fpu.floats;
@@ -522,12 +399,8 @@ class RegisterContextDarwin_arm_Mach : public RegisterContextDarwin_arm {
522399
offset += fpu_reg_buf_size;
523400
fpu.fpscr = data.GetU32(&offset);
524401
SetError(FPURegSet, Read, 0);
525-
} else {
526-
done = true;
527402
}
528-
}
529-
offset = next_thread_state;
530-
break;
403+
} break;
531404

532405
case EXCRegSet:
533406
if (count == 3) {
@@ -536,14 +409,11 @@ class RegisterContextDarwin_arm_Mach : public RegisterContextDarwin_arm {
536409
exc.far = data.GetU32(&offset);
537410
SetError(EXCRegSet, Read, 0);
538411
}
539-
done = true;
540-
offset = next_thread_state;
541412
break;
542413

543-
// Unknown register set flavor, stop trying to parse.
544414
default:
545-
done = true;
546415
}
416+
offset = next_thread_state;
547417
}
548418
}
549419

@@ -626,11 +496,10 @@ class RegisterContextDarwin_arm64_Mach : public RegisterContextDarwin_arm64 {
626496
SetError(GPRRegSet, Read, -1);
627497
SetError(FPURegSet, Read, -1);
628498
SetError(EXCRegSet, Read, -1);
629-
bool done = false;
630-
while (!done) {
499+
while (offset < data.GetByteSize()) {
631500
int flavor = data.GetU32(&offset);
632501
uint32_t count = data.GetU32(&offset);
633-
lldb::offset_t next_thread_state = offset + (count * 4);
502+
offset_t next_thread_state = offset + (count * 4);
634503
switch (flavor) {
635504
case GPRRegSet:
636505
// x0-x29 + fp + lr + sp + pc (== 33 64-bit registers) plus cpsr (1
@@ -645,7 +514,6 @@ class RegisterContextDarwin_arm64_Mach : public RegisterContextDarwin_arm64 {
645514
gpr.cpsr = data.GetU32(&offset);
646515
SetError(GPRRegSet, Read, 0);
647516
}
648-
offset = next_thread_state;
649517
break;
650518
case FPURegSet: {
651519
uint8_t *fpu_reg_buf = (uint8_t *)&fpu.v[0];
@@ -654,25 +522,19 @@ class RegisterContextDarwin_arm64_Mach : public RegisterContextDarwin_arm64 {
654522
data.ExtractBytes(offset, fpu_reg_buf_size, eByteOrderLittle,
655523
fpu_reg_buf) == fpu_reg_buf_size) {
656524
SetError(FPURegSet, Read, 0);
657-
} else {
658-
done = true;
659525
}
660-
}
661-
offset = next_thread_state;
662-
break;
526+
} break;
663527
case EXCRegSet:
664528
if (count == 4) {
665529
exc.far = data.GetU64(&offset);
666530
exc.esr = data.GetU32(&offset);
667531
exc.exception = data.GetU32(&offset);
668532
SetError(EXCRegSet, Read, 0);
669533
}
670-
offset = next_thread_state;
671534
break;
672535
default:
673-
done = true;
674-
break;
675536
}
537+
offset = next_thread_state;
676538
}
677539
}
678540

@@ -775,11 +637,10 @@ class RegisterContextDarwin_riscv32_Mach
775637
SetError(FPURegSet, Read, -1);
776638
SetError(EXCRegSet, Read, -1);
777639
SetError(CSRRegSet, Read, -1);
778-
bool done = false;
779-
while (!done) {
640+
while (offset < data.GetByteSize()) {
780641
int flavor = data.GetU32(&offset);
781642
uint32_t count = data.GetU32(&offset);
782-
lldb::offset_t next_thread_state = offset + (count * 4);
643+
offset_t next_thread_state = offset + (count * 4);
783644
switch (flavor) {
784645
case GPRRegSet:
785646
// x0-x31 + pc
@@ -789,7 +650,6 @@ class RegisterContextDarwin_riscv32_Mach
789650
gpr.pc = data.GetU32(&offset);
790651
SetError(GPRRegSet, Read, 0);
791652
}
792-
offset = next_thread_state;
793653
break;
794654
case FPURegSet: {
795655
// f0-f31 + fcsr
@@ -799,22 +659,18 @@ class RegisterContextDarwin_riscv32_Mach
799659
fpr.fcsr = data.GetU32(&offset);
800660
SetError(FPURegSet, Read, 0);
801661
}
802-
}
803-
offset = next_thread_state;
804-
break;
662+
} break;
805663
case EXCRegSet:
806664
if (count == 3) {
807665
exc.exception = data.GetU32(&offset);
808666
exc.fsr = data.GetU32(&offset);
809667
exc.far = data.GetU32(&offset);
810668
SetError(EXCRegSet, Read, 0);
811669
}
812-
offset = next_thread_state;
813670
break;
814671
default:
815-
done = true;
816-
break;
817672
}
673+
offset = next_thread_state;
818674
}
819675
}
820676

@@ -5408,16 +5264,6 @@ lldb_private::Address ObjectFileMachO::GetEntryPointAddress() {
54085264
done = true;
54095265
}
54105266
break;
5411-
case llvm::MachO::CPU_TYPE_I386:
5412-
if (flavor ==
5413-
1) // x86_THREAD_STATE32 from mach/i386/thread_status.h
5414-
{
5415-
offset += 40; // This is the offset of eip in the GPR thread state
5416-
// data structure.
5417-
start_address = m_data.GetU32(&offset);
5418-
done = true;
5419-
}
5420-
break;
54215267
case llvm::MachO::CPU_TYPE_X86_64:
54225268
if (flavor ==
54235269
4) // x86_THREAD_STATE64 from mach/i386/thread_status.h
@@ -5897,11 +5743,6 @@ ObjectFileMachO::GetThreadContextAtIndex(uint32_t idx,
58975743
std::make_shared<RegisterContextDarwin_arm_Mach>(thread, data);
58985744
break;
58995745

5900-
case llvm::MachO::CPU_TYPE_I386:
5901-
reg_ctx_sp =
5902-
std::make_shared<RegisterContextDarwin_i386_Mach>(thread, data);
5903-
break;
5904-
59055746
case llvm::MachO::CPU_TYPE_X86_64:
59065747
reg_ctx_sp =
59075748
std::make_shared<RegisterContextDarwin_x86_64_Mach>(thread, data);
@@ -6769,11 +6610,6 @@ bool ObjectFileMachO::SaveCore(const lldb::ProcessSP &process_sp,
67696610
thread_sp.get(), LC_THREAD_datas[thread_idx]);
67706611
break;
67716612

6772-
case llvm::MachO::CPU_TYPE_I386:
6773-
RegisterContextDarwin_i386_Mach::Create_LC_THREAD(
6774-
thread_sp.get(), LC_THREAD_datas[thread_idx]);
6775-
break;
6776-
67776613
case llvm::MachO::CPU_TYPE_X86_64:
67786614
RegisterContextDarwin_x86_64_Mach::Create_LC_THREAD(
67796615
thread_sp.get(), LC_THREAD_datas[thread_idx]);

lldb/source/Plugins/Process/MacOSX-Kernel/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ add_lldb_library(lldbPluginProcessMacOSXKernel PLUGIN
1212
ProcessKDPLog.cpp
1313
RegisterContextKDP_arm.cpp
1414
RegisterContextKDP_arm64.cpp
15-
RegisterContextKDP_i386.cpp
1615
RegisterContextKDP_x86_64.cpp
1716
ThreadKDP.cpp
1817

0 commit comments

Comments
 (0)