Update copyright notices with scripts/update-copyrights
[glibc.git] / ports / sysdeps / unix / sysv / linux / tile / tilegx / register-dump.h
blob2c629c5dc3d8d9b075e332c5ec624d5b954b2608
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.
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.
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.
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/>. */
19 #include <sys/uio.h>
20 #include <_itoa.h>
22 /* We will print the register dump in this format:
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
40 PC: XXXXXXXXXXXXXXXX ICS: X FAULTNUM: XX
44 static void
45 hexvalue (unsigned long int value, char *buf, size_t len)
47 char *cp = _itoa_word (value, buf + len, 16, 0);
48 while (cp > buf)
49 *--cp = '0';
52 static void
53 register_dump (int fd, mcontext_t *ctx)
55 char regs[59][16];
56 struct iovec iov[132];
57 size_t nr = 0;
58 unsigned int i;
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
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);
76 /* Generate the output. */
77 for (i = 0; i < 56;)
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: "
94 ADD_STRING (prefixes[i / 4]);
97 ADD_MEM (regs[i], 16);
98 ADD_STRING (" ");
100 while (++i % 4);
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");
118 /* Write the stuff out. */
119 writev (fd, iov, nr);
123 #define REGISTER_DUMP register_dump (fd, &ctx->uc_mcontext)