Line data Source code
1 : /* Register names and numbers for PowerPC DWARF.
2 : Copyright (C) 2005, 2006, 2007 Red Hat, Inc.
3 : This file is part of elfutils.
4 :
5 : This file is free software; you can redistribute it and/or modify
6 : it under the terms of either
7 :
8 : * the GNU Lesser General Public License as published by the Free
9 : Software Foundation; either version 3 of the License, or (at
10 : your option) any later version
11 :
12 : or
13 :
14 : * the GNU General Public License as published by the Free
15 : Software Foundation; either version 2 of the License, or (at
16 : your option) any later version
17 :
18 : or both in parallel, as here.
19 :
20 : elfutils is distributed in the hope that it will be useful, but
21 : WITHOUT ANY WARRANTY; without even the implied warranty of
22 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 : General Public License for more details.
24 :
25 : You should have received copies of the GNU General Public License and
26 : the GNU Lesser General Public License along with this program. If
27 : not, see <http://www.gnu.org/licenses/>. */
28 :
29 : #ifdef HAVE_CONFIG_H
30 : # include <config.h>
31 : #endif
32 :
33 : #include <string.h>
34 : #include <dwarf.h>
35 :
36 : #define BACKEND ppc_
37 : #include "libebl_CPU.h"
38 :
39 : ssize_t
40 5815 : ppc_register_info (Ebl *ebl __attribute__ ((unused)),
41 : int regno, char *name, size_t namelen,
42 : const char **prefix, const char **setname,
43 : int *bits, int *type)
44 : {
45 5815 : if (name == NULL)
46 : return 1156;
47 :
48 5810 : if (regno < 0 || regno > 1155 || namelen < 8)
49 : return -1;
50 :
51 5810 : *prefix = "";
52 5810 : *bits = ebl->machine == EM_PPC64 ? 64 : 32;
53 11620 : *type = (regno < 32 ? DW_ATE_signed
54 5810 : : regno < 64 ? DW_ATE_float : DW_ATE_unsigned);
55 :
56 5810 : if (regno < 32 || regno == 64 || regno == 66)
57 196 : *setname = "integer";
58 5614 : else if (regno < 64 || regno == 65)
59 : {
60 169 : *setname = "FPU";
61 169 : if (ebl->machine != EM_PPC64 && regno < 64)
62 96 : *bits = 64;
63 : }
64 5445 : else if (regno == 67 || regno == 356 || regno == 612 || regno >= 1124)
65 : {
66 175 : *setname = "vector";
67 190 : *bits = regno >= 1124 ? 128 : 32;
68 : }
69 : else
70 5270 : *setname = "privileged";
71 :
72 5810 : switch (regno)
73 : {
74 64 : case 0 ... 9:
75 64 : name[0] = 'r';
76 64 : name[1] = regno + '0';
77 64 : namelen = 2;
78 64 : break;
79 :
80 122 : case 10 ... 31:
81 122 : name[0] = 'r';
82 122 : name[1] = regno / 10 + '0';
83 122 : name[2] = regno % 10 + '0';
84 122 : namelen = 3;
85 122 : break;
86 :
87 50 : case 32 + 0 ... 32 + 9:
88 50 : name[0] = 'f';
89 50 : name[1] = (regno - 32) + '0';
90 50 : namelen = 2;
91 50 : break;
92 :
93 110 : case 32 + 10 ... 32 + 31:
94 110 : name[0] = 'f';
95 110 : name[1] = (regno - 32) / 10 + '0';
96 110 : name[2] = (regno - 32) % 10 + '0';
97 110 : namelen = 3;
98 110 : break;
99 :
100 : case 64:
101 10 : return stpcpy (name, "cr") + 1 - name;
102 : case 65:
103 18 : return stpcpy (name, "fpscr") + 1 - name;
104 : case 66:
105 10 : return stpcpy (name, "msr") + 1 - name;
106 : case 67: /* XXX unofficial assignment */
107 10 : return stpcpy (name, "vscr") + 1 - name;
108 :
109 50 : case 70 + 0 ... 70 + 9:
110 50 : name[0] = 's';
111 50 : name[1] = 'r';
112 50 : name[2] = (regno - 70) + '0';
113 50 : namelen = 3;
114 50 : break;
115 :
116 30 : case 70 + 10 ... 70 + 15:
117 30 : name[0] = 's';
118 30 : name[1] = 'r';
119 30 : name[2] = (regno - 70) / 10 + '0';
120 30 : name[3] = (regno - 70) % 10 + '0';
121 30 : namelen = 4;
122 30 : break;
123 :
124 : case 101:
125 10 : return stpcpy (name, "xer") + 1 - name;
126 : case 108:
127 10 : return stpcpy (name, "lr") + 1 - name;
128 : case 109:
129 10 : return stpcpy (name, "ctr") + 1 - name;
130 : case 118:
131 10 : return stpcpy (name, "dsisr") + 1 - name;
132 : case 119:
133 10 : return stpcpy (name, "dar") + 1 - name;
134 : case 122:
135 10 : return stpcpy (name, "dec") + 1 - name;
136 : case 356:
137 10 : return stpcpy (name, "vrsave") + 1 - name;
138 : case 612:
139 10 : return stpcpy (name, "spefscr") + 1 - name;
140 5 : case 100:
141 5 : if (*bits == 32)
142 6 : return stpcpy (name, "mq") + 1 - name;
143 32 : FALLTHROUGH;
144 : case 102 ... 107:
145 32 : name[0] = 's';
146 32 : name[1] = 'p';
147 32 : name[2] = 'r';
148 32 : name[3] = (regno - 100) + '0';
149 32 : namelen = 4;
150 32 : break;
151 :
152 : case 114:
153 10 : return stpcpy (name, "tfhar") + 1 - name;
154 : case 115:
155 10 : return stpcpy (name, "tfiar") + 1 - name;
156 : case 116:
157 10 : return stpcpy (name, "texasr") + 1 - name;
158 :
159 420 : case 110 ... 113:
160 : case 117:
161 : case 120 ... 121:
162 : case 123 ... 199:
163 420 : name[0] = 's';
164 420 : name[1] = 'p';
165 420 : name[2] = 'r';
166 420 : name[3] = (regno - 100) / 10 + '0';
167 420 : name[4] = (regno - 100) % 10 + '0';
168 420 : namelen = 5;
169 420 : break;
170 :
171 3990 : case 200 ... 355:
172 : case 357 ... 611:
173 : case 613 ... 999:
174 3990 : name[0] = 's';
175 3990 : name[1] = 'p';
176 3990 : name[2] = 'r';
177 3990 : name[3] = (regno - 100) / 100 + '0';
178 3990 : name[4] = ((regno - 100) % 100 / 10) + '0';
179 3990 : name[5] = (regno - 100) % 10 + '0';
180 3990 : namelen = 6;
181 3990 : break;
182 :
183 50 : case 1124 + 0 ... 1124 + 9:
184 50 : name[0] = 'v';
185 50 : name[1] = 'r';
186 50 : name[2] = (regno - 1124) + '0';
187 50 : namelen = 3;
188 50 : break;
189 :
190 110 : case 1124 + 10 ... 1124 + 31:
191 110 : name[0] = 'v';
192 110 : name[1] = 'r';
193 110 : name[2] = (regno - 1124) / 10 + '0';
194 110 : name[3] = (regno - 1124) % 10 + '0';
195 110 : namelen = 4;
196 110 : break;
197 :
198 700 : default:
199 700 : *setname = NULL;
200 700 : return 0;
201 : }
202 :
203 5028 : name[namelen++] = '\0';
204 5028 : return namelen;
205 : }
206 :
207 : __typeof (ppc_register_info)
208 : ppc64_register_info __attribute__ ((alias ("ppc_register_info")));
|