diff options
Diffstat (limited to 'src/debug/createdump/threadinfo.cpp')
-rw-r--r-- | src/debug/createdump/threadinfo.cpp | 132 |
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 |