• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Register names and numbers for x86-64 DWARF.
2    Copyright (C) 2005, 2006, 2007 Red Hat, Inc.
3    This file is part of Red Hat elfutils.
4 
5    Red Hat elfutils is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by the
7    Free Software Foundation; version 2 of the License.
8 
9    Red Hat elfutils is distributed in the hope that it will be useful, but
10    WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    General Public License for more details.
13 
14    You should have received a copy of the GNU General Public License along
15    with Red Hat elfutils; if not, write to the Free Software Foundation,
16    Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
17 
18    Red Hat elfutils is an included package of the Open Invention Network.
19    An included package of the Open Invention Network is a package for which
20    Open Invention Network licensees cross-license their patents.  No patent
21    license is granted, either expressly or impliedly, by designation as an
22    included package.  Should you wish to participate in the Open Invention
23    Network licensing program, please visit www.openinventionnetwork.com
24    <http://www.openinventionnetwork.com>.  */
25 
26 #ifdef HAVE_CONFIG_H
27 # include <config.h>
28 #endif
29 
30 #include <assert.h>
31 #include <dwarf.h>
32 #include <string.h>
33 
34 #define BACKEND x86_64_
35 #include "libebl_CPU.h"
36 
37 ssize_t
x86_64_register_info(Ebl * ebl,int regno,char * name,size_t namelen,const char ** prefix,const char ** setname,int * bits,int * type)38 x86_64_register_info (Ebl *ebl __attribute__ ((unused)),
39 		      int regno, char *name, size_t namelen,
40 		      const char **prefix, const char **setname,
41 		      int *bits, int *type)
42 {
43   if (name == NULL)
44     return 67;
45 
46   if (regno < 0 || regno > 66 || namelen < 7)
47     return -1;
48 
49   *prefix = "%";
50   *bits = 64;
51   *type = DW_ATE_unsigned;
52   if (regno < 17)
53     {
54       *setname = "integer";
55       *type = DW_ATE_signed;
56     }
57   else if (regno < 33)
58     {
59       *setname = "SSE";
60       *bits = 128;
61     }
62   else if (regno < 41)
63     {
64       *setname = "x87";
65       *type = DW_ATE_float;
66       *bits = 80;
67     }
68   else if (regno < 49)
69     *setname = "MMX";
70   else if (regno > 49 && regno < 60)
71     {
72       *setname = "segment";
73       *bits = 16;
74     }
75   else
76     *setname = "control";
77 
78   switch (regno)
79     {
80       static const char baseregs[][2] =
81 	{
82 	  "ax", "dx", "cx", "bx", "si", "di", "bp", "sp"
83 	};
84 
85     case 6 ... 7:
86       *type = DW_ATE_address;
87     case 0 ... 5:
88       name[0] = 'r';
89       name[1] = baseregs[regno][0];
90       name[2] = baseregs[regno][1];
91       namelen = 3;
92       break;
93 
94     case 8 ... 9:
95       name[0] = 'r';
96       name[1] = regno - 8 + '8';
97       namelen = 2;
98       break;
99 
100     case 10 ... 15:
101       name[0] = 'r';
102       name[1] = '1';
103       name[2] = regno - 10 + '0';
104       namelen = 3;
105       break;
106 
107     case 16:
108       *type = DW_ATE_address;
109       name[0] = 'r';
110       name[1] = 'i';
111       name[2] = 'p';
112       namelen = 3;
113       break;
114 
115     case 17 ... 26:
116       name[0] = 'x';
117       name[1] = 'm';
118       name[2] = 'm';
119       name[3] = regno - 17 + '0';
120       namelen = 4;
121       break;
122 
123     case 27 ... 32:
124       name[0] = 'x';
125       name[1] = 'm';
126       name[2] = 'm';
127       name[3] = '1';
128       name[4] = regno - 27 + '0';
129       namelen = 5;
130       break;
131 
132     case 33 ... 40:
133       name[0] = 's';
134       name[1] = 't';
135       name[2] = regno - 33 + '0';
136       namelen = 3;
137       break;
138 
139     case 41 ... 48:
140       name[0] = 'm';
141       name[1] = 'm';
142       name[2] = regno - 41 + '0';
143       namelen = 3;
144       break;
145 
146     case 50 ... 55:
147       name[0] = "ecsdfg"[regno - 50];
148       name[1] = 's';
149       namelen = 2;
150       break;
151 
152     case 58 ... 59:
153       *type = DW_ATE_address;
154       *bits = 64;
155       name[0] = regno - 58 + 'f';
156       return stpcpy (&name[1], "s.base") + 1 - name;
157 
158     case 49:
159       *setname = "integer";
160       return stpcpy (name, "rflags") + 1 - name;
161     case 62:
162       return stpcpy (name, "tr") + 1 - name;
163     case 63:
164       return stpcpy (name, "ldtr") + 1 - name;
165     case 64:
166       return stpcpy (name, "mxcsr") + 1 - name;
167 
168     case 65 ... 66:
169       *bits = 16;
170       name[0] = 'f';
171       name[1] = "cs"[regno - 65];
172       name[2] = 'w';
173       namelen = 3;
174       break;
175 
176     default:
177       return 0;
178     }
179 
180   name[namelen++] = '\0';
181   return namelen;
182 }
183