Blame sysdeps/unix/sysv/linux/ia64/register-dump.h

Packit 6c4009
/* Dump registers.
Packit 6c4009
   Copyright (C) 2004-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
   Contributed by Jakub Jelinek <jakub@redhat.com>, 2004.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library; if not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#include <string.h>
Packit 6c4009
#include <sys/uio.h>
Packit 6c4009
#include <_itoa.h>
Packit 6c4009
Packit 6c4009
/* We will print the register dump in this format:
Packit 6c4009
Packit 6c4009
 GP:   XXXXXXXXXXXXXXXX R2:   XXXXXXXXXXXXXXXX R3:   XXXXXXXXXXXXXXXX
Packit 6c4009
 R8:   XXXXXXXXXXXXXXXX R9:   XXXXXXXXXXXXXXXX R10:  XXXXXXXXXXXXXXXX
Packit 6c4009
 R11:  XXXXXXXXXXXXXXXX SP:   XXXXXXXXXXXXXXXX TP:   XXXXXXXXXXXXXXXX
Packit 6c4009
 R14:  XXXXXXXXXXXXXXXX R15:  XXXXXXXXXXXXXXXX R16:  XXXXXXXXXXXXXXXX
Packit 6c4009
 R17:  XXXXXXXXXXXXXXXX R18:  XXXXXXXXXXXXXXXX R19:  XXXXXXXXXXXXXXXX
Packit 6c4009
 R20:  XXXXXXXXXXXXXXXX R21:  XXXXXXXXXXXXXXXX R22:  XXXXXXXXXXXXXXXX
Packit 6c4009
 R23:  XXXXXXXXXXXXXXXX R24:  XXXXXXXXXXXXXXXX R25:  XXXXXXXXXXXXXXXX
Packit 6c4009
 R26:  XXXXXXXXXXXXXXXX R27:  XXXXXXXXXXXXXXXX R28:  XXXXXXXXXXXXXXXX
Packit 6c4009
 R29:  XXXXXXXXXXXXXXXX R30:  XXXXXXXXXXXXXXXX R31:  XXXXXXXXXXXXXXXX
Packit 6c4009
Packit 6c4009
 RP:   XXXXXXXXXXXXXXXX B6:   XXXXXXXXXXXXXXXX B7:   XXXXXXXXXXXXXXXX
Packit 6c4009
Packit 6c4009
 IP:   XXXXXXXXXXXXXXXX RSC:  XXXXXXXXXXXXXXXX PR:   XXXXXXXXXXXXXXXX
Packit 6c4009
 PFS:  XXXXXXXXXXXXXXXX UNAT: XXXXXXXXXXXXXXXX CFM:  XXXXXXXXXXXXXXXX
Packit 6c4009
 CCV:  XXXXXXXXXXXXXXXX FPSR: XXXXXXXXXXXXXXXX
Packit 6c4009
Packit 6c4009
 F32:  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX F33:  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Packit 6c4009
 F34:  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX F35:  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Packit 6c4009
...
Packit 6c4009
 F124: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX F125: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Packit 6c4009
 F126: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX F127: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Packit 6c4009
 */
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
hexvalue (unsigned long int value, char *buf, size_t len)
Packit 6c4009
{
Packit 6c4009
  char *cp = _itoa_word (value, buf + len, 16, 0);
Packit 6c4009
  while (cp > buf)
Packit 6c4009
    *--cp = '0';
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
regvalue (unsigned long int *value, char letter, int regno, char *buf)
Packit 6c4009
{
Packit 6c4009
  int n = regno >= 100 ? 3 : regno >= 10 ? 2 : 1;
Packit 6c4009
  buf[0] = ' ';
Packit 6c4009
  buf[1] = letter;
Packit 6c4009
  _itoa_word (regno, buf + 2 + n, 10, 0);
Packit 6c4009
  buf[2 + n] = ':';
Packit 6c4009
  for (++n; n <= 4; ++n)
Packit 6c4009
    buf[2 + n] = ' ';
Packit 6c4009
  hexvalue (value[0], buf + 7, 16);
Packit 6c4009
  if (letter == 'F')
Packit 6c4009
    {
Packit 6c4009
      hexvalue (value[1], buf + 7 + 16, 16);
Packit 6c4009
      buf[7 + 32] = '\n';
Packit 6c4009
    }
Packit 6c4009
  else
Packit 6c4009
    buf[7 + 16] = '\n';
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
register_dump (int fd, struct sigcontext *ctx)
Packit 6c4009
{
Packit 6c4009
  char gpregs[32 - 5][8 + 16];
Packit 6c4009
  char fpregs[128 - 32][8 + 32];
Packit 6c4009
  char bpregs[3][8 + 16];
Packit 6c4009
  char spregs[8][16];
Packit 6c4009
  struct iovec iov[146];
Packit 6c4009
  size_t nr = 0;
Packit 6c4009
  int i;
Packit 6c4009
Packit 6c4009
#define ADD_STRING(str) \
Packit 6c4009
  do									      \
Packit 6c4009
    {									      \
Packit 6c4009
      iov[nr].iov_base = (char *) str;					      \
Packit 6c4009
      iov[nr].iov_len = strlen (str);					      \
Packit 6c4009
      ++nr;								      \
Packit 6c4009
    }									      \
Packit 6c4009
  while (0)
Packit 6c4009
#define ADD_MEM(str, len) \
Packit 6c4009
  do									      \
Packit 6c4009
    {									      \
Packit 6c4009
      iov[nr].iov_base = str;						      \
Packit 6c4009
      iov[nr].iov_len = len;						      \
Packit 6c4009
      ++nr;								      \
Packit 6c4009
    }									      \
Packit 6c4009
  while (0)
Packit 6c4009
Packit 6c4009
  /* Generate strings of register contents.  */
Packit 6c4009
  for (i = 1; i < 4; ++i)
Packit 6c4009
    {
Packit 6c4009
      regvalue (&ctx->sc_gr[i], 'R', i, gpregs[i - 1]);
Packit 6c4009
      if (ctx->sc_nat & (1L << i))
Packit 6c4009
        memcpy (gpregs[i - 1] + 7, "NaT             ", 16);
Packit 6c4009
    }
Packit 6c4009
  for (i = 8; i < 32; ++i)
Packit 6c4009
    {
Packit 6c4009
      regvalue (&ctx->sc_gr[i], 'R', i, gpregs[i - 5]);
Packit 6c4009
      if (ctx->sc_nat & (1L << i))
Packit 6c4009
        memcpy (gpregs[i - 1] + 7, "NaT             ", 16);
Packit 6c4009
    }
Packit 6c4009
  memcpy (gpregs[0] + 1, "GP:", 3);
Packit 6c4009
  memcpy (gpregs[7] + 1, "SP: ", 4);
Packit 6c4009
  memcpy (gpregs[8] + 1, "TP: ", 4);
Packit 6c4009
Packit 6c4009
  regvalue (&ctx->sc_br[0], 'B', 0, bpregs[0]);
Packit 6c4009
  regvalue (&ctx->sc_br[6], 'B', 6, bpregs[1]);
Packit 6c4009
  regvalue (&ctx->sc_br[7], 'B', 7, bpregs[2]);
Packit 6c4009
  memcpy (bpregs[0] + 1, "RP:", 3);
Packit 6c4009
Packit 6c4009
  if (ctx->sc_flags & IA64_SC_FLAG_FPH_VALID)
Packit 6c4009
    for (i = 32; i < 128; ++i)
Packit 6c4009
      regvalue (&ctx->sc_fr[i].u.bits[0], 'F', i, fpregs[i - 32]);
Packit 6c4009
Packit 6c4009
  hexvalue (ctx->sc_ip, spregs[0], sizeof (spregs[0]));
Packit 6c4009
  hexvalue (ctx->sc_ar_rsc, spregs[1], sizeof (spregs[1]));
Packit 6c4009
  hexvalue (ctx->sc_pr, spregs[2], sizeof (spregs[2]));
Packit 6c4009
  hexvalue (ctx->sc_ar_pfs, spregs[3], sizeof (spregs[3]));
Packit 6c4009
  hexvalue (ctx->sc_ar_unat, spregs[4], sizeof (spregs[4]));
Packit 6c4009
  hexvalue (ctx->sc_cfm, spregs[5], sizeof (spregs[5]));
Packit 6c4009
  hexvalue (ctx->sc_ar_ccv, spregs[6], sizeof (spregs[6]));
Packit 6c4009
  hexvalue (ctx->sc_ar_fpsr, spregs[7], sizeof (spregs[7]));
Packit 6c4009
Packit 6c4009
  /* Generate the output.  */
Packit 6c4009
  ADD_STRING ("Register dump:\n\n");
Packit 6c4009
Packit 6c4009
  for (i = 0; i < 32 - 5; ++i)
Packit 6c4009
    ADD_MEM (gpregs[i], sizeof (gpregs[0]) - 1 + ((i % 3) == 2));
Packit 6c4009
  ADD_STRING ("\n");
Packit 6c4009
Packit 6c4009
  for (i = 0; i < 3; ++i)
Packit 6c4009
    ADD_MEM (bpregs[i], sizeof (bpregs[0]) - 1);
Packit 6c4009
Packit 6c4009
  ADD_STRING ("\n\n IP:   ");
Packit 6c4009
  ADD_MEM (spregs[0], sizeof (spregs[0]));
Packit 6c4009
  ADD_STRING (" RSC:  ");
Packit 6c4009
  ADD_MEM (spregs[1], sizeof (spregs[0]));
Packit 6c4009
  ADD_STRING (" PR:   ");
Packit 6c4009
  ADD_MEM (spregs[2], sizeof (spregs[0]));
Packit 6c4009
  ADD_STRING ("\n PFS:  ");
Packit 6c4009
  ADD_MEM (spregs[3], sizeof (spregs[0]));
Packit 6c4009
  ADD_STRING (" UNAT: ");
Packit 6c4009
  ADD_MEM (spregs[4], sizeof (spregs[0]));
Packit 6c4009
  ADD_STRING (" CFM:  ");
Packit 6c4009
  ADD_MEM (spregs[5], sizeof (spregs[0]));
Packit 6c4009
  ADD_STRING ("\n CCV:  ");
Packit 6c4009
  ADD_MEM (spregs[6], sizeof (spregs[0]));
Packit 6c4009
  ADD_STRING (" FPSR: ");
Packit 6c4009
  ADD_MEM (spregs[7], sizeof (spregs[0]));
Packit 6c4009
  ADD_STRING ("\n");
Packit 6c4009
Packit 6c4009
  if (ctx->sc_flags & IA64_SC_FLAG_FPH_VALID)
Packit 6c4009
    {
Packit 6c4009
      ADD_STRING ("\n");
Packit 6c4009
Packit 6c4009
      for (i = 0; i < 128 - 32; ++i)
Packit 6c4009
        ADD_MEM (fpregs[i], sizeof (fpregs[0]) - 1 + (i & 1));
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  /* Write the stuff out.  */
Packit 6c4009
  writev (fd, iov, nr);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
#define REGISTER_DUMP register_dump (fd, ctx)