Index: tools/linux/md2core/minidump-2-core.cc |
=================================================================== |
--- tools/linux/md2core/minidump-2-core.cc (revision 1449) |
+++ tools/linux/md2core/minidump-2-core.cc (working copy) |
@@ -81,6 +81,9 @@ |
// containing core registers, while they use 'user_regs_struct' on other |
// architectures. This file-local typedef simplifies the source code. |
typedef user_regs user_regs_struct; |
+#elif defined (__mips__) |
+// This file-local typedef simplifies the source code. |
+typedef gregset_t user_regs_struct; |
#endif |
using google_breakpad::MDTypeHelper; |
@@ -208,13 +211,17 @@ |
struct Thread { |
pid_t tid; |
+#if defined(__mips__) |
+ mcontext_t mcontext; |
+#else // __mips__ |
user_regs_struct regs; |
-#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) |
+#if defined(__i386__) || defined(__x86_64__) |
user_fpregs_struct fpregs; |
-#endif |
+#endif // __i386__ || __x86_64__ |
#if defined(__i386__) |
user_fpxregs_struct fpxregs; |
-#endif |
+#endif // __i386__ |
+#endif // __mips__ |
uintptr_t stack_addr; |
const uint8_t* stack; |
size_t stack_length; |
@@ -371,21 +378,28 @@ |
const MDRawContextMIPS* rawregs = range.GetData<MDRawContextMIPS>(0); |
for (int i = 0; i < MD_CONTEXT_MIPS_GPR_COUNT; ++i) |
- thread->regs.regs[i] = rawregs->iregs[i]; |
+ thread->mcontext.gregs[i] = rawregs->iregs[i]; |
- thread->regs.lo = rawregs->mdlo; |
- thread->regs.hi = rawregs->mdhi; |
- thread->regs.epc = rawregs->epc; |
- thread->regs.badvaddr = rawregs->badvaddr; |
- thread->regs.status = rawregs->status; |
- thread->regs.cause = rawregs->cause; |
+ thread->mcontext.pc = rawregs->epc; |
- for (int i = 0; i < MD_FLOATINGSAVEAREA_MIPS_FPR_COUNT; ++i) |
- thread->fpregs.regs[i] = rawregs->float_save.regs[i]; |
+ thread->mcontext.mdlo = rawregs->mdlo; |
+ thread->mcontext.mdhi = rawregs->mdhi; |
- thread->fpregs.fpcsr = rawregs->float_save.fpcsr; |
+ thread->mcontext.hi1 = rawregs->hi[0]; |
+ thread->mcontext.lo1 = rawregs->lo[0]; |
+ thread->mcontext.hi2 = rawregs->hi[1]; |
+ thread->mcontext.lo2 = rawregs->lo[1]; |
+ thread->mcontext.hi3 = rawregs->hi[2]; |
+ thread->mcontext.lo3 = rawregs->lo[2]; |
+ |
+ for (int i = 0; i < MD_FLOATINGSAVEAREA_MIPS_FPR_COUNT; ++i) { |
+ thread->mcontext.fpregs.fp_r.fp_fregs[i]._fp_fregs = |
+ rawregs->float_save.regs[i]; |
+ } |
+ |
+ thread->mcontext.fpc_csr = rawregs->float_save.fpcsr; |
#if _MIPS_SIM == _ABIO32 |
- thread->fpregs.fir = rawregs->float_save.fir; |
+ thread->mcontext.fpc_eir = rawregs->float_save.fir; |
#endif |
} |
#else |
@@ -751,7 +765,11 @@ |
pr.pr_info.si_signo = fatal_signal; |
pr.pr_cursig = fatal_signal; |
pr.pr_pid = thread.tid; |
+#if defined(__mips__) |
+ memcpy(&pr.pr_reg, &thread.mcontext.gregs, sizeof(user_regs_struct)); |
+#else |
memcpy(&pr.pr_reg, &thread.regs, sizeof(user_regs_struct)); |
+#endif |
Nhdr nhdr; |
memset(&nhdr, 0, sizeof(nhdr)); |