Blame sysdeps/powerpc/powerpc64/register-dump.h

Packit 6c4009
/* Dump registers.
Packit 6c4009
   Copyright (C) 1998-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
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 <sys/uio.h>
Packit 6c4009
#include <_itoa.h>
Packit 6c4009
Packit 6c4009
/* This prints out the information in the following form: */
Packit 6c4009
static const char dumpform[] = "\
Packit 6c4009
Register dump:\n\
Packit 6c4009
sr0=000000000000020% sr1=000000000000021% dar=000000000000029% dsi=000002a%\n\
Packit 6c4009
lr=000000000000024%  ctr=000000000000023% gr3*=000000000000022% trap=0000028%\n\
Packit 6c4009
ccr=0000026%  xer=0000025%\n\
Packit 6c4009
gr0-3:   000000000000000% 000000000000001% 000000000000002% 000000000000003%\n\
Packit 6c4009
gr4-7:   000000000000004% 000000000000005% 000000000000006% 000000000000007%\n\
Packit 6c4009
gr8-11:  000000000000008% 000000000000009% 00000000000000a% 00000000000000b%\n\
Packit 6c4009
gr12-15: 00000000000000c% 00000000000000d% 00000000000000e% 00000000000000f%\n\
Packit 6c4009
gr16-19: 000000000000010% 000000000000011% 000000000000012% 000000000000013%\n\
Packit 6c4009
gr20-23: 000000000000014% 000000000000015% 000000000000016% 000000000000017%\n\
Packit 6c4009
gr24-27: 000000000000018% 000000000000019% 00000000000001a% 00000000000001b%\n\
Packit 6c4009
gr28-31: 00000000000001c% 00000000000001d% 00000000000001e% 00000000000001f%\n\
Packit 6c4009
fscr=000000000000050%\n\
Packit 6c4009
fp0-3:   000000000000030% 000000000000031% 000000000000032% 000000000000033%\n\
Packit 6c4009
fp4-7:   000000000000034% 000000000000035% 000000000000036% 000000000000037%\n\
Packit 6c4009
fp8-11:  000000000000038% 000000000000038% 00000000000003a% 00000000000003b%\n\
Packit 6c4009
fp12-15: 00000000000003c% 00000000000003d% 00000000000003e% 00000000000003f%\n\
Packit 6c4009
fp16-19: 000000000000040% 000000000000041% 000000000000042% 000000000000043%\n\
Packit 6c4009
fp20-23: 000000000000044% 000000000000045% 000000000000046% 000000000000047%\n\
Packit 6c4009
fp24-27: 000000000000048% 000000000000049% 00000000000004a% 00000000000004b%\n\
Packit 6c4009
fp28-31: 00000000000004c% 00000000000004d% 00000000000004e% 00000000000004f%\n\
Packit 6c4009
";
Packit 6c4009
Packit 6c4009
/* Most of the fields are self-explanatory.  'sr0' is the next
Packit 6c4009
   instruction to execute, from SRR0, which may have some relationship
Packit 6c4009
   with the instruction that caused the exception.  'r3*' is the value
Packit 6c4009
   that will be returned in register 3 when the current system call
Packit 6c4009
   returns.  'sr1' is SRR1, bits 16-31 of which are copied from the MSR:
Packit 6c4009
Packit 6c4009
   16 - External interrupt enable
Packit 6c4009
   17 - Privilege level (1=user, 0=supervisor)
Packit 6c4009
   18 - FP available
Packit 6c4009
   19 - Machine check enable (if clear, processor locks up on machine check)
Packit 6c4009
   20 - FP exception mode bit 0 (FP exceptions recoverable)
Packit 6c4009
   21 - Single-step trace enable
Packit 6c4009
   22 - Branch trace enable
Packit 6c4009
   23 - FP exception mode bit 1
Packit 6c4009
   25 - exception prefix (if set, exceptions are taken from 0xFFFnnnnn,
Packit 6c4009
        otherwise from 0x000nnnnn).
Packit 6c4009
   26 - Instruction address translation enabled.
Packit 6c4009
   27 - Data address translation enabled.
Packit 6c4009
   30 - Exception is recoverable (otherwise, don't try to return).
Packit 6c4009
   31 - Little-endian mode enable.
Packit 6c4009
Packit 6c4009
   'Trap' is the address of the exception:
Packit 6c4009
Packit 6c4009
   00200 - Machine check exception (memory parity error, for instance)
Packit 6c4009
   00300 - Data access exception (memory not mapped, see dsisr for why)
Packit 6c4009
   00400 - Instruction access exception (memory not mapped)
Packit 6c4009
   00500 - External interrupt
Packit 6c4009
   00600 - Alignment exception (see dsisr for more information)
Packit 6c4009
   00700 - Program exception (illegal/trap instruction, FP exception)
Packit 6c4009
   00800 - FP unavailable (should not be seen by user code)
Packit 6c4009
   00900 - Decrementer exception (for instance, SIGALRM)
Packit 6c4009
   00A00 - I/O controller interface exception
Packit 6c4009
   00C00 - System call exception (for instance, kill(3)).
Packit 6c4009
   00E00 - FP assist exception (optional FP instructions, etc.)
Packit 6c4009
Packit 6c4009
   'dar' is the memory location, for traps 00300, 00400, 00600, 00A00.
Packit 6c4009
   'dsisr' has the following bits under trap 00300:
Packit 6c4009
   0 - direct-store error exception
Packit 6c4009
   1 - no page table entry for page
Packit 6c4009
   4 - memory access not permitted
Packit 6c4009
   5 - trying to access I/O controller space or using lwarx/stwcx on
Packit 6c4009
       non-write-cached memory
Packit 6c4009
   6 - access was store
Packit 6c4009
   9 - data access breakpoint hit
Packit 6c4009
   10 - segment table search failed to find translation (64-bit ppcs only)
Packit 6c4009
   11 - I/O controller instruction not permitted
Packit 6c4009
   For trap 00400, the same bits are set in SRR1 instead.
Packit 6c4009
   For trap 00600, bits 12-31 of the DSISR set to allow emulation of
Packit 6c4009
   the instruction without actually having to read it from memory.
Packit 6c4009
*/
Packit 6c4009
Packit 6c4009
#define xtoi(x) (x >= 'a' ? x + 10 - 'a' : x - '0')
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
register_dump (int fd, struct sigcontext *ctx)
Packit 6c4009
{
Packit 6c4009
  char buffer[sizeof(dumpform)];
Packit 6c4009
  char *bufferpos;
Packit 6c4009
  unsigned regno;
Packit 6c4009
  unsigned long *regs = (unsigned long *)(ctx->regs);
Packit 6c4009
Packit 6c4009
  memcpy(buffer, dumpform, sizeof(dumpform));
Packit 6c4009
Packit 6c4009
  /* Generate the output.  */
Packit 6c4009
  while ((bufferpos = memchr (buffer, '%', sizeof(dumpform))))
Packit 6c4009
    {
Packit 6c4009
      regno = xtoi (bufferpos[-1]) | xtoi (bufferpos[-2]) << 4;
Packit 6c4009
      memset (bufferpos-2, '0', 3);
Packit 6c4009
      _itoa_word (regs[regno], bufferpos+1, 16, 0);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  /* Write the output.  */
Packit 6c4009
  write (fd, buffer, sizeof(buffer) - 1);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
#define REGISTER_DUMP \
Packit 6c4009
  register_dump (fd, ctx)