gas: blackfin: add support for bf54x-0.4
[deliverable/binutils-gdb.git] / sim / common / hw-handles.c
CommitLineData
b85e4829
AC
1/* The common simulator framework for GDB, the GNU Debugger.
2
7b6bb8da 3 Copyright 2002, 2007, 2008, 2009, 2010, 2011 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
27struct hw_handle_mapping {
28 cell_word external;
29 struct hw *phandle;
30 struct hw_instance *ihandle;
31 struct hw_handle_mapping *next;
32};
33
34
35struct hw_handle_data {
36 int nr_mappings;
37 struct hw_handle_mapping *mappings;
38};
39
40void
41create_hw_handle_data (struct hw *hw)
42{
43 if (hw_parent (hw) == NULL)
44 {
45 hw->handles_of_hw = HW_ZALLOC (hw, struct hw_handle_data);
46 }
47 else
48 {
49 hw->handles_of_hw = hw_root (hw)->handles_of_hw;
50 }
51}
52
53void
54delete_hw_handle_data (struct hw *hw)
55{
56 /* NULL */
57}
58
59
60
61#if 0
62void
63hw_handle_init (struct hw *hw)
64{
65 struct hw_handle_mapping *current_map = db->mappings;
66 if (current_map != NULL)
67 {
68 db->nr_mappings = db->mappings->external;
69 /* verify that the mappings that were not removed are in
70 sequence down to nr 1 */
71 while (current_map->next != NULL)
72 {
73 if (current_map->external != current_map->next->external + 1)
74 error ("hw_handle: hw_handle database possibly corrupt");
75 current_map = current_map->next;
76 }
77 ASSERT (current_map->next == NULL);
78 if (current_map->external != 1)
79 error ("hw_handle: hw_handle database possibly corrupt");
80 }
81 else
82 {
83 db->nr_mappings = 0;
84 }
85}
86#endif
87
88
89struct hw_instance *
90hw_handle_ihandle2 (struct hw *hw,
91 cell_word external)
92{
93 struct hw_handle_data *db = hw->handles_of_hw;
94 struct hw_handle_mapping *current_map = db->mappings;
95 while (current_map != NULL)
96 {
97 if (current_map->external == external)
98 return current_map->ihandle;
99 current_map = current_map->next;
100 }
101 return (void*)0;
102}
103
104
105struct hw *
106hw_handle_phandle2 (struct hw *hw,
107 cell_word external)
108{
109 struct hw_handle_data *db = hw->handles_of_hw;
110 struct hw_handle_mapping *current_map = db->mappings;
111 while (current_map != NULL)
112 {
113 if (current_map->external == external)
114 return current_map->phandle;
115 current_map = current_map->next;
116 }
117 return (void*)0;
118}
119
120
121cell_word
122hw_handle_2ihandle (struct hw *hw,
123 struct hw_instance *internal)
124{
125 struct hw_handle_data *db = hw->handles_of_hw;
126 struct hw_handle_mapping *current_map = db->mappings;
127 while (current_map != NULL)
128 {
129 if (current_map->ihandle == internal)
130 return current_map->external;
131 current_map = current_map->next;
132 }
133 return 0;
134}
135
136
137cell_word
138hw_handle_2phandle (struct hw *hw,
139 struct hw *internal)
140{
141 struct hw_handle_data *db = hw->handles_of_hw;
142 struct hw_handle_mapping *current_map = db->mappings;
143 while (current_map != NULL)
144 {
145 if (current_map->phandle == internal)
146 return current_map->external;
147 current_map = current_map->next;
148 }
149 return 0;
150}
151
152
153void
154hw_handle_add_ihandle (struct hw *hw,
155 struct hw_instance *internal)
156{
157 struct hw_handle_data *db = hw->handles_of_hw;
158 if (hw_handle_2ihandle (hw, internal) != 0)
159 {
160 hw_abort (hw, "attempting to add an ihandle already in the data base");
161 }
162 else
163 {
164 /* insert at the front making things in decending order */
165 struct hw_handle_mapping *new_map = ZALLOC (struct hw_handle_mapping);
166 new_map->next = db->mappings;
167 new_map->ihandle = internal;
168 db->nr_mappings += 1;
169 new_map->external = db->nr_mappings;
170 db->mappings = new_map;
171 }
172}
173
174
175void
176hw_handle_add_phandle (struct hw *hw,
177 struct hw *internal)
178{
179 struct hw_handle_data *db = hw->handles_of_hw;
180 if (hw_handle_2phandle (hw, internal) != 0)
181 {
182 hw_abort (hw, "attempting to add a phandle already in the data base");
183 }
184 else
185 {
186 /* insert at the front making things in decending order */
187 struct hw_handle_mapping *new_map = ZALLOC (struct hw_handle_mapping);
188 new_map->next = db->mappings;
189 new_map->phandle = internal;
190 db->nr_mappings += 1;
191 new_map->external = db->nr_mappings;
192 db->mappings = new_map;
193 }
194}
195
196
197void
198hw_handle_remove_ihandle (struct hw *hw,
199 struct hw_instance *internal)
200{
201 struct hw_handle_data *db = hw->handles_of_hw;
202 struct hw_handle_mapping **current_map = &db->mappings;
203 while (*current_map != NULL)
204 {
205 if ((*current_map)->ihandle == internal)
206 {
207 struct hw_handle_mapping *delete = *current_map;
208 *current_map = delete->next;
d79fe0d6 209 free (delete);
c906108c
SS
210 return;
211 }
212 current_map = &(*current_map)->next;
213 }
214 hw_abort (hw, "attempt to remove nonexistant ihandle");
215}
216
217
218void
219hw_handle_remove_phandle (struct hw *hw,
220 struct hw *internal)
221{
222 struct hw_handle_data *db = hw->handles_of_hw;
223 struct hw_handle_mapping **current_map = &db->mappings;
224 while (*current_map != NULL)
225 {
226 if ((*current_map)->phandle == internal)
227 {
228 struct hw_handle_mapping *delete = *current_map;
229 *current_map = delete->next;
d79fe0d6 230 free (delete);
c906108c
SS
231 return;
232 }
233 current_map = &(*current_map)->next;
234 }
235 hw_abort (hw, "attempt to remove nonexistant phandle");
236}
237
238
This page took 0.678384 seconds and 4 git commands to generate.