diff options
author | rmcilroy@chromium.org <rmcilroy@chromium.org@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2014-04-03 13:15:37 +0000 |
---|---|---|
committer | rmcilroy@chromium.org <rmcilroy@chromium.org@4c0a9323-5329-0410-9bdc-e9ce6186880e> | 2014-04-03 13:15:37 +0000 |
commit | 410b7024e3b66863af88e624536bebbbb7873252 (patch) | |
tree | e025780f530fd5ed4986333b97ed34c44d92c0a8 /src/client/linux/minidump_writer | |
parent | First cut at adding arm64 Linux / Android support to Breakpad. (diff) | |
download | breakpad-410b7024e3b66863af88e624536bebbbb7873252.tar.xz |
Add Arm64 version of breakpad_getcontext for Android.
This CL adds breakpad_getcontext support for Arm64 to Android. The assembly
is based on getcontext.S in glibc.
BUG=354405,335641
R=mark@chromium.org
Review URL: https://breakpad.appspot.com/1384002
git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@1302 4c0a9323-5329-0410-9bdc-e9ce6186880e
Diffstat (limited to 'src/client/linux/minidump_writer')
-rw-r--r-- | src/client/linux/minidump_writer/minidump_writer.cc | 21 | ||||
-rw-r--r-- | src/client/linux/minidump_writer/minidump_writer.h | 7 |
2 files changed, 18 insertions, 10 deletions
diff --git a/src/client/linux/minidump_writer/minidump_writer.cc b/src/client/linux/minidump_writer/minidump_writer.cc index 50929f80..ce8503d2 100644 --- a/src/client/linux/minidump_writer/minidump_writer.cc +++ b/src/client/linux/minidump_writer/minidump_writer.cc @@ -344,8 +344,7 @@ void CPUFillFromThreadInfo(MDRawContextARM* out, #endif } -void CPUFillFromUContext(MDRawContextARM* out, const ucontext* uc, - const struct _libc_fpstate* fpregs) { +void CPUFillFromUContext(MDRawContextARM* out, const ucontext* uc) { out->context_flags = MD_CONTEXT_ARM_FULL; out->iregs[0] = uc->uc_mcontext.arm_r0; @@ -383,7 +382,7 @@ void CPUFillFromThreadInfo(MDRawContextARM64* out, } void CPUFillFromUContext(MDRawContextARM64* out, const ucontext* uc, - const struct _libc_fpstate* fpregs) { + const struct fpsimd_context* fpregs) { // TODO(rmcilroy): Implement for arm64. } @@ -418,8 +417,7 @@ static void CPUFillFromThreadInfo(MDRawContextMIPS* out, out->float_save.fir = info.fpregs.fir; } -static void CPUFillFromUContext(MDRawContextMIPS* out, const ucontext* uc, - const struct _libc_fpstate* fpregs) { +static void CPUFillFromUContext(MDRawContextMIPS* out, const ucontext* uc) { out->context_flags = MD_CONTEXT_MIPS_FULL; for (int i = 0; i < MD_CONTEXT_MIPS_GPR_COUNT; ++i) @@ -483,11 +481,8 @@ class MinidumpWriter { : fd_(minidump_fd), path_(minidump_path), ucontext_(context ? &context->context : NULL), -#if !defined(__ARM_EABI__) && !defined(__mips__) && !defined(__aarch64__) +#if !defined(__ARM_EABI__) && !defined(__mips__) float_state_(context ? &context->float_state : NULL), -#else - // TODO: fix this after fixing ExceptionHandler - float_state_(NULL), #endif dumper_(dumper), minidump_size_limit_(-1), @@ -848,7 +843,11 @@ class MinidumpWriter { if (!cpu.Allocate()) return false; my_memset(cpu.get(), 0, sizeof(RawContextCPU)); +#if !defined(__ARM_EABI__) && !defined(__mips__) CPUFillFromUContext(cpu.get(), ucontext_, float_state_); +#else + CPUFillFromUContext(cpu.get(), ucontext_); +#endif if (stack_copy) PopSeccompStackFrame(cpu.get(), thread, stack_copy); thread.thread_context = cpu.location(); @@ -1756,7 +1755,9 @@ class MinidumpWriter { const char* path_; // Path to the file where the minidum should be written. const struct ucontext* const ucontext_; // also from the signal handler - const struct _libc_fpstate* const float_state_; // ditto +#if !defined(__ARM_EABI__) && !defined(__mips__) + const google_breakpad::fpstate_t* const float_state_; // ditto +#endif LinuxDumper* dumper_; MinidumpFileWriter minidump_writer_; off_t minidump_size_limit_; diff --git a/src/client/linux/minidump_writer/minidump_writer.h b/src/client/linux/minidump_writer/minidump_writer.h index c9e150ae..e1afe69b 100644 --- a/src/client/linux/minidump_writer/minidump_writer.h +++ b/src/client/linux/minidump_writer/minidump_writer.h @@ -32,6 +32,7 @@ #include <stdint.h> #include <sys/types.h> +#include <sys/ucontext.h> #include <unistd.h> #include <list> @@ -52,6 +53,12 @@ struct MappingEntry { // A list of <MappingInfo, GUID> typedef std::list<MappingEntry> MappingList; +#if defined(__aarch64__) +typedef struct fpsimd_context fpstate_t; +#elif !defined(__ARM_EABI__) && !defined(__mips__) +typedef struct _libc_fpstate fpstate_t; +#endif + // These entries store a list of memory regions that the client wants included // in the minidump. struct AppMemory { |