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>
This commit is contained in:
Joshua Peraza 2018-08-01 10:48:27 -07:00
parent 627ef0cb9c
commit 88d8114fda
22 changed files with 411 additions and 83 deletions

View file

@ -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);
#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)
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;
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