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