Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aae5d437 authored by Elliott Hughes's avatar Elliott Hughes
Browse files

Add missing arm64 registers.

Also fix dumping of arm64's vector registers, which are actually 128 bits wide.

Also move the arm/arm64 FP registers to the tombstone. (We've never dumped
them at all for the other architectures.)

(cherry picked from commit b40c5035)

Change-Id: Ic646fb9ea01e9beb42e1757feb8742c1d4efafa7
parent 71bbc678
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -82,13 +82,13 @@ void dump_registers(log_t* log, pid_t tid) {

  user_vfp vfp_regs;
  if (ptrace(PTRACE_GETVFPREGS, tid, 0, &vfp_regs)) {
    _LOG(log, logtype::REGISTERS, "cannot get registers: %s\n", strerror(errno));
    _LOG(log, logtype::FP_REGISTERS, "cannot get FP registers: %s\n", strerror(errno));
    return;
  }

  for (size_t i = 0; i < 32; i += 2) {
    _LOG(log, logtype::REGISTERS, "    d%-2d %016llx  d%-2d %016llx\n",
    _LOG(log, logtype::FP_REGISTERS, "    d%-2d %016llx  d%-2d %016llx\n",
         i, vfp_regs.fpregs[i], i+1, vfp_regs.fpregs[i+1]);
  }
  _LOG(log, logtype::REGISTERS, "    scr %08lx\n", vfp_regs.fpscr);
  _LOG(log, logtype::FP_REGISTERS, "    scr %08lx\n", vfp_regs.fpscr);
}
+22 −22
Original line number Diff line number Diff line
@@ -15,17 +15,14 @@
 * limitations under the License.
 */

#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <elf.h>
#include <errno.h>
#include <inttypes.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ptrace.h>
#include <sys/user.h>
#include <sys/uio.h>
#include <linux/elf.h>

#include "../utility.h"
#include "../machine.h"
@@ -79,19 +76,18 @@ void dump_registers(log_t* log, pid_t tid) {

  for (int i = 0; i < 28; i += 4) {
    _LOG(log, logtype::REGISTERS,
         "    x%-2d  %016lx  x%-2d  %016lx  x%-2d  %016lx  x%-2d  %016lx\n",
         i, (uint64_t)r.regs[i],
         i+1, (uint64_t)r.regs[i+1],
         i+2, (uint64_t)r.regs[i+2],
         i+3, (uint64_t)r.regs[i+3]);
         "    x%-2d  %016llx  x%-2d  %016llx  x%-2d  %016llx  x%-2d  %016llx\n",
         i, r.regs[i],
         i+1, r.regs[i+1],
         i+2, r.regs[i+2],
         i+3, r.regs[i+3]);
  }

  _LOG(log, logtype::REGISTERS, "    x28  %016lx  x29  %016lx  x30  %016lx\n",
       (uint64_t)r.regs[28], (uint64_t)r.regs[29], (uint64_t)r.regs[30]);

  _LOG(log, logtype::REGISTERS, "    sp   %016lx  pc   %016lx\n",
       (uint64_t)r.sp, (uint64_t)r.pc);
  _LOG(log, logtype::REGISTERS, "    x28  %016llx  x29  %016llx  x30  %016llx\n",
       r.regs[28], r.regs[29], r.regs[30]);

  _LOG(log, logtype::REGISTERS, "    sp   %016llx  pc   %016llx  pstate %016llx\n",
       r.sp, r.pc, r.pstate);

  struct user_fpsimd_state f;
  io.iov_base = &f;
@@ -102,11 +98,15 @@ void dump_registers(log_t* log, pid_t tid) {
    return;
  }

  for (int i = 0; i < 32; i += 4) {
    _LOG(log, logtype::REGISTERS, "    v%-2d  %016lx  v%-2d  %016lx  v%-2d  %016lx  v%-2d  %016lx\n",
         i, (uint64_t)f.vregs[i],
         i+1, (uint64_t)f.vregs[i+1],
         i+2, (uint64_t)f.vregs[i+2],
         i+3, (uint64_t)f.vregs[i+3]);
  for (int i = 0; i < 32; i += 2) {
    _LOG(log, logtype::FP_REGISTERS,
         "    v%-2d  %016" PRIx64 "%016" PRIx64 "  v%-2d  %016" PRIx64 "%016" PRIx64 "\n",
         i,
         static_cast<uint64_t>(f.vregs[i] >> 64),
         static_cast<uint64_t>(f.vregs[i]),
         i+1,
         static_cast<uint64_t>(f.vregs[i+1] >> 64),
         static_cast<uint64_t>(f.vregs[i+1]));
  }
  _LOG(log, logtype::FP_REGISTERS, "    fpsr %08x  fpcr %08x\n", f.fpsr, f.fpcr);
}
+9 −8
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ enum logtype {
  HEADER,
  THREAD,
  REGISTERS,
  FP_REGISTERS,
  BACKTRACE,
  MAPS,
  MEMORY,