OSDN Git Service

69d166db9813581c1ab919cac81c3b9613ce24b6
[pf3gnuchains/sourceware.git] / sim / common / hw-handles.c
1 /* The common simulator framework for GDB, the GNU Debugger.
2
3    Copyright 2002, 2007, 2008, 2009, 2010, 2011 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           free (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           free (delete);
231           return;
232         }
233       current_map = &(*current_map)->next;
234     }
235   hw_abort (hw, "attempt to remove nonexistant phandle");
236 }
237
238