]> git.ipfire.org Git - thirdparty/glibc.git/blob - sysdeps/unix/sysv/linux/riscv/register-dump.h
Update copyright dates with scripts/update-copyrights
[thirdparty/glibc.git] / sysdeps / unix / sysv / linux / riscv / register-dump.h
1 /* Dump registers.
2 Copyright (C) 2000-2022 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
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 <https://www.gnu.org/licenses/>. */
18
19 #include <unistd.h>
20 #include <string.h>
21 #include <_itoa.h>
22
23 static void
24 hexvalue (unsigned long int value, char *buf, size_t len)
25 {
26 char *cp = _itoa_word (value, buf + len, 16, 0);
27 while (cp > buf)
28 *--cp = '0';
29 }
30
31 #define REGDUMP_NREGS 32
32 #define REGDUMP_PER_LINE (80 / (__WORDSIZE / 4 + 4))
33
34 static void
35 register_dump (int fd, ucontext_t *ctx)
36 {
37 int i;
38 char regvalue[__WORDSIZE / 4 + 1];
39 char str[82 * ((REGDUMP_NREGS + REGDUMP_PER_LINE - 1) / REGDUMP_PER_LINE)];
40
41 static const char names[REGDUMP_NREGS][4] = {
42 "pc", "ra", "sp", "gp", "tp", "t0", "t1", "t2",
43 "s0", "s1", "a0", "a1", "a2", "a3", "a4", "a5",
44 "a6", "a7", "s2", "s3", "s4", "s5", "s6", "s7",
45 "s8", "s9", "sA", "sB", "t3", "t4", "t5", "t6"
46 };
47
48 str[0] = 0;
49 for (i = 0; i < REGDUMP_NREGS; i++)
50 {
51 strcat (str, names[i]);
52 strcat (str, " ");
53 hexvalue (ctx->uc_mcontext.__gregs[i], regvalue, __WORDSIZE / 4);
54 strcat (str, regvalue);
55
56 if ((i + 1) % REGDUMP_PER_LINE == 0)
57 strcat (str, "\n");
58 }
59
60 write (fd, str, strlen (str));
61 }
62
63 #define REGISTER_DUMP register_dump (fd, ctx)