2c629c5dc3d8d9b075e332c5ec624d5b954b2608
[jlayton/glibc.git] / ports / sysdeps / unix / sysv / linux / tile / tilegx / register-dump.h
1 /* Copyright (C) 2011-2014 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library.  If not, see
17    <http://www.gnu.org/licenses/>.  */
18
19 #include <sys/uio.h>
20 #include <_itoa.h>
21
22 /* We will print the register dump in this format:
23
24  R0:  XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
25  R4:  XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
26  R8:  XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
27  R12: XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
28  R16: XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
29  R20: XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
30  R24: XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
31  R28: XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
32  R32: XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
33  R36: XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
34  R40: XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
35  R44: XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
36  R48: XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
37  R52: XXXXXXXXXXXXXXXX  TP: XXXXXXXXXXXXXXXX
38  SP:  XXXXXXXXXXXXXXXX  LR: XXXXXXXXXXXXXXXX
39
40  PC:  XXXXXXXXXXXXXXXX  ICS: X  FAULTNUM: XX
41
42  */
43
44 static void
45 hexvalue (unsigned long int value, char *buf, size_t len)
46 {
47   char *cp = _itoa_word (value, buf + len, 16, 0);
48   while (cp > buf)
49     *--cp = '0';
50 }
51
52 static void
53 register_dump (int fd, mcontext_t *ctx)
54 {
55   char regs[59][16];
56   struct iovec iov[132];
57   size_t nr = 0;
58   unsigned int i;
59
60 #define ADD_STRING(str) \
61   iov[nr].iov_base = (char *) str;                                            \
62   iov[nr].iov_len = strlen (str);                                             \
63   ++nr
64 #define ADD_MEM(str, len) \
65   iov[nr].iov_base = str;                                                     \
66   iov[nr].iov_len = len;                                                      \
67   ++nr
68
69   /* Generate strings of register contents.  */
70   for (i = 0; i < 56; ++i)
71     hexvalue (ctx->gregs[i], regs[i], 16);
72   hexvalue (ctx->pc, regs[56], 16);
73   hexvalue (ctx->ics, regs[57], 1);
74   hexvalue (ctx->faultnum, regs[58], 2);
75
76   /* Generate the output.  */
77   for (i = 0; i < 56;)
78     {
79       const char *prefixes[] = {
80         "Register dump:\n\n R0:  ",
81         "\n R4:  ",
82         "\n R8:  ",
83         "\n R12: ",
84         "\n R16: ",
85         "\n R20:  ",
86         "\n R24:  ",
87         "\n R28:  ",
88         "\n R32:  ",
89         "\n R36:  ",
90         "\n R40:  ",
91         "\n R44:  ",
92         "\n R48:  "
93       };
94       ADD_STRING (prefixes[i / 4]);
95       do
96         {
97           ADD_MEM (regs[i], 16);
98           ADD_STRING (" ");
99         }
100       while (++i % 4);
101     }
102   ADD_STRING ("\n R52: ");
103   ADD_MEM (regs[52], 16);
104   ADD_STRING ("  TP: ");
105   ADD_MEM (regs[53], 16);
106   ADD_STRING ("\n SP: ");
107   ADD_MEM (regs[54], 16);
108   ADD_STRING ("  LR: ");
109   ADD_MEM (regs[55], 16);
110   ADD_STRING ("\n\n PC:  ");
111   ADD_MEM (regs[56], 16);
112   ADD_STRING ("  ICS: ");
113   ADD_MEM (regs[57], 1);
114   ADD_STRING ("  FAULTNUM: ");
115   ADD_MEM (regs[58], 2);
116   ADD_STRING ("\n");
117
118   /* Write the stuff out.  */
119   writev (fd, iov, nr);
120 }
121
122
123 #define REGISTER_DUMP register_dump (fd, &ctx->uc_mcontext)