Update copyright notices with scripts/update-copyrights
[glibc.git] / sysdeps / unix / sysv / linux / s390 / s390-64 / register-dump.h
blob4621863ff0260e3590f1f73efc848404733ce50c
1 /* Dump registers. 64 bit S/390 version.
2 Copyright (C) 2001-2014 Free Software Foundation, Inc.
3 Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
4 This file is part of the GNU C Library.
6 The GNU C Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library; if not, see
18 <http://www.gnu.org/licenses/>. */
20 #include <sys/uio.h>
21 #include <_itoa.h>
23 /* We will print the register dump in this format:
25 GPR0: XXXXXXXXXXXXXXXX GPR1: XXXXXXXXXXXXXXXX
26 GPR2: XXXXXXXXXXXXXXXX GPR3: XXXXXXXXXXXXXXXX
27 GPR4: XXXXXXXXXXXXXXXX GPR5: XXXXXXXXXXXXXXXX
28 GPR6: XXXXXXXXXXXXXXXX GPR7: XXXXXXXXXXXXXXXX
29 GPR8: XXXXXXXXXXXXXXXX GPR9: XXXXXXXXXXXXXXXX
30 GPRA: XXXXXXXXXXXXXXXX GPRB: XXXXXXXXXXXXXXXX
31 GPRC: XXXXXXXXXXXXXXXX GPRD: XXXXXXXXXXXXXXXX
32 GPRE: XXXXXXXXXXXXXXXX GPRF: XXXXXXXXXXXXXXXX
34 PSW.MASK: XXXXXXXXXXXXXXXX PSW.ADDR: XXXXXXXXXXXXXXXX
36 ST(0) XXXX XXXXXXXXXXXXXXXX ST(1) XXXX XXXXXXXXXXXXXXXX
37 ST(2) XXXX XXXXXXXXXXXXXXXX ST(3) XXXX XXXXXXXXXXXXXXXX
38 ST(4) XXXX XXXXXXXXXXXXXXXX ST(5) XXXX XXXXXXXXXXXXXXXX
39 ST(6) XXXX XXXXXXXXXXXXXXXX ST(7) XXXX XXXXXXXXXXXXXXXX
42 static void
43 hexvalue (unsigned long int value, char *buf, size_t len)
45 char *cp = _itoa_word (value, buf + len, 16, 0);
46 while (cp > buf)
47 *--cp = '0';
50 static void
51 register_dump (int fd, struct sigcontext *ctx)
53 char regs[19][16];
54 struct iovec iov[40];
55 size_t nr = 0;
57 #define ADD_STRING(str) \
58 iov[nr].iov_base = (char *) str; \
59 iov[nr].iov_len = strlen (str); \
60 ++nr
61 #define ADD_MEM(str, len) \
62 iov[nr].iov_base = str; \
63 iov[nr].iov_len = len; \
64 ++nr
66 /* Generate strings of register contents. */
67 hexvalue (ctx->sregs->regs.gprs[0], regs[0], 16);
68 hexvalue (ctx->sregs->regs.gprs[1], regs[1], 16);
69 hexvalue (ctx->sregs->regs.gprs[2], regs[2], 16);
70 hexvalue (ctx->sregs->regs.gprs[3], regs[3], 16);
71 hexvalue (ctx->sregs->regs.gprs[4], regs[4], 16);
72 hexvalue (ctx->sregs->regs.gprs[5], regs[5], 16);
73 hexvalue (ctx->sregs->regs.gprs[6], regs[6], 16);
74 hexvalue (ctx->sregs->regs.gprs[7], regs[7], 16);
75 hexvalue (ctx->sregs->regs.gprs[8], regs[8], 16);
76 hexvalue (ctx->sregs->regs.gprs[9], regs[9], 16);
77 hexvalue (ctx->sregs->regs.gprs[10], regs[10], 16);
78 hexvalue (ctx->sregs->regs.gprs[11], regs[11], 16);
79 hexvalue (ctx->sregs->regs.gprs[12], regs[12], 16);
80 hexvalue (ctx->sregs->regs.gprs[13], regs[13], 16);
81 hexvalue (ctx->sregs->regs.gprs[14], regs[14], 16);
82 hexvalue (ctx->sregs->regs.gprs[15], regs[15], 16);
83 hexvalue (ctx->sregs->regs.psw.mask, regs[16], 16);
84 hexvalue (ctx->sregs->regs.psw.addr, regs[17], 16);
86 /* Generate the output. */
87 ADD_STRING ("Register dump:\n\n GPR0: ");
88 ADD_MEM (regs[0], 16);
89 ADD_STRING (" GPR1: ");
90 ADD_MEM (regs[1], 16);
91 ADD_STRING (" GPR2: ");
92 ADD_MEM (regs[2], 16);
93 ADD_STRING (" GPR3: ");
94 ADD_MEM (regs[3], 16);
95 ADD_STRING ("\n GPR4: ");
96 ADD_MEM (regs[4], 16);
97 ADD_STRING (" GPR5: ");
98 ADD_MEM (regs[5], 16);
99 ADD_STRING (" GPR6: ");
100 ADD_MEM (regs[6], 16);
101 ADD_STRING (" GPR7: ");
102 ADD_MEM (regs[7], 16);
103 ADD_STRING ("\n GPR8: ");
104 ADD_MEM (regs[8], 16);
105 ADD_STRING (" GPR9: ");
106 ADD_MEM (regs[9], 16);
107 ADD_STRING (" GPRA: ");
108 ADD_MEM (regs[10], 16);
109 ADD_STRING (" GPRB: ");
110 ADD_MEM (regs[11], 16);
111 ADD_STRING ("\n GPRC: ");
112 ADD_MEM (regs[12], 16);
113 ADD_STRING (" GPRD: ");
114 ADD_MEM (regs[13], 16);
115 ADD_STRING (" GPRE: ");
116 ADD_MEM (regs[14], 16);
117 ADD_STRING (" GPRF: ");
118 ADD_MEM (regs[15], 16);
119 ADD_STRING ("\n\n PSW.MASK: ");
120 ADD_MEM (regs[16], 16);
121 ADD_STRING (" PSW.ADDR: ");
122 ADD_MEM (regs[17], 16);
123 ADD_STRING (" TRAP: ");
124 ADD_MEM (regs[18], 4);
125 ADD_STRING ("\n");
127 /* Write the stuff out. */
128 writev (fd, iov, nr);
132 #define REGISTER_DUMP register_dump (fd, ctx)