1 /* Dump registers.
2    Copyright (C) 2000-2021 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
hexvalue(unsigned long int value,char * buf,size_t len)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
register_dump(int fd,ucontext_t * ctx)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)
64