diff options
Diffstat (limited to 'src/client/linux')
5 files changed, 21 insertions, 3 deletions
diff --git a/src/client/linux/dump_writer_common/thread_info.cc b/src/client/linux/dump_writer_common/thread_info.cc index 9fe253c6..a3072b6c 100644 --- a/src/client/linux/dump_writer_common/thread_info.cc +++ b/src/client/linux/dump_writer_common/thread_info.cc @@ -257,7 +257,9 @@ void ThreadInfo::FillCPUContext(RawContextCPU* out) const { out->float_save.regs[i] = fpregs.regs[i]; out->float_save.fpcsr = fpregs.fpcsr; +#if _MIPS_SIM == _ABIO32 out->float_save.fir = fpregs.fir; +#endif } #endif diff --git a/src/client/linux/dump_writer_common/ucontext_reader.cc b/src/client/linux/dump_writer_common/ucontext_reader.cc index b20a68bf..d37fdeb0 100644 --- a/src/client/linux/dump_writer_common/ucontext_reader.cc +++ b/src/client/linux/dump_writer_common/ucontext_reader.cc @@ -244,7 +244,9 @@ void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext *uc) { out->float_save.regs[i] = uc->uc_mcontext.fpregs.fp_r.fp_dregs[i]; out->float_save.fpcsr = uc->uc_mcontext.fpc_csr; +#if _MIPS_SIM == _ABIO32 out->float_save.fir = uc->uc_mcontext.fpc_eir; // Unused. +#endif } #endif diff --git a/src/client/linux/handler/exception_handler_unittest.cc b/src/client/linux/handler/exception_handler_unittest.cc index 6deea55b..289c9cd1 100644 --- a/src/client/linux/handler/exception_handler_unittest.cc +++ b/src/client/linux/handler/exception_handler_unittest.cc @@ -80,7 +80,11 @@ void FlushInstructionCache(const char* memory, uint32_t memory_size) { // Provided by Android's <unistd.h> long begin = reinterpret_cast<long>(memory); long end = begin + static_cast<long>(memory_size); +#if _MIPS_SIM == _ABIO32 cacheflush(begin, end, 0); +#else + syscall(__NR_cacheflush, begin, end, ICACHE); +#endif # elif defined(__linux__) // See http://www.linux-mips.org/wiki/Cacheflush_Syscall. cacheflush(const_cast<char*>(memory), memory_size, ICACHE); diff --git a/src/client/linux/minidump_writer/linux_dumper.h b/src/client/linux/minidump_writer/linux_dumper.h index 2fc88486..87dfadb4 100644 --- a/src/client/linux/minidump_writer/linux_dumper.h +++ b/src/client/linux/minidump_writer/linux_dumper.h @@ -52,9 +52,11 @@ namespace google_breakpad { // Typedef for our parsing of the auxv variables in /proc/pid/auxv. -#if defined(__i386) || defined(__ARM_EABI__) || defined(__mips__) +#if defined(__i386) || defined(__ARM_EABI__) || \ + (defined(__mips__) && _MIPS_SIM == _ABIO32) typedef Elf32_auxv_t elf_aux_entry; -#elif defined(__x86_64) || defined(__aarch64__) +#elif defined(__x86_64) || defined(__aarch64__) || \ + (defined(__mips__) && _MIPS_SIM != _ABIO32) typedef Elf64_auxv_t elf_aux_entry; #endif diff --git a/src/client/linux/minidump_writer/minidump_writer.cc b/src/client/linux/minidump_writer/minidump_writer.cc index edc7e47d..0414bb72 100644 --- a/src/client/linux/minidump_writer/minidump_writer.cc +++ b/src/client/linux/minidump_writer/minidump_writer.cc @@ -689,10 +689,18 @@ class MinidumpWriter { return false; } +#ifdef __mips__ + if (dyn.d_tag == DT_MIPS_RLD_MAP) { + r_debug = reinterpret_cast<struct r_debug*>(dyn.d_un.d_ptr); + continue; + } +#else if (dyn.d_tag == DT_DEBUG) { r_debug = reinterpret_cast<struct r_debug*>(dyn.d_un.d_ptr); continue; - } else if (dyn.d_tag == DT_NULL) { + } +#endif + else if (dyn.d_tag == DT_NULL) { break; } } |