aboutsummaryrefslogtreecommitdiff
path: root/src/client/linux/dump_writer_common
diff options
context:
space:
mode:
authorrmcilroy@chromium.org <rmcilroy@chromium.org>2015-04-21 21:34:14 +0000
committerrmcilroy@chromium.org <rmcilroy@chromium.org>2015-04-21 21:34:14 +0000
commit0f27af628fd9aff70193abb140038e2d8f938165 (patch)
tree2bf0f466b6b320fb93975d3aff953c90608a5493 /src/client/linux/dump_writer_common
parentupdate svn:ignores (diff)
downloadbreakpad-0f27af628fd9aff70193abb140038e2d8f938165.tar.xz
[MIPS]: Use mcontext_t structure for MIPS
This change removes user_regs_struct and user_fpregs_struct structures for mips and uses mcontext_t instead. R=fdegans@chromium.org, mark@chromium.org, rmcilroy@chromium.org Review URL: https://breakpad.appspot.com/3744002 Patch from Gordana Cmiljanovic <Gordana.Cmiljanovic@imgtec.com>. git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@1452 4c0a9323-5329-0410-9bdc-e9ce6186880e
Diffstat (limited to 'src/client/linux/dump_writer_common')
-rw-r--r--src/client/linux/dump_writer_common/thread_info.cc65
-rw-r--r--src/client/linux/dump_writer_common/thread_info.h13
2 files changed, 57 insertions, 21 deletions
diff --git a/src/client/linux/dump_writer_common/thread_info.cc b/src/client/linux/dump_writer_common/thread_info.cc
index a3072b6c..9956d445 100644
--- a/src/client/linux/dump_writer_common/thread_info.cc
+++ b/src/client/linux/dump_writer_common/thread_info.cc
@@ -30,6 +30,7 @@
#include "client/linux/dump_writer_common/thread_info.h"
#include <string.h>
+#include <assert.h>
#include "common/linux/linux_libc_support.h"
#include "google_breakpad/common/minidump_format.h"
@@ -230,37 +231,69 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
#elif defined(__mips__)
uintptr_t ThreadInfo::GetInstructionPointer() const {
- return regs.epc;
+ return mcontext.pc;
}
void ThreadInfo::FillCPUContext(RawContextCPU* out) const {
out->context_flags = MD_CONTEXT_MIPS_FULL;
for (int i = 0; i < MD_CONTEXT_MIPS_GPR_COUNT; ++i)
- out->iregs[i] = regs.regs[i];
+ out->iregs[i] = mcontext.gregs[i];
- out->mdhi = regs.hi;
- out->mdlo = regs.lo;
+ out->mdhi = mcontext.mdhi;
+ out->mdlo = mcontext.mdlo;
+ out->dsp_control = mcontext.dsp;
- for (int i = 0; i < MD_CONTEXT_MIPS_DSP_COUNT; ++i) {
- out->hi[i] = hi[i];
- out->lo[i] = lo[i];
- }
- out->dsp_control = dsp_control;
+ out->hi[0] = mcontext.hi1;
+ out->lo[0] = mcontext.lo1;
+ out->hi[1] = mcontext.hi2;
+ out->lo[1] = mcontext.lo2;
+ out->hi[2] = mcontext.hi3;
+ out->lo[2] = mcontext.lo3;
- out->epc = regs.epc;
- out->badvaddr = regs.badvaddr;
- out->status = regs.status;
- out->cause = regs.cause;
+ out->epc = mcontext.pc;
+ out->badvaddr = 0; // Not stored in mcontext
+ out->status = 0; // Not stored in mcontext
+ out->cause = 0; // Not stored in mcontext
for (int i = 0; i < MD_FLOATINGSAVEAREA_MIPS_FPR_COUNT; ++i)
- out->float_save.regs[i] = fpregs.regs[i];
+ out->float_save.regs[i] = mcontext.fpregs.fp_r.fp_fregs[i]._fp_fregs;
- out->float_save.fpcsr = fpregs.fpcsr;
+ out->float_save.fpcsr = mcontext.fpc_csr;
#if _MIPS_SIM == _ABIO32
- out->float_save.fir = fpregs.fir;
+ out->float_save.fir = mcontext.fpc_eir;
#endif
}
+#endif // __mips__
+
+void ThreadInfo::GetGeneralPurposeRegisters(void** gp_regs, size_t* size) {
+ assert(gp_regs || size);
+#if defined(__mips__)
+ if (gp_regs)
+ *gp_regs = mcontext.gregs;
+ if (size)
+ *size = sizeof(mcontext.gregs);
+#else
+ if (gp_regs)
+ *gp_regs = &regs;
+ if (size)
+ *size = sizeof(regs);
#endif
+}
+
+void ThreadInfo::GetFloatingPointRegisters(void** fp_regs, size_t* size) {
+ assert(fp_regs || size);
+#if defined(__mips__)
+ if (fp_regs)
+ *fp_regs = &mcontext.fpregs;
+ if (size)
+ *size = sizeof(mcontext.fpregs);
+#else
+ if (fp_regs)
+ *fp_regs = &fpregs;
+ if (size)
+ *size = sizeof(fpregs);
+#endif
+}
} // namespace google_breakpad
diff --git a/src/client/linux/dump_writer_common/thread_info.h b/src/client/linux/dump_writer_common/thread_info.h
index cf6d0101..a05ffea2 100644
--- a/src/client/linux/dump_writer_common/thread_info.h
+++ b/src/client/linux/dump_writer_common/thread_info.h
@@ -69,11 +69,8 @@ struct ThreadInfo {
struct user_pt_regs regs;
struct user_fpsimd_state fpregs;
#elif defined(__mips__)
- user_regs_struct regs;
- user_fpregs_struct fpregs;
- uint32_t hi[3];
- uint32_t lo[3];
- uint32_t dsp_control;
+ // Use the structure defined in <sys/ucontext.h>.
+ mcontext_t mcontext;
#endif
// Returns the instruction pointer (platform-dependent impl.).
@@ -81,6 +78,12 @@ struct ThreadInfo {
// Fills a RawContextCPU using the context in the ThreadInfo object.
void FillCPUContext(RawContextCPU* out) const;
+
+ // Returns the pointer and size of general purpose register area.
+ void GetGeneralPurposeRegisters(void** gp_regs, size_t* size);
+
+ // Returns the pointer and size of float point register area.
+ void GetFloatingPointRegisters(void** fp_regs, size_t* size);
};
} // namespace google_breakpad