aboutsummaryrefslogtreecommitdiff
path: root/src/client/linux/minidump_writer
diff options
context:
space:
mode:
authorrmcilroy@chromium.org <rmcilroy@chromium.org@4c0a9323-5329-0410-9bdc-e9ce6186880e>2014-04-03 13:15:37 +0000
committerrmcilroy@chromium.org <rmcilroy@chromium.org@4c0a9323-5329-0410-9bdc-e9ce6186880e>2014-04-03 13:15:37 +0000
commit410b7024e3b66863af88e624536bebbbb7873252 (patch)
treee025780f530fd5ed4986333b97ed34c44d92c0a8 /src/client/linux/minidump_writer
parentFirst cut at adding arm64 Linux / Android support to Breakpad. (diff)
downloadbreakpad-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.cc21
-rw-r--r--src/client/linux/minidump_writer/minidump_writer.h7
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 {