summaryrefslogtreecommitdiff
path: root/src/debug/createdump/threadinfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/debug/createdump/threadinfo.cpp')
-rw-r--r--src/debug/createdump/threadinfo.cpp132
1 files changed, 129 insertions, 3 deletions
diff --git a/src/debug/createdump/threadinfo.cpp b/src/debug/createdump/threadinfo.cpp
index 07d8193fd3..4cc838d04e 100644
--- a/src/debug/createdump/threadinfo.cpp
+++ b/src/debug/createdump/threadinfo.cpp
@@ -52,8 +52,10 @@ ThreadInfo::Initialize(ICLRDataTarget* pDataTarget)
#if defined(__arm__)
TRACE("Thread %04x PC %08lx SP %08lx\n", m_tid, (unsigned long)m_gpRegisters.ARM_pc, (unsigned long)m_gpRegisters.ARM_sp);
-#else
+#elif defined(__x86_64__)
TRACE("Thread %04x RIP %016llx RSP %016llx\n", m_tid, (unsigned long long)m_gpRegisters.rip, (unsigned long long)m_gpRegisters.rsp);
+#elif defined(__i386__)
+ TRACE("Thread %04x EIP %016lx ESP %016lx\n", m_tid, (unsigned long)m_gpRegisters.eip, (unsigned long)m_gpRegisters.esp);
#endif
return true;
}
@@ -206,6 +208,92 @@ ThreadInfo::GetRegistersWithPTrace()
#endif
return true;
}
+void ThreadInfo::SetRegisters(elf_prstatus *prstatus)
+{
+#if defined(__x86_64__)
+ struct user_regs_struct *u_reg = (struct user_regs_struct *)&prstatus->pr_reg;
+ m_gpRegisters.rip = u_reg->rip;
+ m_gpRegisters.rbp = u_reg->rbp;
+ m_gpRegisters.rsp = u_reg->rsp;
+
+ m_gpRegisters.rax = u_reg->rax;
+ m_gpRegisters.rbx = u_reg->rbx;
+ m_gpRegisters.rcx = u_reg->rcx;
+ m_gpRegisters.rdx = u_reg->rdx;
+ m_gpRegisters.rsi = u_reg->rsi;
+ m_gpRegisters.rdi = u_reg->rdi;
+
+ m_gpRegisters.cs = u_reg->cs;
+ m_gpRegisters.gs = u_reg->gs;
+ m_gpRegisters.es = u_reg->es;
+ m_gpRegisters.fs = u_reg->fs;
+ m_gpRegisters.ds = u_reg->ds;
+ m_gpRegisters.ss = u_reg->ss;
+ m_gpRegisters.fs_base = u_reg->fs_base;
+ m_gpRegisters.gs_base = u_reg->gs_base;
+
+ m_gpRegisters.orig_rax = u_reg->orig_rax;
+
+ m_gpRegisters.r8 = u_reg->r8;
+ m_gpRegisters.r9 = u_reg->r9;
+ m_gpRegisters.r10 = u_reg->r10;
+ m_gpRegisters.r11 = u_reg->r11;
+ m_gpRegisters.r12 = u_reg->r12;
+ m_gpRegisters.r13 = u_reg->r13;
+ m_gpRegisters.r14 = u_reg->r14;
+ m_gpRegisters.r15 = u_reg->r15;
+
+ m_gpRegisters.eflags = u_reg->eflags;
+#elif defined(__i386__)
+ struct user_regs_struct *u_reg = (struct user_regs_struct *)&prstatus->pr_reg;
+ m_gpRegisters.ebx = u_reg->ebx;
+ m_gpRegisters.ecx = u_reg->ecx;
+ m_gpRegisters.edx = u_reg->edx;
+ m_gpRegisters.esi = u_reg->esi;
+ m_gpRegisters.edi = u_reg->edi;
+ m_gpRegisters.ebp = u_reg->ebp;
+ m_gpRegisters.eax = u_reg->eax;
+ m_gpRegisters.xds = u_reg->xds;
+ m_gpRegisters.xes = u_reg->xes;
+ m_gpRegisters.xfs = u_reg->xfs;
+ m_gpRegisters.xgs = u_reg->xgs;
+ m_gpRegisters.orig_eax = u_reg->orig_eax;
+ m_gpRegisters.eip = u_reg->eip;
+ m_gpRegisters.xcs = u_reg->xcs;
+ m_gpRegisters.eflags = u_reg->eflags;
+ m_gpRegisters.esp = u_reg->esp;
+ m_gpRegisters.xss = u_reg->xss;
+#elif defined(__arm__)
+
+#define REGS_REGULAR_NUM 13
+#define REG_FP 11
+#define REG_IP 12
+#define REG_SP 13
+#define REG_LR 14
+#define REG_PC 15
+#define REG_SPSR 16
+ struct user_regs *u_reg = (struct user_regs *)&prstatus->pr_reg;
+ m_gpRegisters.ARM_sp = u_reg->uregs[REG_SP];
+ m_gpRegisters.ARM_lr = u_reg->uregs[REG_LR];
+ m_gpRegisters.ARM_pc = u_reg->uregs[REG_PC];
+ m_gpRegisters.ARM_cpsr = u_reg->uregs[REG_SPSR];
+
+ m_gpRegisters.ARM_r0 = u_reg->uregs[0];
+ m_gpRegisters.ARM_ORIG_r0 = u_reg->uregs[0];
+ m_gpRegisters.ARM_r1 = u_reg->uregs[1];
+ m_gpRegisters.ARM_r2 = u_reg->uregs[2];
+ m_gpRegisters.ARM_r3 = u_reg->uregs[3];
+ m_gpRegisters.ARM_r4 = u_reg->uregs[4];
+ m_gpRegisters.ARM_r5 = u_reg->uregs[5];
+ m_gpRegisters.ARM_r6 = u_reg->uregs[6];
+ m_gpRegisters.ARM_r7 = u_reg->uregs[7];
+ m_gpRegisters.ARM_r8 = u_reg->uregs[8];
+ m_gpRegisters.ARM_r9 = u_reg->uregs[9];
+ m_gpRegisters.ARM_r10 = u_reg->uregs[10];
+ m_gpRegisters.ARM_fp = u_reg->uregs[REG_FP];
+ m_gpRegisters.ARM_ip = u_reg->uregs[REG_IP];
+#endif
+}
bool
ThreadInfo::GetRegistersWithDataTarget(ICLRDataTarget* pDataTarget)
@@ -292,7 +380,20 @@ ThreadInfo::GetRegistersWithDataTarget(ICLRDataTarget* pDataTarget)
assert(sizeof(context.D) == sizeof(m_vfpRegisters.fpregs));
memcpy(m_vfpRegisters.fpregs, context.D, sizeof(context.D));
#endif
-#else
+#elif defined(__i386__)
+ m_gpRegisters.ebp = context.Ebp;
+ m_gpRegisters.eip = context.Eip;
+ m_gpRegisters.eflags = context.EFlags;
+ m_gpRegisters.esp = context.Esp;
+ m_gpRegisters.edi = context.Edi;
+
+ m_gpRegisters.esi = context.Esi;
+ m_gpRegisters.ebx = context.Ebx;
+ m_gpRegisters.edx = context.Edx;
+ m_gpRegisters.ecx = context.Ecx;
+ m_gpRegisters.eax = context.Eax;
+ m_gpRegisters.orig_eax = context.Eax;
+#else
#error Platform not supported
#endif
return true;
@@ -306,8 +407,10 @@ ThreadInfo::GetThreadStack(CrashInfo& crashInfo)
#if defined(__arm__)
startAddress = m_gpRegisters.ARM_sp & PAGE_MASK;
-#else
+#elif defined(__x86_64__)
startAddress = m_gpRegisters.rsp & PAGE_MASK;
+#elif defined(__i386__)
+ startAddress = m_gpRegisters.esp & PAGE_MASK;
#endif
size = 4 * PAGE_SIZE;
@@ -421,6 +524,29 @@ ThreadInfo::GetThreadContext(uint32_t flags, CONTEXT* context) const
memcpy(context->D, m_vfpRegisters.fpregs, sizeof(context->D));
#endif
}
+#elif defined(__i386__)
+ if ((flags & CONTEXT_CONTROL) == CONTEXT_CONTROL)
+ {
+ context->Ebp = m_gpRegisters.ebp;
+ context->Eip = m_gpRegisters.eip;
+ context->EFlags = m_gpRegisters.eflags;
+ context->Esp = m_gpRegisters.esp;
+ context->SegCs = m_gpRegisters.xcs;
+ context->SegSs = m_gpRegisters.xss;
+ context->SegGs_PAL_Undefined = m_gpRegisters.xgs;
+ context->SegFs_PAL_Undefined = m_gpRegisters.xfs;
+ context->SegEs_PAL_Undefined = m_gpRegisters.xes;
+ context->SegDs_PAL_Undefined = m_gpRegisters.xds;
+ }
+ if ((flags & CONTEXT_INTEGER) == CONTEXT_INTEGER)
+ {
+ context->Edi = m_gpRegisters.edi;
+ context->Esi = m_gpRegisters.esi;
+ context->Ebx = m_gpRegisters.ebx;
+ context->Edx = m_gpRegisters.edx;
+ context->Ecx = m_gpRegisters.ecx;
+ context->Eax = m_gpRegisters.eax;
+ }
#else
#error Platform not supported
#endif