• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
ppc_register_info(Ebl * ebl,int regno,char * name,size_t namelen,const char ** prefix,const char ** setname,int * bits,int * type)40  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    if (name == NULL)
46      return 1156;
47  
48    if (regno < 0 || regno > 1155 || namelen < 8)
49      return -1;
50  
51    *prefix = "";
52    *bits = ebl->machine == EM_PPC64 ? 64 : 32;
53    *type = (regno < 32 ? DW_ATE_signed
54  	   : regno < 64 ? DW_ATE_float : DW_ATE_unsigned);
55  
56    if (regno < 32 || regno == 64 || regno == 66)
57      *setname = "integer";
58    else if (regno < 64 || regno == 65)
59      {
60        *setname = "FPU";
61        if (ebl->machine != EM_PPC64 && regno < 64)
62  	*bits = 64;
63      }
64    else if (regno == 67 || regno == 356 || regno == 612 || regno >= 1124)
65      {
66        *setname = "vector";
67        *bits = regno >= 1124 ? 128 : 32;
68      }
69    else
70      *setname = "privileged";
71  
72    switch (regno)
73      {
74      case 0 ... 9:
75        name[0] = 'r';
76        name[1] = regno + '0';
77        namelen = 2;
78        break;
79  
80      case 10 ... 31:
81        name[0] = 'r';
82        name[1] = regno / 10 + '0';
83        name[2] = regno % 10 + '0';
84        namelen = 3;
85        break;
86  
87      case 32 + 0 ... 32 + 9:
88        name[0] = 'f';
89        name[1] = (regno - 32) + '0';
90        namelen = 2;
91        break;
92  
93      case 32 + 10 ... 32 + 31:
94        name[0] = 'f';
95        name[1] = (regno - 32) / 10 + '0';
96        name[2] = (regno - 32) % 10 + '0';
97        namelen = 3;
98        break;
99  
100      case 64:
101        return stpcpy (name, "cr") + 1 - name;
102      case 65:
103        return stpcpy (name, "fpscr") + 1 - name;
104      case 66:
105        return stpcpy (name, "msr") + 1 - name;
106      case 67:			/* XXX unofficial assignment */
107        return stpcpy (name, "vscr") + 1 - name;
108  
109      case 70 + 0 ... 70 + 9:
110        name[0] = 's';
111        name[1] = 'r';
112        name[2] = (regno - 70) + '0';
113        namelen = 3;
114        break;
115  
116      case 70 + 10 ... 70 + 15:
117        name[0] = 's';
118        name[1] = 'r';
119        name[2] = (regno - 70) / 10 + '0';
120        name[3] = (regno - 70) % 10 + '0';
121        namelen = 4;
122        break;
123  
124      case 101:
125        return stpcpy (name, "xer") + 1 - name;
126      case 108:
127        return stpcpy (name, "lr") + 1 - name;
128      case 109:
129        return stpcpy (name, "ctr") + 1 - name;
130      case 118:
131        return stpcpy (name, "dsisr") + 1 - name;
132      case 119:
133        return stpcpy (name, "dar") + 1 - name;
134      case 122:
135        return stpcpy (name, "dec") + 1 - name;
136      case 356:
137        return stpcpy (name, "vrsave") + 1 - name;
138      case 612:
139        return stpcpy (name, "spefscr") + 1 - name;
140      case 100:
141        if (*bits == 32)
142  	return stpcpy (name, "mq") + 1 - name;
143  
144      case 102 ... 107:
145        name[0] = 's';
146        name[1] = 'p';
147        name[2] = 'r';
148        name[3] = (regno - 100) + '0';
149        namelen = 4;
150        break;
151  
152      case 110 ... 117:
153      case 120 ... 121:
154      case 123 ... 199:
155        name[0] = 's';
156        name[1] = 'p';
157        name[2] = 'r';
158        name[3] = (regno - 100) / 10 + '0';
159        name[4] = (regno - 100) % 10 + '0';
160        namelen = 5;
161        break;
162  
163      case 200 ... 355:
164      case 357 ... 611:
165      case 613 ... 999:
166        name[0] = 's';
167        name[1] = 'p';
168        name[2] = 'r';
169        name[3] = (regno - 100) / 100 + '0';
170        name[4] = ((regno - 100) % 100 / 10) + '0';
171        name[5] = (regno - 100) % 10 + '0';
172        namelen = 6;
173        break;
174  
175      case 1124 + 0 ... 1124 + 9:
176        name[0] = 'v';
177        name[1] = 'r';
178        name[2] = (regno - 1124) + '0';
179        namelen = 3;
180        break;
181  
182      case 1124 + 10 ... 1124 + 31:
183        name[0] = 'v';
184        name[1] = 'r';
185        name[2] = (regno - 1124) / 10 + '0';
186        name[3] = (regno - 1124) % 10 + '0';
187        namelen = 4;
188        break;
189  
190      default:
191        *setname = NULL;
192        return 0;
193      }
194  
195    name[namelen++] = '\0';
196    return namelen;
197  }
198  
199  __typeof (ppc_register_info)
200       ppc64_register_info __attribute__ ((alias ("ppc_register_info")));
201