aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp')
-rw-r--r--lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp152
1 files changed, 152 insertions, 0 deletions
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
index f31b56b..9d5e0f88 100644
--- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
+++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
@@ -12,6 +12,7 @@
#include "Plugins/Process/Utility/RegisterContextDarwin_arm.h"
#include "Plugins/Process/Utility/RegisterContextDarwin_arm64.h"
#include "Plugins/Process/Utility/RegisterContextDarwin_i386.h"
+#include "Plugins/Process/Utility/RegisterContextDarwin_riscv32.h"
#include "Plugins/Process/Utility/RegisterContextDarwin_x86_64.h"
#include "lldb/Core/Debugger.h"
#include "lldb/Core/Module.h"
@@ -769,6 +770,147 @@ protected:
}
};
+class RegisterContextDarwin_riscv32_Mach
+ : public RegisterContextDarwin_riscv32 {
+public:
+ RegisterContextDarwin_riscv32_Mach(lldb_private::Thread &thread,
+ const DataExtractor &data)
+ : RegisterContextDarwin_riscv32(thread, 0) {
+ SetRegisterDataFrom_LC_THREAD(data);
+ }
+
+ void InvalidateAllRegisters() override {
+ // Do nothing... registers are always valid...
+ }
+
+ void SetRegisterDataFrom_LC_THREAD(const DataExtractor &data) {
+ lldb::offset_t offset = 0;
+ SetError(GPRRegSet, Read, -1);
+ SetError(FPURegSet, Read, -1);
+ SetError(EXCRegSet, Read, -1);
+ SetError(CSRRegSet, Read, -1);
+ bool done = false;
+ while (!done) {
+ int flavor = data.GetU32(&offset);
+ uint32_t count = data.GetU32(&offset);
+ lldb::offset_t next_thread_state = offset + (count * 4);
+ switch (flavor) {
+ case GPRRegSet:
+ // x0-x31 + pc
+ if (count >= 32) {
+ for (uint32_t i = 0; i < 32; ++i)
+ ((uint32_t *)&gpr.x0)[i] = data.GetU32(&offset);
+ gpr.pc = data.GetU32(&offset);
+ SetError(GPRRegSet, Read, 0);
+ }
+ offset = next_thread_state;
+ break;
+ case FPURegSet: {
+ // f0-f31 + fcsr
+ if (count >= 32) {
+ for (uint32_t i = 0; i < 32; ++i)
+ ((uint32_t *)&fpr.f0)[i] = data.GetU32(&offset);
+ fpr.fcsr = data.GetU32(&offset);
+ SetError(FPURegSet, Read, 0);
+ }
+ }
+ offset = next_thread_state;
+ break;
+ case EXCRegSet:
+ if (count == 3) {
+ exc.exception = data.GetU32(&offset);
+ exc.fsr = data.GetU32(&offset);
+ exc.far = data.GetU32(&offset);
+ SetError(EXCRegSet, Read, 0);
+ }
+ offset = next_thread_state;
+ break;
+ default:
+ done = true;
+ break;
+ }
+ }
+ }
+
+ static bool Create_LC_THREAD(Thread *thread, Stream &data) {
+ RegisterContextSP reg_ctx_sp(thread->GetRegisterContext());
+ if (reg_ctx_sp) {
+ RegisterContext *reg_ctx = reg_ctx_sp.get();
+
+ data.PutHex32(GPRRegSet); // Flavor
+ data.PutHex32(GPRWordCount);
+ PrintRegisterValue(reg_ctx, "x0", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x1", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x2", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x3", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x4", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x5", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x6", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x7", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x8", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x9", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x10", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x11", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x12", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x13", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x14", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x15", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x16", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x17", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x18", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x19", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x20", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x21", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x22", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x23", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x24", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x25", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x26", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x27", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x28", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x29", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x30", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "x31", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "pc", nullptr, 4, data);
+ data.PutHex32(0); // uint32_t pad at the end
+
+ // Write out the EXC registers
+ data.PutHex32(EXCRegSet);
+ data.PutHex32(EXCWordCount);
+ PrintRegisterValue(reg_ctx, "exception", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "fsr", nullptr, 4, data);
+ PrintRegisterValue(reg_ctx, "far", nullptr, 4, data);
+ return true;
+ }
+ return false;
+ }
+
+protected:
+ int DoReadGPR(lldb::tid_t tid, int flavor, GPR &gpr) override { return -1; }
+
+ int DoReadFPU(lldb::tid_t tid, int flavor, FPU &fpu) override { return -1; }
+
+ int DoReadEXC(lldb::tid_t tid, int flavor, EXC &exc) override { return -1; }
+
+ int DoReadCSR(lldb::tid_t tid, int flavor, CSR &csr) override { return -1; }
+
+ int DoWriteGPR(lldb::tid_t tid, int flavor, const GPR &gpr) override {
+ return 0;
+ }
+
+ int DoWriteFPU(lldb::tid_t tid, int flavor, const FPU &fpu) override {
+ return 0;
+ }
+
+ int DoWriteEXC(lldb::tid_t tid, int flavor, const EXC &exc) override {
+ return 0;
+ }
+
+ int DoWriteCSR(lldb::tid_t tid, int flavor, const CSR &csr) override {
+ return 0;
+ }
+};
+
static uint32_t MachHeaderSizeFromMagic(uint32_t magic) {
switch (magic) {
case MH_MAGIC:
@@ -5827,6 +5969,11 @@ ObjectFileMachO::GetThreadContextAtIndex(uint32_t idx,
reg_ctx_sp =
std::make_shared<RegisterContextDarwin_x86_64_Mach>(thread, data);
break;
+
+ case llvm::MachO::CPU_TYPE_RISCV:
+ reg_ctx_sp =
+ std::make_shared<RegisterContextDarwin_riscv32_Mach>(thread, data);
+ break;
}
}
}
@@ -6695,6 +6842,11 @@ bool ObjectFileMachO::SaveCore(const lldb::ProcessSP &process_sp,
RegisterContextDarwin_x86_64_Mach::Create_LC_THREAD(
thread_sp.get(), LC_THREAD_datas[thread_idx]);
break;
+
+ case llvm::MachO::CPU_TYPE_RISCV:
+ RegisterContextDarwin_riscv32_Mach::Create_LC_THREAD(
+ thread_sp.get(), LC_THREAD_datas[thread_idx]);
+ break;
}
}
}