]>
Commit | Line | Data |
---|---|---|
ede08404 | 1 | /* Dump registers. |
f7a9f785 | 2 | Copyright (C) 2000-2016 Free Software Foundation, Inc. |
ede08404 AJ |
3 | This file is part of the GNU C Library. |
4 | Contributed by Andreas Jaeger <aj@suse.de>, 2000. | |
5 | ||
6 | The GNU C Library is free software; you can redistribute it and/or | |
3214b89b AJ |
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. | |
ede08404 AJ |
10 | |
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 | |
3214b89b | 14 | Lesser General Public License for more details. |
ede08404 | 15 | |
3214b89b | 16 | You should have received a copy of the GNU Lesser General Public |
ab84e3ff PE |
17 | License along with the GNU C Library. If not, see |
18 | <http://www.gnu.org/licenses/>. */ | |
ede08404 | 19 | |
1672585f | 20 | #include <sgidefs.h> |
ede08404 | 21 | #include <sys/uio.h> |
1422b9df | 22 | #include <_itoa.h> |
ede08404 | 23 | |
1672585f JM |
24 | #if _MIPS_SIM == _ABIO32 |
25 | # define CTX_TYPE struct sigcontext * | |
26 | # define CTX_REG(ctx, i) ((ctx)->sc_regs[(i)]) | |
27 | # define CTX_PC(ctx) ((ctx)->sc_pc) | |
28 | # define CTX_MDHI(ctx) ((ctx)->sc_mdhi) | |
29 | # define CTX_MDLO(ctx) ((ctx)->sc_mdlo) | |
30 | # define REG_HEX_SIZE 8 | |
31 | #else | |
32 | # define CTX_TYPE ucontext_t * | |
33 | # define CTX_REG(ctx, i) ((ctx)->uc_mcontext.gregs[(i)]) | |
34 | # define CTX_PC(ctx) ((ctx)->uc_mcontext.pc) | |
35 | # define CTX_MDHI(ctx) ((ctx)->uc_mcontext.mdhi) | |
36 | # define CTX_MDLO(ctx) ((ctx)->uc_mcontext.mdhi) | |
37 | # define REG_HEX_SIZE 16 | |
38 | #endif | |
39 | ||
ede08404 AJ |
40 | /* We will print the register dump in this format: |
41 | ||
42 | R0 XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX | |
43 | R8 XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX | |
44 | R16 XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX | |
45 | R24 XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX | |
42e36d16 DJ |
46 | pc lo hi |
47 | XXXXXXXX XXXXXXXX XXXXXXXX | |
ede08404 AJ |
48 | The FPU registers will not be printed. |
49 | */ | |
50 | ||
51 | static void | |
1672585f | 52 | hexvalue (_ITOA_WORD_TYPE value, char *buf, size_t len) |
ede08404 AJ |
53 | { |
54 | char *cp = _itoa_word (value, buf + len, 16, 0); | |
55 | while (cp > buf) | |
56 | *--cp = '0'; | |
57 | } | |
58 | ||
59 | static void | |
1672585f | 60 | register_dump (int fd, CTX_TYPE ctx) |
ede08404 | 61 | { |
1672585f | 62 | char regs[38][REG_HEX_SIZE]; |
d6749b4a | 63 | struct iovec iov[38 * 2 + 10]; |
ede08404 AJ |
64 | size_t nr = 0; |
65 | int i; | |
66 | ||
67 | #define ADD_STRING(str) \ | |
68 | iov[nr].iov_base = (char *) str; \ | |
69 | iov[nr].iov_len = strlen (str); \ | |
70 | ++nr | |
71 | #define ADD_MEM(str, len) \ | |
72 | iov[nr].iov_base = str; \ | |
73 | iov[nr].iov_len = len; \ | |
74 | ++nr | |
75 | ||
76 | /* Generate strings of register contents. */ | |
d6749b4a | 77 | for (i = 0; i < 32; i++) |
1672585f JM |
78 | hexvalue (CTX_REG (ctx, i), regs[i], REG_HEX_SIZE); |
79 | hexvalue (CTX_PC (ctx), regs[32], REG_HEX_SIZE); | |
80 | hexvalue (CTX_MDHI (ctx), regs[33], REG_HEX_SIZE); | |
81 | hexvalue (CTX_MDLO (ctx), regs[34], REG_HEX_SIZE); | |
ede08404 AJ |
82 | |
83 | /* Generate the output. */ | |
84 | ADD_STRING ("Register dump:\n\n R0 "); | |
85 | for (i = 0; i < 8; i++) | |
86 | { | |
1672585f | 87 | ADD_MEM (regs[i], REG_HEX_SIZE); |
ff75a64c | 88 | ADD_STRING (" "); |
ede08404 AJ |
89 | } |
90 | ADD_STRING ("\n R8 "); | |
91 | for (i = 8; i < 16; i++) | |
92 | { | |
1672585f | 93 | ADD_MEM (regs[i], REG_HEX_SIZE); |
ff75a64c | 94 | ADD_STRING (" "); |
ede08404 AJ |
95 | } |
96 | ADD_STRING ("\n R16 "); | |
97 | for (i = 16; i < 24; i++) | |
98 | { | |
1672585f | 99 | ADD_MEM (regs[i], REG_HEX_SIZE); |
ff75a64c | 100 | ADD_STRING (" "); |
ede08404 AJ |
101 | } |
102 | ADD_STRING ("\n R24 "); | |
103 | for (i = 24; i < 32; i++) | |
104 | { | |
1672585f | 105 | ADD_MEM (regs[i], REG_HEX_SIZE); |
ff75a64c | 106 | ADD_STRING (" "); |
ede08404 | 107 | } |
42e36d16 DJ |
108 | ADD_STRING ("\n pc lo hi\n "); |
109 | for (i = 32; i < 35; i++) | |
ede08404 | 110 | { |
1672585f | 111 | ADD_MEM (regs[i], REG_HEX_SIZE); |
ff75a64c | 112 | ADD_STRING (" "); |
ede08404 | 113 | } |
ff75a64c | 114 | ADD_STRING ("\n"); |
ede08404 AJ |
115 | |
116 | /* Write the stuff out. */ | |
117 | writev (fd, iov, nr); | |
118 | } | |
119 | ||
120 | ||
722a9309 | 121 | #define REGISTER_DUMP register_dump (fd, ctx) |