From d88401cca9ff7640387a0d88d75de1e7d8fff294 Mon Sep 17 00:00:00 2001 From: "mark@chromium.org" Date: Wed, 15 Apr 2015 19:28:11 +0000 Subject: MIPS64: Initial MIPS64 related change. With this change Breakpad can be compiled for MIPS64, but it is not yet functional. Patch by Gordana Cmiljanovic Review URL: https://breakpad.appspot.com/6824002/ git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@1446 4c0a9323-5329-0410-9bdc-e9ce6186880e --- src/client/linux/dump_writer_common/thread_info.cc | 2 ++ src/client/linux/dump_writer_common/ucontext_reader.cc | 2 ++ src/client/linux/handler/exception_handler_unittest.cc | 4 ++++ src/client/linux/minidump_writer/linux_dumper.h | 6 ++++-- src/client/linux/minidump_writer/minidump_writer.cc | 10 +++++++++- 5 files changed, 21 insertions(+), 3 deletions(-) (limited to 'src/client') 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 long begin = reinterpret_cast(memory); long end = begin + static_cast(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(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(dyn.d_un.d_ptr); + continue; + } +#else if (dyn.d_tag == DT_DEBUG) { r_debug = reinterpret_cast(dyn.d_un.d_ptr); continue; - } else if (dyn.d_tag == DT_NULL) { + } +#endif + else if (dyn.d_tag == DT_NULL) { break; } } -- cgit v1.2.1