diff options
author | Joshua Peraza <jperaza@chromium.org> | 2018-08-01 10:48:27 -0700 |
---|---|---|
committer | Joshua Peraza <jperaza@chromium.org> | 2018-08-01 19:27:25 +0000 |
commit | 88d8114fda3e4a7292654bd6ac0c34d6c88a8121 (patch) | |
tree | 7e7c5e65771736eb81e2bef56269eea0cba6953d /src/tools/linux | |
parent | Rename MDRawContextARM64 and its context flags (diff) | |
download | breakpad-88d8114fda3e4a7292654bd6ac0c34d6c88a8121.tar.xz |
Define and use a a new MDRawContextARM64
This struct matches the layout defined by Microsoft and replaces
Breakpad's MDRawContextARM64_Old. This CL updates the processor to
understand either the old or new structs, but clients continue to write
the old structs.
Change-Id: I8dedd9ddb2ec083b802723b9ac87beb18d98edbd
Reviewed-on: https://chromium-review.googlesource.com/1155938
Reviewed-by: Mark Mentovai <mark@chromium.org>
Diffstat (limited to 'src/tools/linux')
-rw-r--r-- | src/tools/linux/md2core/minidump-2-core.cc | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/src/tools/linux/md2core/minidump-2-core.cc b/src/tools/linux/md2core/minidump-2-core.cc index cf9648f6..941586e9 100644 --- a/src/tools/linux/md2core/minidump-2-core.cc +++ b/src/tools/linux/md2core/minidump-2-core.cc @@ -480,17 +480,28 @@ ParseThreadRegisters(CrashedProcess::Thread* thread, static void ParseThreadRegisters(CrashedProcess::Thread* thread, const MinidumpMemoryRange& range) { - const MDRawContextARM64_Old* rawregs = range.GetData<MDRawContextARM64_Old>(0); - - for (int i = 0; i < 31; ++i) - thread->regs.regs[i] = rawregs->iregs[i]; - thread->regs.sp = rawregs->iregs[MD_CONTEXT_ARM64_REG_SP]; - thread->regs.pc = rawregs->iregs[MD_CONTEXT_ARM64_REG_PC]; - thread->regs.pstate = rawregs->cpsr; - - memcpy(thread->fpregs.vregs, rawregs->float_save.regs, 8 * 32); - thread->fpregs.fpsr = rawregs->float_save.fpsr; - thread->fpregs.fpcr = rawregs->float_save.fpcr; +#define COPY_REGS(rawregs) \ + do { \ + for (int i = 0; i < 31; ++i) \ + thread->regs.regs[i] = rawregs->iregs[i]; \ + thread->regs.sp = rawregs->iregs[MD_CONTEXT_ARM64_REG_SP]; \ + thread->regs.pc = rawregs->iregs[MD_CONTEXT_ARM64_REG_PC]; \ + thread->regs.pstate = rawregs->cpsr; \ + \ + memcpy(thread->fpregs.vregs, rawregs->float_save.regs, 8 * 32); \ + thread->fpregs.fpsr = rawregs->float_save.fpsr; \ + thread->fpregs.fpcr = rawregs->float_save.fpcr; \ + } while (false) + + if (range.length() == sizeof(MDRawContextARM64_Old)) { + const MDRawContextARM64_Old* rawregs = + range.GetData<MDRawContextARM64_Old>(0); + COPY_REGS(rawregs); + } else { + const MDRawContextARM64* rawregs = range.GetData<MDRawContextARM64>(0); + COPY_REGS(rawregs); + } +#undef COPY_REGS } #elif defined(__mips__) static void |