Line data Source code
1 : /* Register names and numbers for i386 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 i386_
37 : #include "libebl_CPU.h"
38 :
39 : ssize_t
40 230 : i386_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 230 : if (name == NULL)
46 : return 46;
47 :
48 226 : if (regno < 0 || regno > 45 || namelen < 6)
49 : return -1;
50 :
51 226 : *prefix = "%";
52 226 : *bits = 32;
53 226 : *type = DW_ATE_unsigned;
54 226 : if (regno < 11)
55 : {
56 109 : *setname = "integer";
57 109 : if (regno < 9)
58 101 : *type = DW_ATE_signed;
59 : }
60 117 : else if (regno < 19)
61 : {
62 24 : *setname = "x87";
63 24 : *type = DW_ATE_float;
64 24 : *bits = 80;
65 : }
66 93 : else if (regno < 29)
67 : {
68 30 : *setname = "SSE";
69 30 : *bits = 128;
70 : }
71 63 : else if (regno < 37)
72 : {
73 24 : *setname = "MMX";
74 24 : *bits = 64;
75 : }
76 39 : else if (regno < 40)
77 9 : *setname = "FPU-control";
78 : else
79 : {
80 30 : *setname = "segment";
81 30 : *bits = 16;
82 : }
83 :
84 226 : switch (regno)
85 : {
86 59 : static const char baseregs[][2] =
87 : {
88 : "ax", "cx", "dx", "bx", "sp", "bp", "si", "di", "ip"
89 : };
90 :
91 59 : case 4:
92 : case 5:
93 : case 8:
94 59 : *type = DW_ATE_address;
95 101 : FALLTHROUGH;
96 101 : case 0 ... 3:
97 : case 6 ... 7:
98 101 : name[0] = 'e';
99 101 : name[1] = baseregs[regno][0];
100 101 : name[2] = baseregs[regno][1];
101 101 : namelen = 3;
102 101 : break;
103 :
104 : case 9:
105 10 : return stpcpy (name, "eflags") + 1 - name;
106 : case 10:
107 6 : return stpcpy (name, "trapno") + 1 - name;
108 :
109 24 : case 11 ... 18:
110 24 : name[0] = 's';
111 24 : name[1] = 't';
112 24 : name[2] = regno - 11 + '0';
113 24 : namelen = 3;
114 24 : break;
115 :
116 24 : case 21 ... 28:
117 24 : name[0] = 'x';
118 24 : name[1] = 'm';
119 24 : name[2] = 'm';
120 24 : name[3] = regno - 21 + '0';
121 24 : namelen = 4;
122 24 : break;
123 :
124 24 : case 29 ... 36:
125 24 : name[0] = 'm';
126 24 : name[1] = 'm';
127 24 : name[2] = regno - 29 + '0';
128 24 : namelen = 3;
129 24 : break;
130 :
131 3 : case 37:
132 3 : *bits = 16;
133 6 : return stpcpy (name, "fctrl") + 1 - name;
134 3 : case 38:
135 3 : *bits = 16;
136 6 : return stpcpy (name, "fstat") + 1 - name;
137 : case 39:
138 6 : return stpcpy (name, "mxcsr") + 1 - name;
139 :
140 30 : case 40 ... 45:
141 30 : name[0] = "ecsdfg"[regno - 40];
142 30 : name[1] = 's';
143 30 : namelen = 2;
144 30 : break;
145 :
146 6 : default:
147 6 : *setname = NULL;
148 6 : return 0;
149 : }
150 :
151 203 : name[namelen++] = '\0';
152 203 : return namelen;
153 : }
|