diff options
author | rmcilroy@chromium.org <rmcilroy@chromium.org> | 2015-04-21 21:34:14 +0000 |
---|---|---|
committer | rmcilroy@chromium.org <rmcilroy@chromium.org> | 2015-04-21 21:34:14 +0000 |
commit | 0f27af628fd9aff70193abb140038e2d8f938165 (patch) | |
tree | 2bf0f466b6b320fb93975d3aff953c90608a5493 /src/client/linux/dump_writer_common | |
parent | update svn:ignores (diff) | |
download | breakpad-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.cc | 65 | ||||
-rw-r--r-- | src/client/linux/dump_writer_common/thread_info.h | 13 |
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 = ®s; + 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 |