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 27struct hw_handle_mapping 28{ 29 cell_word external; 30 struct hw *phandle; 31 struct hw_instance *ihandle; 32 struct hw_handle_mapping *next; 33}; 34 35 36struct hw_handle_data 37{ 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; 160 if (hw_handle_2ihandle (hw, internal) != 0) 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; 182 if (hw_handle_2phandle (hw, internal) != 0) 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; 211 free (delete); 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; 232 free (delete); 233 return; 234 } 235 current_map = &(*current_map)->next; 236 } 237 hw_abort (hw, "attempt to remove nonexistant phandle"); 238} 239