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 #ifndef HW_PROPERTIES_H
24 #define HW_PROPERTIES_H
25 
26 /* The following are valid property types.  The property `array' is
27    for generic untyped data. */
28 
29 typedef enum
30 {
31   array_property,
32   boolean_property,
33 #if 0
34   ihandle_property, /*runtime*/
35 #endif
36   integer_property,
37   range_array_property,
38   reg_array_property,
39   string_property,
40   string_array_property,
41 } hw_property_type;
42 
43 struct hw_property
44 {
45   struct hw *owner;
46   const char *name;
47   hw_property_type type;
48   unsigned sizeof_array;
49   const void *array;
50   const struct hw_property *original;
51   object_disposition disposition;
52 };
53 
54 #define hw_property_owner(p) ((p)->owner + 0)
55 #define hw_property_name(p) ((p)->name + 0)
56 #define hw_property_type(p) ((p)->type + 0)
57 #define hw_property_array(p) ((p)->array + 0)
58 #define hw_property_sizeof_array(p) ((p)->sizeof_array + 0)
59 #define hw_property_original(p) ((p)->original + 0)
60 #define hw_property_disposition(p) ((p)->disposition + 0)
61 
62 
63 /* Find/iterate over properites attached to a device.
64 
65    To iterate over all properties attached to a device, call
66    hw_find_property (.., NULL) and then hw_property_next. */
67 
68 const struct hw_property *hw_find_property
69 (struct hw *me,
70  const char *property);
71 
72 const struct hw_property *hw_next_property
73 (const struct hw_property *previous);
74 
75 
76 /* Manipulate the properties belonging to a given device.
77 
78    HW_ADD_* will, if the property is not already present, add a
79    property to the device.  Adding a property to a device after it has
80    been created is a checked run-time error (use HW_SET_*).
81 
82    HW_SET_* will always update (or create) the property so that it has
83    the specified value.  Changing the type of a property is a checked
84    run-time error.
85 
86    FIND returns the specified properties value.  It is a checked
87    runtime error to either request a nonexistant property or to
88    request a property using the wrong type. Code locating a property
89    should first check its type (using hw_find_property above) and then
90    obtain its value using the below.
91 
92    Naming convention:
93 
94    void hw_add_<type>_property(struct hw *, const char *, <type>)
95    void hw_add_*_array_property(struct hw *, const char *, const <type>*, int)
96    void hw_set_*_property(struct hw *, const char *, <type>)
97    void hw_set_*_array_property(struct hw *, const char *, const <type>*, int)
98    <type> hw_find_*_property(struct hw *, const char *)
99    int hw_find_*_array_property(struct hw *, const char *, int, <type>*)
100 
101    */
102 
103 
104 void hw_add_array_property
105 (struct hw *me,
106  const char *property,
107  const void *array,
108  int sizeof_array);
109 
110 void hw_set_array_property
111 (struct hw *me,
112  const char *property,
113  const void *array,
114  int sizeof_array);
115 
116 const struct hw_property *hw_find_array_property
117 (struct hw *me,
118  const char *property);
119 
120 
121 
122 void hw_add_boolean_property
123 (struct hw *me,
124  const char *property,
125  int boolean);
126 
127 int hw_find_boolean_property
128 (struct hw *me,
129  const char *property);
130 
131 
132 
133 #if 0
134 typedef struct _ihandle_runtime_property_spec
135 {
136   const char *full_path;
137 } ihandle_runtime_property_spec;
138 
139 void hw_add_ihandle_runtime_property
140 (struct hw *me,
141  const char *property,
142  const ihandle_runtime_property_spec *ihandle);
143 
144 void hw_find_ihandle_runtime_property
145 (struct hw *me,
146  const char *property,
147  ihandle_runtime_property_spec *ihandle);
148 
149 void hw_set_ihandle_property
150 (struct hw *me,
151  const char *property,
152  hw_instance *ihandle);
153 
154 hw_instance * hw_find_ihandle_property
155 (struct hw *me,
156  const char *property);
157 #endif
158 
159 
160 void hw_add_integer_property
161 (struct hw *me,
162  const char *property,
163  signed_cell integer);
164 
165 signed_cell hw_find_integer_property
166 (struct hw *me,
167  const char *property);
168 
169 int hw_find_integer_array_property
170 (struct hw *me,
171  const char *property,
172  unsigned index,
173  signed_cell *integer);
174 
175 
176 
177 typedef struct _range_property_spec
178 {
179   hw_unit child_address;
180   hw_unit parent_address;
181   hw_unit size;
182 } range_property_spec;
183 
184 void hw_add_range_array_property
185 (struct hw *me,
186  const char *property,
187  const range_property_spec *ranges,
188  unsigned nr_ranges);
189 
190 int hw_find_range_array_property
191 (struct hw *me,
192  const char *property,
193  unsigned index,
194  range_property_spec *range);
195 
196 
197 
198 typedef struct _reg_property_spec
199 {
200   hw_unit address;
201   hw_unit size;
202 } reg_property_spec;
203 
204 void hw_add_reg_array_property
205 (struct hw *me,
206  const char *property,
207  const reg_property_spec *reg,
208  unsigned nr_regs);
209 
210 int hw_find_reg_array_property
211 (struct hw *me,
212  const char *property,
213  unsigned index,
214  reg_property_spec *reg);
215 
216 
217 
218 void hw_add_string_property
219 (struct hw *me,
220  const char *property,
221  const char *string);
222 
223 const char *hw_find_string_property
224 (struct hw *me,
225  const char *property);
226 
227 
228 
229 typedef const char *string_property_spec;
230 
231 void hw_add_string_array_property
232 (struct hw *me,
233  const char *property,
234  const string_property_spec *strings,
235  unsigned nr_strings);
236 
237 int hw_find_string_array_property
238 (struct hw *me,
239  const char *property,
240  unsigned index,
241  string_property_spec *string);
242 
243 
244 
245 void hw_add_duplicate_property
246 (struct hw *me,
247  const char *property,
248  const struct hw_property *original);
249 
250 #endif
251