]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - sim/common/hw-handles.c
Update years in copyright notice for the GDB files.
[thirdparty/binutils-gdb.git] / sim / common / hw-handles.c
CommitLineData
b85e4829
AC
1/* The common simulator framework for GDB, the GNU Debugger.
2
8acc9f48 3 Copyright 2002-2013 Free Software Foundation, Inc.
b85e4829
AC
4
5 Contributed by Andrew Cagney and Red Hat.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
4744ac1b 11 the Free Software Foundation; either version 3 of the License, or
b85e4829
AC
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
4744ac1b 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
21
22
23#include "hw-main.h"
24#include "hw-base.h"
25
26
12c4cbd5
MF
27struct hw_handle_mapping
28{
c906108c
SS
29 cell_word external;
30 struct hw *phandle;
31 struct hw_instance *ihandle;
32 struct hw_handle_mapping *next;
33};
34
35
12c4cbd5
MF
36struct hw_handle_data
37{
c906108c
SS
38 int nr_mappings;
39 struct hw_handle_mapping *mappings;
40};
41
42void
43create_hw_handle_data (struct hw *hw)
44{
45 if (hw_parent (hw) == NULL)
46 {
47 hw->handles_of_hw = HW_ZALLOC (hw, struct hw_handle_data);
48 }
49 else
50 {
51 hw->handles_of_hw = hw_root (hw)->handles_of_hw;
52 }
53}
54
55void
56delete_hw_handle_data (struct hw *hw)
57{
58 /* NULL */
59}
60
61
62
63#if 0
64void
65hw_handle_init (struct hw *hw)
66{
67 struct hw_handle_mapping *current_map = db->mappings;
68 if (current_map != NULL)
69 {
70 db->nr_mappings = db->mappings->external;
71 /* verify that the mappings that were not removed are in
72 sequence down to nr 1 */
73 while (current_map->next != NULL)
74 {
75 if (current_map->external != current_map->next->external + 1)
76 error ("hw_handle: hw_handle database possibly corrupt");
77 current_map = current_map->next;
78 }
79 ASSERT (current_map->next == NULL);
80 if (current_map->external != 1)
81 error ("hw_handle: hw_handle database possibly corrupt");
82 }
83 else
84 {
85 db->nr_mappings = 0;
86 }
87}
88#endif
89
90
91struct hw_instance *
92hw_handle_ihandle2 (struct hw *hw,
93 cell_word external)
94{
95 struct hw_handle_data *db = hw->handles_of_hw;
96 struct hw_handle_mapping *current_map = db->mappings;
97 while (current_map != NULL)
98 {
99 if (current_map->external == external)
100 return current_map->ihandle;
101 current_map = current_map->next;
102 }
103 return (void*)0;
104}
105
106
107struct hw *
108hw_handle_phandle2 (struct hw *hw,
109 cell_word external)
110{
111 struct hw_handle_data *db = hw->handles_of_hw;
112 struct hw_handle_mapping *current_map = db->mappings;
113 while (current_map != NULL)
114 {
115 if (current_map->external == external)
116 return current_map->phandle;
117 current_map = current_map->next;
118 }
119 return (void*)0;
120}
121
122
123cell_word
124hw_handle_2ihandle (struct hw *hw,
125 struct hw_instance *internal)
126{
127 struct hw_handle_data *db = hw->handles_of_hw;
128 struct hw_handle_mapping *current_map = db->mappings;
129 while (current_map != NULL)
130 {
131 if (current_map->ihandle == internal)
132 return current_map->external;
133 current_map = current_map->next;
134 }
135 return 0;
136}
137
138
139cell_word
140hw_handle_2phandle (struct hw *hw,
141 struct hw *internal)
142{
143 struct hw_handle_data *db = hw->handles_of_hw;
144 struct hw_handle_mapping *current_map = db->mappings;
145 while (current_map != NULL)
146 {
147 if (current_map->phandle == internal)
148 return current_map->external;
149 current_map = current_map->next;
150 }
151 return 0;
152}
153
154
155void
156hw_handle_add_ihandle (struct hw *hw,
157 struct hw_instance *internal)
158{
159 struct hw_handle_data *db = hw->handles_of_hw;
028f6515 160 if (hw_handle_2ihandle (hw, internal) != 0)
c906108c
SS
161 {
162 hw_abort (hw, "attempting to add an ihandle already in the data base");
163 }
164 else
165 {
166 /* insert at the front making things in decending order */
167 struct hw_handle_mapping *new_map = ZALLOC (struct hw_handle_mapping);
168 new_map->next = db->mappings;
169 new_map->ihandle = internal;
170 db->nr_mappings += 1;
171 new_map->external = db->nr_mappings;
172 db->mappings = new_map;
173 }
174}
175
176
177void
178hw_handle_add_phandle (struct hw *hw,
179 struct hw *internal)
180{
181 struct hw_handle_data *db = hw->handles_of_hw;
028f6515 182 if (hw_handle_2phandle (hw, internal) != 0)
c906108c
SS
183 {
184 hw_abort (hw, "attempting to add a phandle already in the data base");
185 }
186 else
187 {
188 /* insert at the front making things in decending order */
189 struct hw_handle_mapping *new_map = ZALLOC (struct hw_handle_mapping);
190 new_map->next = db->mappings;
191 new_map->phandle = internal;
192 db->nr_mappings += 1;
193 new_map->external = db->nr_mappings;
194 db->mappings = new_map;
195 }
196}
197
198
199void
200hw_handle_remove_ihandle (struct hw *hw,
201 struct hw_instance *internal)
202{
203 struct hw_handle_data *db = hw->handles_of_hw;
204 struct hw_handle_mapping **current_map = &db->mappings;
205 while (*current_map != NULL)
206 {
207 if ((*current_map)->ihandle == internal)
208 {
209 struct hw_handle_mapping *delete = *current_map;
210 *current_map = delete->next;
d79fe0d6 211 free (delete);
c906108c
SS
212 return;
213 }
214 current_map = &(*current_map)->next;
215 }
216 hw_abort (hw, "attempt to remove nonexistant ihandle");
217}
218
219
220void
221hw_handle_remove_phandle (struct hw *hw,
222 struct hw *internal)
223{
224 struct hw_handle_data *db = hw->handles_of_hw;
225 struct hw_handle_mapping **current_map = &db->mappings;
226 while (*current_map != NULL)
227 {
228 if ((*current_map)->phandle == internal)
229 {
230 struct hw_handle_mapping *delete = *current_map;
231 *current_map = delete->next;
d79fe0d6 232 free (delete);
c906108c
SS
233 return;
234 }
235 current_map = &(*current_map)->next;
236 }
237 hw_abort (hw, "attempt to remove nonexistant phandle");
238}