]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - sim/common/hw-handles.c
Update copyright notices to add year 2010.
[thirdparty/binutils-gdb.git] / sim / common / hw-handles.c
1 /* The common simulator framework for GDB, the GNU Debugger.
2
3 Copyright 2002, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
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
11 the Free Software Foundation; either version 3 of the License, or
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
20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21
22
23 #include "hw-main.h"
24 #include "hw-base.h"
25
26
27 struct 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
35 struct hw_handle_data {
36 int nr_mappings;
37 struct hw_handle_mapping *mappings;
38 };
39
40 void
41 create_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
53 void
54 delete_hw_handle_data (struct hw *hw)
55 {
56 /* NULL */
57 }
58
59
60
61 #if 0
62 void
63 hw_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
89 struct hw_instance *
90 hw_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
105 struct hw *
106 hw_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
121 cell_word
122 hw_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
137 cell_word
138 hw_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
153 void
154 hw_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
175 void
176 hw_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
197 void
198 hw_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;
209 zfree (delete);
210 return;
211 }
212 current_map = &(*current_map)->next;
213 }
214 hw_abort (hw, "attempt to remove nonexistant ihandle");
215 }
216
217
218 void
219 hw_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;
230 zfree (delete);
231 return;
232 }
233 current_map = &(*current_map)->next;
234 }
235 hw_abort (hw, "attempt to remove nonexistant phandle");
236 }
237
238