summaryrefslogtreecommitdiffstats
path: root/third_party/rust/minidump-writer/src/linux/crash_context/arm.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/minidump-writer/src/linux/crash_context/arm.rs')
-rw-r--r--third_party/rust/minidump-writer/src/linux/crash_context/arm.rs47
1 files changed, 47 insertions, 0 deletions
diff --git a/third_party/rust/minidump-writer/src/linux/crash_context/arm.rs b/third_party/rust/minidump-writer/src/linux/crash_context/arm.rs
new file mode 100644
index 0000000000..e4e40216e2
--- /dev/null
+++ b/third_party/rust/minidump-writer/src/linux/crash_context/arm.rs
@@ -0,0 +1,47 @@
+use super::CrashContext;
+use crate::minidump_cpu::RawContextCPU;
+
+impl CrashContext {
+ pub fn get_instruction_pointer(&self) -> usize {
+ self.inner.context.uc_mcontext.arm_pc as usize
+ }
+
+ pub fn get_stack_pointer(&self) -> usize {
+ self.inner.context.uc_mcontext.arm_sp as usize
+ }
+
+ pub fn fill_cpu_context(&self, out: &mut RawContextCPU) {
+ out.context_flags =
+ crate::minidump_format::format::ContextFlagsArm::CONTEXT_ARM_FULL.bits();
+
+ {
+ let iregs = &mut out.iregs;
+ let gregs = &self.inner.context.uc_mcontext;
+ iregs[0] = gregs.arm_r0;
+ iregs[1] = gregs.arm_r1;
+ iregs[2] = gregs.arm_r2;
+ iregs[3] = gregs.arm_r3;
+ iregs[4] = gregs.arm_r4;
+ iregs[5] = gregs.arm_r5;
+ iregs[6] = gregs.arm_r6;
+ iregs[7] = gregs.arm_r7;
+ iregs[8] = gregs.arm_r8;
+ iregs[9] = gregs.arm_r9;
+ iregs[10] = gregs.arm_r10;
+
+ iregs[11] = gregs.arm_fp;
+ iregs[12] = gregs.arm_ip;
+ iregs[13] = gregs.arm_sp;
+ iregs[14] = gregs.arm_lr;
+ iregs[15] = gregs.arm_pc;
+
+ out.cpsr = gregs.arm_cpsr;
+ }
+
+ // TODO: this todo has been in breakpad for years....
+ // TODO: fix this after fixing ExceptionHandler
+ //out.float_save.fpscr = 0;
+ //out.float_save.regs = [0; MD_FLOATINGSAVEAREA_ARM_FPR_COUNT];
+ //out.float_save.extra = [0; MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT];
+ }
+}