root / hw / qdev-properties.c @ 37952117
History | View | Annotate | Download (30.4 kB)
1 | 1503fff3 | Gerd Hoffmann | #include "net.h" |
---|---|---|---|
2 | ee6847d1 | Gerd Hoffmann | #include "qdev.h" |
3 | 9f59b566 | Markus Armbruster | #include "qerror.h" |
4 | 2446333c | Blue Swirl | #include "blockdev.h" |
5 | ee6847d1 | Gerd Hoffmann | |
6 | ee6847d1 | Gerd Hoffmann | void *qdev_get_prop_ptr(DeviceState *dev, Property *prop)
|
7 | ee6847d1 | Gerd Hoffmann | { |
8 | ee6847d1 | Gerd Hoffmann | void *ptr = dev;
|
9 | ee6847d1 | Gerd Hoffmann | ptr += prop->offset; |
10 | ee6847d1 | Gerd Hoffmann | return ptr;
|
11 | ee6847d1 | Gerd Hoffmann | } |
12 | ee6847d1 | Gerd Hoffmann | |
13 | d2364ee4 | Michael S. Tsirkin | static uint32_t qdev_get_prop_mask(Property *prop)
|
14 | d2364ee4 | Michael S. Tsirkin | { |
15 | a3d4a1b0 | Paolo Bonzini | assert(prop->info == &qdev_prop_bit); |
16 | d2364ee4 | Michael S. Tsirkin | return 0x1 << prop->bitnr; |
17 | d2364ee4 | Michael S. Tsirkin | } |
18 | d2364ee4 | Michael S. Tsirkin | |
19 | d2364ee4 | Michael S. Tsirkin | static void bit_prop_set(DeviceState *dev, Property *props, bool val) |
20 | d2364ee4 | Michael S. Tsirkin | { |
21 | d2364ee4 | Michael S. Tsirkin | uint32_t *p = qdev_get_prop_ptr(dev, props); |
22 | d2364ee4 | Michael S. Tsirkin | uint32_t mask = qdev_get_prop_mask(props); |
23 | d2364ee4 | Michael S. Tsirkin | if (val)
|
24 | dbd48324 | Michael S. Tsirkin | *p |= mask; |
25 | d2364ee4 | Michael S. Tsirkin | else
|
26 | d2364ee4 | Michael S. Tsirkin | *p &= ~mask; |
27 | d2364ee4 | Michael S. Tsirkin | } |
28 | d2364ee4 | Michael S. Tsirkin | |
29 | d2364ee4 | Michael S. Tsirkin | /* Bit */
|
30 | d2364ee4 | Michael S. Tsirkin | |
31 | d2364ee4 | Michael S. Tsirkin | static int print_bit(DeviceState *dev, Property *prop, char *dest, size_t len) |
32 | d2364ee4 | Michael S. Tsirkin | { |
33 | 5a5e3d55 | David 'Digit' Turner | uint32_t *p = qdev_get_prop_ptr(dev, prop); |
34 | d2364ee4 | Michael S. Tsirkin | return snprintf(dest, len, (*p & qdev_get_prop_mask(prop)) ? "on" : "off"); |
35 | d2364ee4 | Michael S. Tsirkin | } |
36 | d2364ee4 | Michael S. Tsirkin | |
37 | 57c9fafe | Anthony Liguori | static void get_bit(Object *obj, Visitor *v, void *opaque, |
38 | 80e555c2 | Paolo Bonzini | const char *name, Error **errp) |
39 | 80e555c2 | Paolo Bonzini | { |
40 | 57c9fafe | Anthony Liguori | DeviceState *dev = DEVICE(obj); |
41 | 80e555c2 | Paolo Bonzini | Property *prop = opaque; |
42 | 80e555c2 | Paolo Bonzini | uint32_t *p = qdev_get_prop_ptr(dev, prop); |
43 | 80e555c2 | Paolo Bonzini | bool value = (*p & qdev_get_prop_mask(prop)) != 0; |
44 | 80e555c2 | Paolo Bonzini | |
45 | 80e555c2 | Paolo Bonzini | visit_type_bool(v, &value, name, errp); |
46 | 80e555c2 | Paolo Bonzini | } |
47 | 80e555c2 | Paolo Bonzini | |
48 | 57c9fafe | Anthony Liguori | static void set_bit(Object *obj, Visitor *v, void *opaque, |
49 | 80e555c2 | Paolo Bonzini | const char *name, Error **errp) |
50 | 80e555c2 | Paolo Bonzini | { |
51 | 57c9fafe | Anthony Liguori | DeviceState *dev = DEVICE(obj); |
52 | 80e555c2 | Paolo Bonzini | Property *prop = opaque; |
53 | 80e555c2 | Paolo Bonzini | Error *local_err = NULL;
|
54 | 80e555c2 | Paolo Bonzini | bool value;
|
55 | 80e555c2 | Paolo Bonzini | |
56 | 80e555c2 | Paolo Bonzini | if (dev->state != DEV_STATE_CREATED) {
|
57 | 80e555c2 | Paolo Bonzini | error_set(errp, QERR_PERMISSION_DENIED); |
58 | 80e555c2 | Paolo Bonzini | return;
|
59 | 80e555c2 | Paolo Bonzini | } |
60 | 80e555c2 | Paolo Bonzini | |
61 | 80e555c2 | Paolo Bonzini | visit_type_bool(v, &value, name, &local_err); |
62 | 80e555c2 | Paolo Bonzini | if (local_err) {
|
63 | 80e555c2 | Paolo Bonzini | error_propagate(errp, local_err); |
64 | 80e555c2 | Paolo Bonzini | return;
|
65 | 80e555c2 | Paolo Bonzini | } |
66 | 80e555c2 | Paolo Bonzini | bit_prop_set(dev, prop, value); |
67 | 80e555c2 | Paolo Bonzini | } |
68 | 80e555c2 | Paolo Bonzini | |
69 | d2364ee4 | Michael S. Tsirkin | PropertyInfo qdev_prop_bit = { |
70 | cafe5bdb | Paolo Bonzini | .name = "boolean",
|
71 | cafe5bdb | Paolo Bonzini | .legacy_name = "on/off",
|
72 | d2364ee4 | Michael S. Tsirkin | .print = print_bit, |
73 | 80e555c2 | Paolo Bonzini | .get = get_bit, |
74 | 80e555c2 | Paolo Bonzini | .set = set_bit, |
75 | d2364ee4 | Michael S. Tsirkin | }; |
76 | d2364ee4 | Michael S. Tsirkin | |
77 | c7cc172d | Juan Quintela | /* --- 8bit integer --- */
|
78 | c7cc172d | Juan Quintela | |
79 | c08fb2ac | Michael Roth | static void get_uint8(Object *obj, Visitor *v, void *opaque, |
80 | c08fb2ac | Michael Roth | const char *name, Error **errp) |
81 | 80e555c2 | Paolo Bonzini | { |
82 | 57c9fafe | Anthony Liguori | DeviceState *dev = DEVICE(obj); |
83 | 80e555c2 | Paolo Bonzini | Property *prop = opaque; |
84 | c08fb2ac | Michael Roth | uint8_t *ptr = qdev_get_prop_ptr(dev, prop); |
85 | 80e555c2 | Paolo Bonzini | |
86 | c08fb2ac | Michael Roth | visit_type_uint8(v, ptr, name, errp); |
87 | 80e555c2 | Paolo Bonzini | } |
88 | 80e555c2 | Paolo Bonzini | |
89 | c08fb2ac | Michael Roth | static void set_uint8(Object *obj, Visitor *v, void *opaque, |
90 | c08fb2ac | Michael Roth | const char *name, Error **errp) |
91 | 80e555c2 | Paolo Bonzini | { |
92 | 57c9fafe | Anthony Liguori | DeviceState *dev = DEVICE(obj); |
93 | 80e555c2 | Paolo Bonzini | Property *prop = opaque; |
94 | 27712df9 | Paolo Bonzini | uint8_t *ptr = qdev_get_prop_ptr(dev, prop); |
95 | 80e555c2 | Paolo Bonzini | |
96 | 80e555c2 | Paolo Bonzini | if (dev->state != DEV_STATE_CREATED) {
|
97 | 80e555c2 | Paolo Bonzini | error_set(errp, QERR_PERMISSION_DENIED); |
98 | 80e555c2 | Paolo Bonzini | return;
|
99 | 80e555c2 | Paolo Bonzini | } |
100 | 80e555c2 | Paolo Bonzini | |
101 | 27712df9 | Paolo Bonzini | visit_type_uint8(v, ptr, name, errp); |
102 | 80e555c2 | Paolo Bonzini | } |
103 | 80e555c2 | Paolo Bonzini | |
104 | c7cc172d | Juan Quintela | PropertyInfo qdev_prop_uint8 = { |
105 | c7cc172d | Juan Quintela | .name = "uint8",
|
106 | c08fb2ac | Michael Roth | .get = get_uint8, |
107 | c08fb2ac | Michael Roth | .set = set_uint8, |
108 | c7cc172d | Juan Quintela | }; |
109 | c7cc172d | Juan Quintela | |
110 | 6835678c | Jan Kiszka | /* --- 8bit hex value --- */
|
111 | 6835678c | Jan Kiszka | |
112 | 6835678c | Jan Kiszka | static int parse_hex8(DeviceState *dev, Property *prop, const char *str) |
113 | 6835678c | Jan Kiszka | { |
114 | 6835678c | Jan Kiszka | uint8_t *ptr = qdev_get_prop_ptr(dev, prop); |
115 | 6835678c | Jan Kiszka | char *end;
|
116 | 6835678c | Jan Kiszka | |
117 | 97aa6e9b | Paolo Bonzini | if (str[0] != '0' || str[1] != 'x') { |
118 | 97aa6e9b | Paolo Bonzini | return -EINVAL;
|
119 | 97aa6e9b | Paolo Bonzini | } |
120 | 97aa6e9b | Paolo Bonzini | |
121 | 6835678c | Jan Kiszka | *ptr = strtoul(str, &end, 16);
|
122 | 6835678c | Jan Kiszka | if ((*end != '\0') || (end == str)) { |
123 | 6835678c | Jan Kiszka | return -EINVAL;
|
124 | 6835678c | Jan Kiszka | } |
125 | 6835678c | Jan Kiszka | |
126 | 6835678c | Jan Kiszka | return 0; |
127 | 6835678c | Jan Kiszka | } |
128 | 6835678c | Jan Kiszka | |
129 | 6835678c | Jan Kiszka | static int print_hex8(DeviceState *dev, Property *prop, char *dest, size_t len) |
130 | 6835678c | Jan Kiszka | { |
131 | 6835678c | Jan Kiszka | uint8_t *ptr = qdev_get_prop_ptr(dev, prop); |
132 | 6835678c | Jan Kiszka | return snprintf(dest, len, "0x%" PRIx8, *ptr); |
133 | 6835678c | Jan Kiszka | } |
134 | 6835678c | Jan Kiszka | |
135 | 6835678c | Jan Kiszka | PropertyInfo qdev_prop_hex8 = { |
136 | cafe5bdb | Paolo Bonzini | .name = "uint8",
|
137 | cafe5bdb | Paolo Bonzini | .legacy_name = "hex8",
|
138 | 6835678c | Jan Kiszka | .parse = parse_hex8, |
139 | 6835678c | Jan Kiszka | .print = print_hex8, |
140 | c08fb2ac | Michael Roth | .get = get_uint8, |
141 | c08fb2ac | Michael Roth | .set = set_uint8, |
142 | 6835678c | Jan Kiszka | }; |
143 | 6835678c | Jan Kiszka | |
144 | ee6847d1 | Gerd Hoffmann | /* --- 16bit integer --- */
|
145 | ee6847d1 | Gerd Hoffmann | |
146 | c08fb2ac | Michael Roth | static void get_uint16(Object *obj, Visitor *v, void *opaque, |
147 | c08fb2ac | Michael Roth | const char *name, Error **errp) |
148 | 80e555c2 | Paolo Bonzini | { |
149 | 57c9fafe | Anthony Liguori | DeviceState *dev = DEVICE(obj); |
150 | 80e555c2 | Paolo Bonzini | Property *prop = opaque; |
151 | c08fb2ac | Michael Roth | uint16_t *ptr = qdev_get_prop_ptr(dev, prop); |
152 | 80e555c2 | Paolo Bonzini | |
153 | c08fb2ac | Michael Roth | visit_type_uint16(v, ptr, name, errp); |
154 | 80e555c2 | Paolo Bonzini | } |
155 | 80e555c2 | Paolo Bonzini | |
156 | c08fb2ac | Michael Roth | static void set_uint16(Object *obj, Visitor *v, void *opaque, |
157 | c08fb2ac | Michael Roth | const char *name, Error **errp) |
158 | 80e555c2 | Paolo Bonzini | { |
159 | 57c9fafe | Anthony Liguori | DeviceState *dev = DEVICE(obj); |
160 | 80e555c2 | Paolo Bonzini | Property *prop = opaque; |
161 | 27712df9 | Paolo Bonzini | uint16_t *ptr = qdev_get_prop_ptr(dev, prop); |
162 | 80e555c2 | Paolo Bonzini | |
163 | 80e555c2 | Paolo Bonzini | if (dev->state != DEV_STATE_CREATED) {
|
164 | 80e555c2 | Paolo Bonzini | error_set(errp, QERR_PERMISSION_DENIED); |
165 | 80e555c2 | Paolo Bonzini | return;
|
166 | 80e555c2 | Paolo Bonzini | } |
167 | 80e555c2 | Paolo Bonzini | |
168 | 27712df9 | Paolo Bonzini | visit_type_uint16(v, ptr, name, errp); |
169 | 80e555c2 | Paolo Bonzini | } |
170 | 80e555c2 | Paolo Bonzini | |
171 | ee6847d1 | Gerd Hoffmann | PropertyInfo qdev_prop_uint16 = { |
172 | ee6847d1 | Gerd Hoffmann | .name = "uint16",
|
173 | c08fb2ac | Michael Roth | .get = get_uint16, |
174 | c08fb2ac | Michael Roth | .set = set_uint16, |
175 | ee6847d1 | Gerd Hoffmann | }; |
176 | ee6847d1 | Gerd Hoffmann | |
177 | ee6847d1 | Gerd Hoffmann | /* --- 32bit integer --- */
|
178 | ee6847d1 | Gerd Hoffmann | |
179 | c08fb2ac | Michael Roth | static void get_uint32(Object *obj, Visitor *v, void *opaque, |
180 | c08fb2ac | Michael Roth | const char *name, Error **errp) |
181 | c08fb2ac | Michael Roth | { |
182 | c08fb2ac | Michael Roth | DeviceState *dev = DEVICE(obj); |
183 | c08fb2ac | Michael Roth | Property *prop = opaque; |
184 | 27712df9 | Paolo Bonzini | uint32_t *ptr = qdev_get_prop_ptr(dev, prop); |
185 | c08fb2ac | Michael Roth | |
186 | 27712df9 | Paolo Bonzini | visit_type_uint32(v, ptr, name, errp); |
187 | c08fb2ac | Michael Roth | } |
188 | c08fb2ac | Michael Roth | |
189 | c08fb2ac | Michael Roth | static void set_uint32(Object *obj, Visitor *v, void *opaque, |
190 | c08fb2ac | Michael Roth | const char *name, Error **errp) |
191 | c08fb2ac | Michael Roth | { |
192 | c08fb2ac | Michael Roth | DeviceState *dev = DEVICE(obj); |
193 | c08fb2ac | Michael Roth | Property *prop = opaque; |
194 | 27712df9 | Paolo Bonzini | uint32_t *ptr = qdev_get_prop_ptr(dev, prop); |
195 | c08fb2ac | Michael Roth | |
196 | c08fb2ac | Michael Roth | if (dev->state != DEV_STATE_CREATED) {
|
197 | c08fb2ac | Michael Roth | error_set(errp, QERR_PERMISSION_DENIED); |
198 | c08fb2ac | Michael Roth | return;
|
199 | c08fb2ac | Michael Roth | } |
200 | c08fb2ac | Michael Roth | |
201 | 27712df9 | Paolo Bonzini | visit_type_uint32(v, ptr, name, errp); |
202 | c08fb2ac | Michael Roth | } |
203 | c08fb2ac | Michael Roth | |
204 | 57c9fafe | Anthony Liguori | static void get_int32(Object *obj, Visitor *v, void *opaque, |
205 | 80e555c2 | Paolo Bonzini | const char *name, Error **errp) |
206 | 80e555c2 | Paolo Bonzini | { |
207 | 57c9fafe | Anthony Liguori | DeviceState *dev = DEVICE(obj); |
208 | 80e555c2 | Paolo Bonzini | Property *prop = opaque; |
209 | 80e555c2 | Paolo Bonzini | int32_t *ptr = qdev_get_prop_ptr(dev, prop); |
210 | 80e555c2 | Paolo Bonzini | |
211 | c08fb2ac | Michael Roth | visit_type_int32(v, ptr, name, errp); |
212 | 80e555c2 | Paolo Bonzini | } |
213 | 80e555c2 | Paolo Bonzini | |
214 | 57c9fafe | Anthony Liguori | static void set_int32(Object *obj, Visitor *v, void *opaque, |
215 | 80e555c2 | Paolo Bonzini | const char *name, Error **errp) |
216 | 80e555c2 | Paolo Bonzini | { |
217 | 57c9fafe | Anthony Liguori | DeviceState *dev = DEVICE(obj); |
218 | 80e555c2 | Paolo Bonzini | Property *prop = opaque; |
219 | 27712df9 | Paolo Bonzini | int32_t *ptr = qdev_get_prop_ptr(dev, prop); |
220 | 80e555c2 | Paolo Bonzini | |
221 | 80e555c2 | Paolo Bonzini | if (dev->state != DEV_STATE_CREATED) {
|
222 | 80e555c2 | Paolo Bonzini | error_set(errp, QERR_PERMISSION_DENIED); |
223 | 80e555c2 | Paolo Bonzini | return;
|
224 | 80e555c2 | Paolo Bonzini | } |
225 | 80e555c2 | Paolo Bonzini | |
226 | 27712df9 | Paolo Bonzini | visit_type_int32(v, ptr, name, errp); |
227 | 80e555c2 | Paolo Bonzini | } |
228 | 80e555c2 | Paolo Bonzini | |
229 | ee6847d1 | Gerd Hoffmann | PropertyInfo qdev_prop_uint32 = { |
230 | ee6847d1 | Gerd Hoffmann | .name = "uint32",
|
231 | c08fb2ac | Michael Roth | .get = get_uint32, |
232 | c08fb2ac | Michael Roth | .set = set_uint32, |
233 | ee6847d1 | Gerd Hoffmann | }; |
234 | ee6847d1 | Gerd Hoffmann | |
235 | 316940b0 | Gerd Hoffmann | PropertyInfo qdev_prop_int32 = { |
236 | 316940b0 | Gerd Hoffmann | .name = "int32",
|
237 | 80e555c2 | Paolo Bonzini | .get = get_int32, |
238 | 80e555c2 | Paolo Bonzini | .set = set_int32, |
239 | 316940b0 | Gerd Hoffmann | }; |
240 | 316940b0 | Gerd Hoffmann | |
241 | ee6847d1 | Gerd Hoffmann | /* --- 32bit hex value --- */
|
242 | ee6847d1 | Gerd Hoffmann | |
243 | ee6847d1 | Gerd Hoffmann | static int parse_hex32(DeviceState *dev, Property *prop, const char *str) |
244 | ee6847d1 | Gerd Hoffmann | { |
245 | ee6847d1 | Gerd Hoffmann | uint32_t *ptr = qdev_get_prop_ptr(dev, prop); |
246 | 449041d4 | Kevin Wolf | char *end;
|
247 | ee6847d1 | Gerd Hoffmann | |
248 | 97aa6e9b | Paolo Bonzini | if (str[0] != '0' || str[1] != 'x') { |
249 | 97aa6e9b | Paolo Bonzini | return -EINVAL;
|
250 | 97aa6e9b | Paolo Bonzini | } |
251 | 97aa6e9b | Paolo Bonzini | |
252 | 449041d4 | Kevin Wolf | *ptr = strtoul(str, &end, 16);
|
253 | 449041d4 | Kevin Wolf | if ((*end != '\0') || (end == str)) { |
254 | 6bf38816 | Markus Armbruster | return -EINVAL;
|
255 | 449041d4 | Kevin Wolf | } |
256 | 449041d4 | Kevin Wolf | |
257 | ee6847d1 | Gerd Hoffmann | return 0; |
258 | ee6847d1 | Gerd Hoffmann | } |
259 | ee6847d1 | Gerd Hoffmann | |
260 | ee6847d1 | Gerd Hoffmann | static int print_hex32(DeviceState *dev, Property *prop, char *dest, size_t len) |
261 | ee6847d1 | Gerd Hoffmann | { |
262 | ee6847d1 | Gerd Hoffmann | uint32_t *ptr = qdev_get_prop_ptr(dev, prop); |
263 | ee6847d1 | Gerd Hoffmann | return snprintf(dest, len, "0x%" PRIx32, *ptr); |
264 | ee6847d1 | Gerd Hoffmann | } |
265 | ee6847d1 | Gerd Hoffmann | |
266 | ee6847d1 | Gerd Hoffmann | PropertyInfo qdev_prop_hex32 = { |
267 | cafe5bdb | Paolo Bonzini | .name = "uint32",
|
268 | cafe5bdb | Paolo Bonzini | .legacy_name = "hex32",
|
269 | ee6847d1 | Gerd Hoffmann | .parse = parse_hex32, |
270 | ee6847d1 | Gerd Hoffmann | .print = print_hex32, |
271 | c08fb2ac | Michael Roth | .get = get_uint32, |
272 | c08fb2ac | Michael Roth | .set = set_uint32, |
273 | ee6847d1 | Gerd Hoffmann | }; |
274 | ee6847d1 | Gerd Hoffmann | |
275 | 5a053d1f | Blue Swirl | /* --- 64bit integer --- */
|
276 | 5a053d1f | Blue Swirl | |
277 | c08fb2ac | Michael Roth | static void get_uint64(Object *obj, Visitor *v, void *opaque, |
278 | c08fb2ac | Michael Roth | const char *name, Error **errp) |
279 | 80e555c2 | Paolo Bonzini | { |
280 | 57c9fafe | Anthony Liguori | DeviceState *dev = DEVICE(obj); |
281 | 80e555c2 | Paolo Bonzini | Property *prop = opaque; |
282 | c08fb2ac | Michael Roth | uint64_t *ptr = qdev_get_prop_ptr(dev, prop); |
283 | 80e555c2 | Paolo Bonzini | |
284 | c08fb2ac | Michael Roth | visit_type_uint64(v, ptr, name, errp); |
285 | 80e555c2 | Paolo Bonzini | } |
286 | 80e555c2 | Paolo Bonzini | |
287 | c08fb2ac | Michael Roth | static void set_uint64(Object *obj, Visitor *v, void *opaque, |
288 | c08fb2ac | Michael Roth | const char *name, Error **errp) |
289 | 80e555c2 | Paolo Bonzini | { |
290 | 57c9fafe | Anthony Liguori | DeviceState *dev = DEVICE(obj); |
291 | 80e555c2 | Paolo Bonzini | Property *prop = opaque; |
292 | c08fb2ac | Michael Roth | uint64_t *ptr = qdev_get_prop_ptr(dev, prop); |
293 | 80e555c2 | Paolo Bonzini | |
294 | 80e555c2 | Paolo Bonzini | if (dev->state != DEV_STATE_CREATED) {
|
295 | 80e555c2 | Paolo Bonzini | error_set(errp, QERR_PERMISSION_DENIED); |
296 | 80e555c2 | Paolo Bonzini | return;
|
297 | 80e555c2 | Paolo Bonzini | } |
298 | 80e555c2 | Paolo Bonzini | |
299 | c08fb2ac | Michael Roth | visit_type_uint64(v, ptr, name, errp); |
300 | 80e555c2 | Paolo Bonzini | } |
301 | 80e555c2 | Paolo Bonzini | |
302 | 5a053d1f | Blue Swirl | PropertyInfo qdev_prop_uint64 = { |
303 | 5a053d1f | Blue Swirl | .name = "uint64",
|
304 | c08fb2ac | Michael Roth | .get = get_uint64, |
305 | c08fb2ac | Michael Roth | .set = set_uint64, |
306 | 5a053d1f | Blue Swirl | }; |
307 | 5a053d1f | Blue Swirl | |
308 | 5a053d1f | Blue Swirl | /* --- 64bit hex value --- */
|
309 | 5a053d1f | Blue Swirl | |
310 | 5a053d1f | Blue Swirl | static int parse_hex64(DeviceState *dev, Property *prop, const char *str) |
311 | 5a053d1f | Blue Swirl | { |
312 | 5a053d1f | Blue Swirl | uint64_t *ptr = qdev_get_prop_ptr(dev, prop); |
313 | 449041d4 | Kevin Wolf | char *end;
|
314 | 5a053d1f | Blue Swirl | |
315 | 97aa6e9b | Paolo Bonzini | if (str[0] != '0' || str[1] != 'x') { |
316 | 97aa6e9b | Paolo Bonzini | return -EINVAL;
|
317 | 97aa6e9b | Paolo Bonzini | } |
318 | 97aa6e9b | Paolo Bonzini | |
319 | 449041d4 | Kevin Wolf | *ptr = strtoull(str, &end, 16);
|
320 | 449041d4 | Kevin Wolf | if ((*end != '\0') || (end == str)) { |
321 | 6bf38816 | Markus Armbruster | return -EINVAL;
|
322 | 449041d4 | Kevin Wolf | } |
323 | 449041d4 | Kevin Wolf | |
324 | 5a053d1f | Blue Swirl | return 0; |
325 | 5a053d1f | Blue Swirl | } |
326 | 5a053d1f | Blue Swirl | |
327 | 5a053d1f | Blue Swirl | static int print_hex64(DeviceState *dev, Property *prop, char *dest, size_t len) |
328 | 5a053d1f | Blue Swirl | { |
329 | 5a053d1f | Blue Swirl | uint64_t *ptr = qdev_get_prop_ptr(dev, prop); |
330 | 5a053d1f | Blue Swirl | return snprintf(dest, len, "0x%" PRIx64, *ptr); |
331 | 5a053d1f | Blue Swirl | } |
332 | 5a053d1f | Blue Swirl | |
333 | 5a053d1f | Blue Swirl | PropertyInfo qdev_prop_hex64 = { |
334 | cafe5bdb | Paolo Bonzini | .name = "uint64",
|
335 | cafe5bdb | Paolo Bonzini | .legacy_name = "hex64",
|
336 | 5a053d1f | Blue Swirl | .parse = parse_hex64, |
337 | 5a053d1f | Blue Swirl | .print = print_hex64, |
338 | c08fb2ac | Michael Roth | .get = get_uint64, |
339 | c08fb2ac | Michael Roth | .set = set_uint64, |
340 | 5a053d1f | Blue Swirl | }; |
341 | 5a053d1f | Blue Swirl | |
342 | 59419663 | Gerd Hoffmann | /* --- string --- */
|
343 | 59419663 | Gerd Hoffmann | |
344 | dd0ba250 | Paolo Bonzini | static void release_string(Object *obj, const char *name, void *opaque) |
345 | d21357df | Markus Armbruster | { |
346 | dd0ba250 | Paolo Bonzini | Property *prop = opaque; |
347 | dd0ba250 | Paolo Bonzini | g_free(*(char **)qdev_get_prop_ptr(DEVICE(obj), prop));
|
348 | d21357df | Markus Armbruster | } |
349 | d21357df | Markus Armbruster | |
350 | 59419663 | Gerd Hoffmann | static int print_string(DeviceState *dev, Property *prop, char *dest, size_t len) |
351 | 59419663 | Gerd Hoffmann | { |
352 | 59419663 | Gerd Hoffmann | char **ptr = qdev_get_prop_ptr(dev, prop);
|
353 | 59419663 | Gerd Hoffmann | if (!*ptr)
|
354 | 59419663 | Gerd Hoffmann | return snprintf(dest, len, "<null>"); |
355 | 59419663 | Gerd Hoffmann | return snprintf(dest, len, "\"%s\"", *ptr); |
356 | 59419663 | Gerd Hoffmann | } |
357 | 59419663 | Gerd Hoffmann | |
358 | 57c9fafe | Anthony Liguori | static void get_string(Object *obj, Visitor *v, void *opaque, |
359 | 80e555c2 | Paolo Bonzini | const char *name, Error **errp) |
360 | 80e555c2 | Paolo Bonzini | { |
361 | 57c9fafe | Anthony Liguori | DeviceState *dev = DEVICE(obj); |
362 | 80e555c2 | Paolo Bonzini | Property *prop = opaque; |
363 | 80e555c2 | Paolo Bonzini | char **ptr = qdev_get_prop_ptr(dev, prop);
|
364 | 80e555c2 | Paolo Bonzini | |
365 | 80e555c2 | Paolo Bonzini | if (!*ptr) {
|
366 | 80e555c2 | Paolo Bonzini | char *str = (char *)""; |
367 | 80e555c2 | Paolo Bonzini | visit_type_str(v, &str, name, errp); |
368 | 80e555c2 | Paolo Bonzini | } else {
|
369 | 80e555c2 | Paolo Bonzini | visit_type_str(v, ptr, name, errp); |
370 | 80e555c2 | Paolo Bonzini | } |
371 | 80e555c2 | Paolo Bonzini | } |
372 | 80e555c2 | Paolo Bonzini | |
373 | 57c9fafe | Anthony Liguori | static void set_string(Object *obj, Visitor *v, void *opaque, |
374 | 80e555c2 | Paolo Bonzini | const char *name, Error **errp) |
375 | 80e555c2 | Paolo Bonzini | { |
376 | 57c9fafe | Anthony Liguori | DeviceState *dev = DEVICE(obj); |
377 | 80e555c2 | Paolo Bonzini | Property *prop = opaque; |
378 | 80e555c2 | Paolo Bonzini | char **ptr = qdev_get_prop_ptr(dev, prop);
|
379 | 80e555c2 | Paolo Bonzini | Error *local_err = NULL;
|
380 | 80e555c2 | Paolo Bonzini | char *str;
|
381 | 80e555c2 | Paolo Bonzini | |
382 | 80e555c2 | Paolo Bonzini | if (dev->state != DEV_STATE_CREATED) {
|
383 | 80e555c2 | Paolo Bonzini | error_set(errp, QERR_PERMISSION_DENIED); |
384 | 80e555c2 | Paolo Bonzini | return;
|
385 | 80e555c2 | Paolo Bonzini | } |
386 | 80e555c2 | Paolo Bonzini | |
387 | 80e555c2 | Paolo Bonzini | visit_type_str(v, &str, name, &local_err); |
388 | 80e555c2 | Paolo Bonzini | if (local_err) {
|
389 | 80e555c2 | Paolo Bonzini | error_propagate(errp, local_err); |
390 | 80e555c2 | Paolo Bonzini | return;
|
391 | 80e555c2 | Paolo Bonzini | } |
392 | 80e555c2 | Paolo Bonzini | if (*ptr) {
|
393 | 80e555c2 | Paolo Bonzini | g_free(*ptr); |
394 | 80e555c2 | Paolo Bonzini | } |
395 | 80e555c2 | Paolo Bonzini | *ptr = str; |
396 | 80e555c2 | Paolo Bonzini | } |
397 | 80e555c2 | Paolo Bonzini | |
398 | 59419663 | Gerd Hoffmann | PropertyInfo qdev_prop_string = { |
399 | 59419663 | Gerd Hoffmann | .name = "string",
|
400 | 59419663 | Gerd Hoffmann | .print = print_string, |
401 | dd0ba250 | Paolo Bonzini | .release = release_string, |
402 | 80e555c2 | Paolo Bonzini | .get = get_string, |
403 | 80e555c2 | Paolo Bonzini | .set = set_string, |
404 | 59419663 | Gerd Hoffmann | }; |
405 | 59419663 | Gerd Hoffmann | |
406 | 14b41872 | Gerd Hoffmann | /* --- drive --- */
|
407 | 14b41872 | Gerd Hoffmann | |
408 | 7b009e5d | Paolo Bonzini | static int parse_drive(DeviceState *dev, const char *str, void **ptr) |
409 | 14b41872 | Gerd Hoffmann | { |
410 | f8b6cc00 | Markus Armbruster | BlockDriverState *bs; |
411 | 14b41872 | Gerd Hoffmann | |
412 | f8b6cc00 | Markus Armbruster | bs = bdrv_find(str); |
413 | f8b6cc00 | Markus Armbruster | if (bs == NULL) |
414 | 6bf38816 | Markus Armbruster | return -ENOENT;
|
415 | fa879d62 | Markus Armbruster | if (bdrv_attach_dev(bs, dev) < 0) |
416 | 18846dee | Markus Armbruster | return -EEXIST;
|
417 | f8b6cc00 | Markus Armbruster | *ptr = bs; |
418 | 14b41872 | Gerd Hoffmann | return 0; |
419 | 14b41872 | Gerd Hoffmann | } |
420 | 14b41872 | Gerd Hoffmann | |
421 | dd0ba250 | Paolo Bonzini | static void release_drive(Object *obj, const char *name, void *opaque) |
422 | 14bafc54 | Markus Armbruster | { |
423 | dd0ba250 | Paolo Bonzini | DeviceState *dev = DEVICE(obj); |
424 | dd0ba250 | Paolo Bonzini | Property *prop = opaque; |
425 | f8b6cc00 | Markus Armbruster | BlockDriverState **ptr = qdev_get_prop_ptr(dev, prop); |
426 | 14bafc54 | Markus Armbruster | |
427 | 14bafc54 | Markus Armbruster | if (*ptr) {
|
428 | fa879d62 | Markus Armbruster | bdrv_detach_dev(*ptr, dev); |
429 | f8b6cc00 | Markus Armbruster | blockdev_auto_del(*ptr); |
430 | 14bafc54 | Markus Armbruster | } |
431 | 14bafc54 | Markus Armbruster | } |
432 | 14bafc54 | Markus Armbruster | |
433 | 7b009e5d | Paolo Bonzini | static const char *print_drive(void *ptr) |
434 | 14b41872 | Gerd Hoffmann | { |
435 | 7b009e5d | Paolo Bonzini | return bdrv_get_device_name(ptr);
|
436 | 14b41872 | Gerd Hoffmann | } |
437 | 14b41872 | Gerd Hoffmann | |
438 | 7b009e5d | Paolo Bonzini | static void get_pointer(Object *obj, Visitor *v, Property *prop, |
439 | 7b009e5d | Paolo Bonzini | const char *(*print)(void *ptr), |
440 | 7b009e5d | Paolo Bonzini | const char *name, Error **errp) |
441 | 80e555c2 | Paolo Bonzini | { |
442 | 57c9fafe | Anthony Liguori | DeviceState *dev = DEVICE(obj); |
443 | 80e555c2 | Paolo Bonzini | void **ptr = qdev_get_prop_ptr(dev, prop);
|
444 | 7b009e5d | Paolo Bonzini | char *p;
|
445 | 80e555c2 | Paolo Bonzini | |
446 | 7b009e5d | Paolo Bonzini | p = (char *) (*ptr ? print(*ptr) : ""); |
447 | 80e555c2 | Paolo Bonzini | visit_type_str(v, &p, name, errp); |
448 | 80e555c2 | Paolo Bonzini | } |
449 | 80e555c2 | Paolo Bonzini | |
450 | 7b009e5d | Paolo Bonzini | static void set_pointer(Object *obj, Visitor *v, Property *prop, |
451 | 7b009e5d | Paolo Bonzini | int (*parse)(DeviceState *dev, const char *str, void **ptr), |
452 | 80e555c2 | Paolo Bonzini | const char *name, Error **errp) |
453 | 80e555c2 | Paolo Bonzini | { |
454 | 57c9fafe | Anthony Liguori | DeviceState *dev = DEVICE(obj); |
455 | 80e555c2 | Paolo Bonzini | Error *local_err = NULL;
|
456 | 7b009e5d | Paolo Bonzini | void **ptr = qdev_get_prop_ptr(dev, prop);
|
457 | 80e555c2 | Paolo Bonzini | char *str;
|
458 | 80e555c2 | Paolo Bonzini | int ret;
|
459 | 80e555c2 | Paolo Bonzini | |
460 | 80e555c2 | Paolo Bonzini | if (dev->state != DEV_STATE_CREATED) {
|
461 | 80e555c2 | Paolo Bonzini | error_set(errp, QERR_PERMISSION_DENIED); |
462 | 80e555c2 | Paolo Bonzini | return;
|
463 | 80e555c2 | Paolo Bonzini | } |
464 | 80e555c2 | Paolo Bonzini | |
465 | 80e555c2 | Paolo Bonzini | visit_type_str(v, &str, name, &local_err); |
466 | 80e555c2 | Paolo Bonzini | if (local_err) {
|
467 | 80e555c2 | Paolo Bonzini | error_propagate(errp, local_err); |
468 | 80e555c2 | Paolo Bonzini | return;
|
469 | 80e555c2 | Paolo Bonzini | } |
470 | 80e555c2 | Paolo Bonzini | if (!*str) {
|
471 | 80e555c2 | Paolo Bonzini | g_free(str); |
472 | 0a54a0ce | Paolo Bonzini | *ptr = NULL;
|
473 | 80e555c2 | Paolo Bonzini | return;
|
474 | 80e555c2 | Paolo Bonzini | } |
475 | 7b009e5d | Paolo Bonzini | ret = parse(dev, str, ptr); |
476 | 80e555c2 | Paolo Bonzini | error_set_from_qdev_prop_error(errp, ret, dev, prop, str); |
477 | 80e555c2 | Paolo Bonzini | g_free(str); |
478 | 80e555c2 | Paolo Bonzini | } |
479 | 80e555c2 | Paolo Bonzini | |
480 | 7b009e5d | Paolo Bonzini | static void get_drive(Object *obj, Visitor *v, void *opaque, |
481 | 7b009e5d | Paolo Bonzini | const char *name, Error **errp) |
482 | 7b009e5d | Paolo Bonzini | { |
483 | 7b009e5d | Paolo Bonzini | get_pointer(obj, v, opaque, print_drive, name, errp); |
484 | 7b009e5d | Paolo Bonzini | } |
485 | 7b009e5d | Paolo Bonzini | |
486 | 7b009e5d | Paolo Bonzini | static void set_drive(Object *obj, Visitor *v, void *opaque, |
487 | 7b009e5d | Paolo Bonzini | const char *name, Error **errp) |
488 | 7b009e5d | Paolo Bonzini | { |
489 | 7b009e5d | Paolo Bonzini | set_pointer(obj, v, opaque, parse_drive, name, errp); |
490 | 7b009e5d | Paolo Bonzini | } |
491 | 7b009e5d | Paolo Bonzini | |
492 | 14b41872 | Gerd Hoffmann | PropertyInfo qdev_prop_drive = { |
493 | 14b41872 | Gerd Hoffmann | .name = "drive",
|
494 | 7b009e5d | Paolo Bonzini | .get = get_drive, |
495 | 7b009e5d | Paolo Bonzini | .set = set_drive, |
496 | dd0ba250 | Paolo Bonzini | .release = release_drive, |
497 | 14b41872 | Gerd Hoffmann | }; |
498 | 14b41872 | Gerd Hoffmann | |
499 | 313feaab | Gerd Hoffmann | /* --- character device --- */
|
500 | 313feaab | Gerd Hoffmann | |
501 | 7b009e5d | Paolo Bonzini | static int parse_chr(DeviceState *dev, const char *str, void **ptr) |
502 | 06113719 | Gerd Hoffmann | { |
503 | 7b009e5d | Paolo Bonzini | CharDriverState *chr = qemu_chr_find(str); |
504 | 7b009e5d | Paolo Bonzini | if (chr == NULL) { |
505 | 6bf38816 | Markus Armbruster | return -ENOENT;
|
506 | 2d6c1ef4 | Amit Shah | } |
507 | 7b009e5d | Paolo Bonzini | if (chr->avail_connections < 1) { |
508 | 2d6c1ef4 | Amit Shah | return -EEXIST;
|
509 | 2d6c1ef4 | Amit Shah | } |
510 | 7b009e5d | Paolo Bonzini | *ptr = chr; |
511 | 7b009e5d | Paolo Bonzini | --chr->avail_connections; |
512 | 06113719 | Gerd Hoffmann | return 0; |
513 | 06113719 | Gerd Hoffmann | } |
514 | 06113719 | Gerd Hoffmann | |
515 | dd0ba250 | Paolo Bonzini | static void release_chr(Object *obj, const char *name, void *opaque) |
516 | a87f3e8b | Amit Shah | { |
517 | dd0ba250 | Paolo Bonzini | DeviceState *dev = DEVICE(obj); |
518 | dd0ba250 | Paolo Bonzini | Property *prop = opaque; |
519 | a87f3e8b | Amit Shah | CharDriverState **ptr = qdev_get_prop_ptr(dev, prop); |
520 | a87f3e8b | Amit Shah | |
521 | a87f3e8b | Amit Shah | if (*ptr) {
|
522 | a87f3e8b | Amit Shah | qemu_chr_add_handlers(*ptr, NULL, NULL, NULL, NULL); |
523 | a87f3e8b | Amit Shah | } |
524 | a87f3e8b | Amit Shah | } |
525 | a87f3e8b | Amit Shah | |
526 | a87f3e8b | Amit Shah | |
527 | 7b009e5d | Paolo Bonzini | static const char *print_chr(void *ptr) |
528 | 313feaab | Gerd Hoffmann | { |
529 | 7b009e5d | Paolo Bonzini | CharDriverState *chr = ptr; |
530 | bc19fcaa | Blue Swirl | |
531 | 7b009e5d | Paolo Bonzini | return chr->label ? chr->label : ""; |
532 | 7b009e5d | Paolo Bonzini | } |
533 | 7b009e5d | Paolo Bonzini | |
534 | 7b009e5d | Paolo Bonzini | static void get_chr(Object *obj, Visitor *v, void *opaque, |
535 | 7b009e5d | Paolo Bonzini | const char *name, Error **errp) |
536 | 7b009e5d | Paolo Bonzini | { |
537 | 7b009e5d | Paolo Bonzini | get_pointer(obj, v, opaque, print_chr, name, errp); |
538 | 7b009e5d | Paolo Bonzini | } |
539 | 7b009e5d | Paolo Bonzini | |
540 | 7b009e5d | Paolo Bonzini | static void set_chr(Object *obj, Visitor *v, void *opaque, |
541 | 7b009e5d | Paolo Bonzini | const char *name, Error **errp) |
542 | 7b009e5d | Paolo Bonzini | { |
543 | 7b009e5d | Paolo Bonzini | set_pointer(obj, v, opaque, parse_chr, name, errp); |
544 | 313feaab | Gerd Hoffmann | } |
545 | 313feaab | Gerd Hoffmann | |
546 | 313feaab | Gerd Hoffmann | PropertyInfo qdev_prop_chr = { |
547 | 313feaab | Gerd Hoffmann | .name = "chr",
|
548 | 7b009e5d | Paolo Bonzini | .get = get_chr, |
549 | 7b009e5d | Paolo Bonzini | .set = set_chr, |
550 | dd0ba250 | Paolo Bonzini | .release = release_chr, |
551 | 313feaab | Gerd Hoffmann | }; |
552 | 313feaab | Gerd Hoffmann | |
553 | 2ef924b4 | Gerd Hoffmann | /* --- netdev device --- */
|
554 | 2ef924b4 | Gerd Hoffmann | |
555 | 7b009e5d | Paolo Bonzini | static int parse_netdev(DeviceState *dev, const char *str, void **ptr) |
556 | 2ef924b4 | Gerd Hoffmann | { |
557 | 7b009e5d | Paolo Bonzini | VLANClientState *netdev = qemu_find_netdev(str); |
558 | 2ef924b4 | Gerd Hoffmann | |
559 | 7b009e5d | Paolo Bonzini | if (netdev == NULL) { |
560 | 6bf38816 | Markus Armbruster | return -ENOENT;
|
561 | 7b009e5d | Paolo Bonzini | } |
562 | 7b009e5d | Paolo Bonzini | if (netdev->peer) {
|
563 | 27f3f8a3 | Markus Armbruster | return -EEXIST;
|
564 | 27f3f8a3 | Markus Armbruster | } |
565 | 7b009e5d | Paolo Bonzini | *ptr = netdev; |
566 | 2ef924b4 | Gerd Hoffmann | return 0; |
567 | 2ef924b4 | Gerd Hoffmann | } |
568 | 2ef924b4 | Gerd Hoffmann | |
569 | 7b009e5d | Paolo Bonzini | static const char *print_netdev(void *ptr) |
570 | 2ef924b4 | Gerd Hoffmann | { |
571 | 7b009e5d | Paolo Bonzini | VLANClientState *netdev = ptr; |
572 | 2ef924b4 | Gerd Hoffmann | |
573 | 7b009e5d | Paolo Bonzini | return netdev->name ? netdev->name : ""; |
574 | 7b009e5d | Paolo Bonzini | } |
575 | 7b009e5d | Paolo Bonzini | |
576 | 7b009e5d | Paolo Bonzini | static void get_netdev(Object *obj, Visitor *v, void *opaque, |
577 | 7b009e5d | Paolo Bonzini | const char *name, Error **errp) |
578 | 7b009e5d | Paolo Bonzini | { |
579 | 7b009e5d | Paolo Bonzini | get_pointer(obj, v, opaque, print_netdev, name, errp); |
580 | 7b009e5d | Paolo Bonzini | } |
581 | 7b009e5d | Paolo Bonzini | |
582 | 7b009e5d | Paolo Bonzini | static void set_netdev(Object *obj, Visitor *v, void *opaque, |
583 | 7b009e5d | Paolo Bonzini | const char *name, Error **errp) |
584 | 7b009e5d | Paolo Bonzini | { |
585 | 7b009e5d | Paolo Bonzini | set_pointer(obj, v, opaque, parse_netdev, name, errp); |
586 | 2ef924b4 | Gerd Hoffmann | } |
587 | 2ef924b4 | Gerd Hoffmann | |
588 | 2ef924b4 | Gerd Hoffmann | PropertyInfo qdev_prop_netdev = { |
589 | 2ef924b4 | Gerd Hoffmann | .name = "netdev",
|
590 | 7b009e5d | Paolo Bonzini | .get = get_netdev, |
591 | 7b009e5d | Paolo Bonzini | .set = set_netdev, |
592 | 2ef924b4 | Gerd Hoffmann | }; |
593 | 2ef924b4 | Gerd Hoffmann | |
594 | 851bec09 | Gerd Hoffmann | /* --- vlan --- */
|
595 | 851bec09 | Gerd Hoffmann | |
596 | 851bec09 | Gerd Hoffmann | static int print_vlan(DeviceState *dev, Property *prop, char *dest, size_t len) |
597 | 851bec09 | Gerd Hoffmann | { |
598 | 851bec09 | Gerd Hoffmann | VLANState **ptr = qdev_get_prop_ptr(dev, prop); |
599 | 851bec09 | Gerd Hoffmann | |
600 | 851bec09 | Gerd Hoffmann | if (*ptr) {
|
601 | 851bec09 | Gerd Hoffmann | return snprintf(dest, len, "%d", (*ptr)->id); |
602 | 851bec09 | Gerd Hoffmann | } else {
|
603 | 851bec09 | Gerd Hoffmann | return snprintf(dest, len, "<null>"); |
604 | 851bec09 | Gerd Hoffmann | } |
605 | 851bec09 | Gerd Hoffmann | } |
606 | 851bec09 | Gerd Hoffmann | |
607 | 57c9fafe | Anthony Liguori | static void get_vlan(Object *obj, Visitor *v, void *opaque, |
608 | 80e555c2 | Paolo Bonzini | const char *name, Error **errp) |
609 | 80e555c2 | Paolo Bonzini | { |
610 | 57c9fafe | Anthony Liguori | DeviceState *dev = DEVICE(obj); |
611 | 80e555c2 | Paolo Bonzini | Property *prop = opaque; |
612 | 80e555c2 | Paolo Bonzini | VLANState **ptr = qdev_get_prop_ptr(dev, prop); |
613 | 80e555c2 | Paolo Bonzini | int64_t id; |
614 | 80e555c2 | Paolo Bonzini | |
615 | 80e555c2 | Paolo Bonzini | id = *ptr ? (*ptr)->id : -1;
|
616 | c08fb2ac | Michael Roth | visit_type_int64(v, &id, name, errp); |
617 | 80e555c2 | Paolo Bonzini | } |
618 | 80e555c2 | Paolo Bonzini | |
619 | 57c9fafe | Anthony Liguori | static void set_vlan(Object *obj, Visitor *v, void *opaque, |
620 | 80e555c2 | Paolo Bonzini | const char *name, Error **errp) |
621 | 80e555c2 | Paolo Bonzini | { |
622 | 57c9fafe | Anthony Liguori | DeviceState *dev = DEVICE(obj); |
623 | 80e555c2 | Paolo Bonzini | Property *prop = opaque; |
624 | 80e555c2 | Paolo Bonzini | VLANState **ptr = qdev_get_prop_ptr(dev, prop); |
625 | 80e555c2 | Paolo Bonzini | Error *local_err = NULL;
|
626 | 80e555c2 | Paolo Bonzini | int64_t id; |
627 | 80e555c2 | Paolo Bonzini | VLANState *vlan; |
628 | 80e555c2 | Paolo Bonzini | |
629 | 80e555c2 | Paolo Bonzini | if (dev->state != DEV_STATE_CREATED) {
|
630 | 80e555c2 | Paolo Bonzini | error_set(errp, QERR_PERMISSION_DENIED); |
631 | 80e555c2 | Paolo Bonzini | return;
|
632 | 80e555c2 | Paolo Bonzini | } |
633 | 80e555c2 | Paolo Bonzini | |
634 | c08fb2ac | Michael Roth | visit_type_int64(v, &id, name, &local_err); |
635 | 80e555c2 | Paolo Bonzini | if (local_err) {
|
636 | 80e555c2 | Paolo Bonzini | error_propagate(errp, local_err); |
637 | 80e555c2 | Paolo Bonzini | return;
|
638 | 80e555c2 | Paolo Bonzini | } |
639 | 80e555c2 | Paolo Bonzini | if (id == -1) { |
640 | 80e555c2 | Paolo Bonzini | *ptr = NULL;
|
641 | 80e555c2 | Paolo Bonzini | return;
|
642 | 80e555c2 | Paolo Bonzini | } |
643 | 80e555c2 | Paolo Bonzini | vlan = qemu_find_vlan(id, 1);
|
644 | 80e555c2 | Paolo Bonzini | if (!vlan) {
|
645 | 80e555c2 | Paolo Bonzini | error_set(errp, QERR_INVALID_PARAMETER_VALUE, |
646 | 80e555c2 | Paolo Bonzini | name, prop->info->name); |
647 | 80e555c2 | Paolo Bonzini | return;
|
648 | 80e555c2 | Paolo Bonzini | } |
649 | 80e555c2 | Paolo Bonzini | *ptr = vlan; |
650 | 80e555c2 | Paolo Bonzini | } |
651 | 80e555c2 | Paolo Bonzini | |
652 | 851bec09 | Gerd Hoffmann | PropertyInfo qdev_prop_vlan = { |
653 | 851bec09 | Gerd Hoffmann | .name = "vlan",
|
654 | 851bec09 | Gerd Hoffmann | .print = print_vlan, |
655 | 80e555c2 | Paolo Bonzini | .get = get_vlan, |
656 | 80e555c2 | Paolo Bonzini | .set = set_vlan, |
657 | 851bec09 | Gerd Hoffmann | }; |
658 | 851bec09 | Gerd Hoffmann | |
659 | ee6847d1 | Gerd Hoffmann | /* --- pointer --- */
|
660 | ee6847d1 | Gerd Hoffmann | |
661 | 036f7166 | Markus Armbruster | /* Not a proper property, just for dirty hacks. TODO Remove it! */
|
662 | ee6847d1 | Gerd Hoffmann | PropertyInfo qdev_prop_ptr = { |
663 | ee6847d1 | Gerd Hoffmann | .name = "ptr",
|
664 | ee6847d1 | Gerd Hoffmann | }; |
665 | ee6847d1 | Gerd Hoffmann | |
666 | ee6847d1 | Gerd Hoffmann | /* --- mac address --- */
|
667 | ee6847d1 | Gerd Hoffmann | |
668 | ee6847d1 | Gerd Hoffmann | /*
|
669 | ee6847d1 | Gerd Hoffmann | * accepted syntax versions:
|
670 | ee6847d1 | Gerd Hoffmann | * 01:02:03:04:05:06
|
671 | ee6847d1 | Gerd Hoffmann | * 01-02-03-04-05-06
|
672 | ee6847d1 | Gerd Hoffmann | */
|
673 | e39e5d60 | Paolo Bonzini | static void get_mac(Object *obj, Visitor *v, void *opaque, |
674 | e39e5d60 | Paolo Bonzini | const char *name, Error **errp) |
675 | ee6847d1 | Gerd Hoffmann | { |
676 | e39e5d60 | Paolo Bonzini | DeviceState *dev = DEVICE(obj); |
677 | e39e5d60 | Paolo Bonzini | Property *prop = opaque; |
678 | 1503fff3 | Gerd Hoffmann | MACAddr *mac = qdev_get_prop_ptr(dev, prop); |
679 | e39e5d60 | Paolo Bonzini | char buffer[2 * 6 + 5 + 1]; |
680 | e39e5d60 | Paolo Bonzini | char *p = buffer;
|
681 | e39e5d60 | Paolo Bonzini | |
682 | e39e5d60 | Paolo Bonzini | snprintf(buffer, sizeof(buffer), "%02x:%02x:%02x:%02x:%02x:%02x", |
683 | e39e5d60 | Paolo Bonzini | mac->a[0], mac->a[1], mac->a[2], |
684 | e39e5d60 | Paolo Bonzini | mac->a[3], mac->a[4], mac->a[5]); |
685 | e39e5d60 | Paolo Bonzini | |
686 | e39e5d60 | Paolo Bonzini | visit_type_str(v, &p, name, errp); |
687 | e39e5d60 | Paolo Bonzini | } |
688 | e39e5d60 | Paolo Bonzini | |
689 | e39e5d60 | Paolo Bonzini | static void set_mac(Object *obj, Visitor *v, void *opaque, |
690 | e39e5d60 | Paolo Bonzini | const char *name, Error **errp) |
691 | e39e5d60 | Paolo Bonzini | { |
692 | e39e5d60 | Paolo Bonzini | DeviceState *dev = DEVICE(obj); |
693 | e39e5d60 | Paolo Bonzini | Property *prop = opaque; |
694 | e39e5d60 | Paolo Bonzini | MACAddr *mac = qdev_get_prop_ptr(dev, prop); |
695 | e39e5d60 | Paolo Bonzini | Error *local_err = NULL;
|
696 | ee6847d1 | Gerd Hoffmann | int i, pos;
|
697 | e39e5d60 | Paolo Bonzini | char *str, *p;
|
698 | e39e5d60 | Paolo Bonzini | |
699 | e39e5d60 | Paolo Bonzini | if (dev->state != DEV_STATE_CREATED) {
|
700 | e39e5d60 | Paolo Bonzini | error_set(errp, QERR_PERMISSION_DENIED); |
701 | e39e5d60 | Paolo Bonzini | return;
|
702 | e39e5d60 | Paolo Bonzini | } |
703 | e39e5d60 | Paolo Bonzini | |
704 | e39e5d60 | Paolo Bonzini | visit_type_str(v, &str, name, &local_err); |
705 | e39e5d60 | Paolo Bonzini | if (local_err) {
|
706 | e39e5d60 | Paolo Bonzini | error_propagate(errp, local_err); |
707 | e39e5d60 | Paolo Bonzini | return;
|
708 | e39e5d60 | Paolo Bonzini | } |
709 | ee6847d1 | Gerd Hoffmann | |
710 | ee6847d1 | Gerd Hoffmann | for (i = 0, pos = 0; i < 6; i++, pos += 3) { |
711 | 88e150a5 | Christoph Egger | if (!qemu_isxdigit(str[pos]))
|
712 | e39e5d60 | Paolo Bonzini | goto inval;
|
713 | 88e150a5 | Christoph Egger | if (!qemu_isxdigit(str[pos+1])) |
714 | e39e5d60 | Paolo Bonzini | goto inval;
|
715 | 1503fff3 | Gerd Hoffmann | if (i == 5) { |
716 | 1503fff3 | Gerd Hoffmann | if (str[pos+2] != '\0') |
717 | e39e5d60 | Paolo Bonzini | goto inval;
|
718 | 1503fff3 | Gerd Hoffmann | } else {
|
719 | 1503fff3 | Gerd Hoffmann | if (str[pos+2] != ':' && str[pos+2] != '-') |
720 | e39e5d60 | Paolo Bonzini | goto inval;
|
721 | 1503fff3 | Gerd Hoffmann | } |
722 | 1503fff3 | Gerd Hoffmann | mac->a[i] = strtol(str+pos, &p, 16);
|
723 | ee6847d1 | Gerd Hoffmann | } |
724 | a3400466 | dunrong huang | g_free(str); |
725 | e39e5d60 | Paolo Bonzini | return;
|
726 | 1503fff3 | Gerd Hoffmann | |
727 | e39e5d60 | Paolo Bonzini | inval:
|
728 | e39e5d60 | Paolo Bonzini | error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str); |
729 | a3400466 | dunrong huang | g_free(str); |
730 | ee6847d1 | Gerd Hoffmann | } |
731 | ee6847d1 | Gerd Hoffmann | |
732 | ee6847d1 | Gerd Hoffmann | PropertyInfo qdev_prop_macaddr = { |
733 | 1503fff3 | Gerd Hoffmann | .name = "macaddr",
|
734 | e39e5d60 | Paolo Bonzini | .get = get_mac, |
735 | e39e5d60 | Paolo Bonzini | .set = set_mac, |
736 | ee6847d1 | Gerd Hoffmann | }; |
737 | ee6847d1 | Gerd Hoffmann | |
738 | 4e4fa398 | Jan Kiszka | |
739 | 4e4fa398 | Jan Kiszka | /* --- lost tick policy --- */
|
740 | 4e4fa398 | Jan Kiszka | |
741 | 1ce05125 | Paolo Bonzini | static const char *lost_tick_policy_table[LOST_TICK_MAX+1] = { |
742 | 1ce05125 | Paolo Bonzini | [LOST_TICK_DISCARD] = "discard",
|
743 | 1ce05125 | Paolo Bonzini | [LOST_TICK_DELAY] = "delay",
|
744 | 1ce05125 | Paolo Bonzini | [LOST_TICK_MERGE] = "merge",
|
745 | 1ce05125 | Paolo Bonzini | [LOST_TICK_SLEW] = "slew",
|
746 | 1ce05125 | Paolo Bonzini | [LOST_TICK_MAX] = NULL,
|
747 | 4e4fa398 | Jan Kiszka | }; |
748 | 4e4fa398 | Jan Kiszka | |
749 | 1ce05125 | Paolo Bonzini | QEMU_BUILD_BUG_ON(sizeof(LostTickPolicy) != sizeof(int)); |
750 | 1ce05125 | Paolo Bonzini | |
751 | 1ce05125 | Paolo Bonzini | static void get_enum(Object *obj, Visitor *v, void *opaque, |
752 | 1ce05125 | Paolo Bonzini | const char *name, Error **errp) |
753 | 4e4fa398 | Jan Kiszka | { |
754 | 1ce05125 | Paolo Bonzini | DeviceState *dev = DEVICE(obj); |
755 | 1ce05125 | Paolo Bonzini | Property *prop = opaque; |
756 | 1ce05125 | Paolo Bonzini | int *ptr = qdev_get_prop_ptr(dev, prop);
|
757 | 4e4fa398 | Jan Kiszka | |
758 | 1ce05125 | Paolo Bonzini | visit_type_enum(v, ptr, prop->info->enum_table, |
759 | 1ce05125 | Paolo Bonzini | prop->info->name, prop->name, errp); |
760 | 4e4fa398 | Jan Kiszka | } |
761 | 4e4fa398 | Jan Kiszka | |
762 | 1ce05125 | Paolo Bonzini | static void set_enum(Object *obj, Visitor *v, void *opaque, |
763 | 1ce05125 | Paolo Bonzini | const char *name, Error **errp) |
764 | 4e4fa398 | Jan Kiszka | { |
765 | 1ce05125 | Paolo Bonzini | DeviceState *dev = DEVICE(obj); |
766 | 1ce05125 | Paolo Bonzini | Property *prop = opaque; |
767 | 1ce05125 | Paolo Bonzini | int *ptr = qdev_get_prop_ptr(dev, prop);
|
768 | 4e4fa398 | Jan Kiszka | |
769 | 1ce05125 | Paolo Bonzini | if (dev->state != DEV_STATE_CREATED) {
|
770 | 1ce05125 | Paolo Bonzini | error_set(errp, QERR_PERMISSION_DENIED); |
771 | 1ce05125 | Paolo Bonzini | return;
|
772 | 1ce05125 | Paolo Bonzini | } |
773 | 1ce05125 | Paolo Bonzini | |
774 | 1ce05125 | Paolo Bonzini | visit_type_enum(v, ptr, prop->info->enum_table, |
775 | 1ce05125 | Paolo Bonzini | prop->info->name, prop->name, errp); |
776 | 4e4fa398 | Jan Kiszka | } |
777 | 4e4fa398 | Jan Kiszka | |
778 | 4e4fa398 | Jan Kiszka | PropertyInfo qdev_prop_losttickpolicy = { |
779 | 1ce05125 | Paolo Bonzini | .name = "LostTickPolicy",
|
780 | 1ce05125 | Paolo Bonzini | .enum_table = lost_tick_policy_table, |
781 | 1ce05125 | Paolo Bonzini | .get = get_enum, |
782 | 1ce05125 | Paolo Bonzini | .set = set_enum, |
783 | 4e4fa398 | Jan Kiszka | }; |
784 | 4e4fa398 | Jan Kiszka | |
785 | 05cb5fe4 | Gerd Hoffmann | /* --- pci address --- */
|
786 | 05cb5fe4 | Gerd Hoffmann | |
787 | 05cb5fe4 | Gerd Hoffmann | /*
|
788 | 05cb5fe4 | Gerd Hoffmann | * bus-local address, i.e. "$slot" or "$slot.$fn"
|
789 | 05cb5fe4 | Gerd Hoffmann | */
|
790 | 768a9ebe | Paolo Bonzini | static void set_pci_devfn(Object *obj, Visitor *v, void *opaque, |
791 | 768a9ebe | Paolo Bonzini | const char *name, Error **errp) |
792 | 05cb5fe4 | Gerd Hoffmann | { |
793 | 768a9ebe | Paolo Bonzini | DeviceState *dev = DEVICE(obj); |
794 | 768a9ebe | Paolo Bonzini | Property *prop = opaque; |
795 | 27712df9 | Paolo Bonzini | int32_t value, *ptr = qdev_get_prop_ptr(dev, prop); |
796 | 05cb5fe4 | Gerd Hoffmann | unsigned int slot, fn, n; |
797 | 768a9ebe | Paolo Bonzini | Error *local_err = NULL;
|
798 | a3400466 | dunrong huang | char *str;
|
799 | 768a9ebe | Paolo Bonzini | |
800 | 768a9ebe | Paolo Bonzini | if (dev->state != DEV_STATE_CREATED) {
|
801 | 768a9ebe | Paolo Bonzini | error_set(errp, QERR_PERMISSION_DENIED); |
802 | 768a9ebe | Paolo Bonzini | return;
|
803 | 768a9ebe | Paolo Bonzini | } |
804 | 768a9ebe | Paolo Bonzini | |
805 | 768a9ebe | Paolo Bonzini | visit_type_str(v, &str, name, &local_err); |
806 | 768a9ebe | Paolo Bonzini | if (local_err) {
|
807 | 5c878008 | Stefan Weil | error_free(local_err); |
808 | 27712df9 | Paolo Bonzini | local_err = NULL;
|
809 | 27712df9 | Paolo Bonzini | visit_type_int32(v, &value, name, &local_err); |
810 | 27712df9 | Paolo Bonzini | if (local_err) {
|
811 | 27712df9 | Paolo Bonzini | error_propagate(errp, local_err); |
812 | 27712df9 | Paolo Bonzini | } else if (value < -1 || value > 255) { |
813 | 27712df9 | Paolo Bonzini | error_set(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "null",
|
814 | 27712df9 | Paolo Bonzini | "pci_devfn");
|
815 | 27712df9 | Paolo Bonzini | } else {
|
816 | 27712df9 | Paolo Bonzini | *ptr = value; |
817 | 27712df9 | Paolo Bonzini | } |
818 | 27712df9 | Paolo Bonzini | return;
|
819 | 768a9ebe | Paolo Bonzini | } |
820 | 05cb5fe4 | Gerd Hoffmann | |
821 | 05cb5fe4 | Gerd Hoffmann | if (sscanf(str, "%x.%x%n", &slot, &fn, &n) != 2) { |
822 | 05cb5fe4 | Gerd Hoffmann | fn = 0;
|
823 | 05cb5fe4 | Gerd Hoffmann | if (sscanf(str, "%x%n", &slot, &n) != 1) { |
824 | 768a9ebe | Paolo Bonzini | goto invalid;
|
825 | 05cb5fe4 | Gerd Hoffmann | } |
826 | 05cb5fe4 | Gerd Hoffmann | } |
827 | 768a9ebe | Paolo Bonzini | if (str[n] != '\0' || fn > 7 || slot > 31) { |
828 | 768a9ebe | Paolo Bonzini | goto invalid;
|
829 | 768a9ebe | Paolo Bonzini | } |
830 | 05cb5fe4 | Gerd Hoffmann | *ptr = slot << 3 | fn;
|
831 | a3400466 | dunrong huang | g_free(str); |
832 | 768a9ebe | Paolo Bonzini | return;
|
833 | 768a9ebe | Paolo Bonzini | |
834 | 768a9ebe | Paolo Bonzini | invalid:
|
835 | 768a9ebe | Paolo Bonzini | error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str); |
836 | a3400466 | dunrong huang | g_free(str); |
837 | 05cb5fe4 | Gerd Hoffmann | } |
838 | 05cb5fe4 | Gerd Hoffmann | |
839 | 05cb5fe4 | Gerd Hoffmann | static int print_pci_devfn(DeviceState *dev, Property *prop, char *dest, size_t len) |
840 | 05cb5fe4 | Gerd Hoffmann | { |
841 | 09f1bbcd | Michael Roth | int32_t *ptr = qdev_get_prop_ptr(dev, prop); |
842 | 05cb5fe4 | Gerd Hoffmann | |
843 | 73538c31 | Blue Swirl | if (*ptr == -1) { |
844 | 05cb5fe4 | Gerd Hoffmann | return snprintf(dest, len, "<unset>"); |
845 | 05cb5fe4 | Gerd Hoffmann | } else {
|
846 | 05cb5fe4 | Gerd Hoffmann | return snprintf(dest, len, "%02x.%x", *ptr >> 3, *ptr & 7); |
847 | 05cb5fe4 | Gerd Hoffmann | } |
848 | 05cb5fe4 | Gerd Hoffmann | } |
849 | 05cb5fe4 | Gerd Hoffmann | |
850 | 05cb5fe4 | Gerd Hoffmann | PropertyInfo qdev_prop_pci_devfn = { |
851 | b403298a | Paolo Bonzini | .name = "int32",
|
852 | b403298a | Paolo Bonzini | .legacy_name = "pci-devfn",
|
853 | 05cb5fe4 | Gerd Hoffmann | .print = print_pci_devfn, |
854 | b403298a | Paolo Bonzini | .get = get_int32, |
855 | 768a9ebe | Paolo Bonzini | .set = set_pci_devfn, |
856 | 05cb5fe4 | Gerd Hoffmann | }; |
857 | 05cb5fe4 | Gerd Hoffmann | |
858 | 02fda01c | Stefan Hajnoczi | /* --- blocksize --- */
|
859 | 02fda01c | Stefan Hajnoczi | |
860 | 02fda01c | Stefan Hajnoczi | static void set_blocksize(Object *obj, Visitor *v, void *opaque, |
861 | 02fda01c | Stefan Hajnoczi | const char *name, Error **errp) |
862 | 02fda01c | Stefan Hajnoczi | { |
863 | 02fda01c | Stefan Hajnoczi | DeviceState *dev = DEVICE(obj); |
864 | 02fda01c | Stefan Hajnoczi | Property *prop = opaque; |
865 | c08fb2ac | Michael Roth | uint16_t value, *ptr = qdev_get_prop_ptr(dev, prop); |
866 | 02fda01c | Stefan Hajnoczi | Error *local_err = NULL;
|
867 | 27712df9 | Paolo Bonzini | const int64_t min = 512; |
868 | 27712df9 | Paolo Bonzini | const int64_t max = 32768; |
869 | 02fda01c | Stefan Hajnoczi | |
870 | 02fda01c | Stefan Hajnoczi | if (dev->state != DEV_STATE_CREATED) {
|
871 | 02fda01c | Stefan Hajnoczi | error_set(errp, QERR_PERMISSION_DENIED); |
872 | 02fda01c | Stefan Hajnoczi | return;
|
873 | 02fda01c | Stefan Hajnoczi | } |
874 | 02fda01c | Stefan Hajnoczi | |
875 | c08fb2ac | Michael Roth | visit_type_uint16(v, &value, name, &local_err); |
876 | 02fda01c | Stefan Hajnoczi | if (local_err) {
|
877 | 02fda01c | Stefan Hajnoczi | error_propagate(errp, local_err); |
878 | 02fda01c | Stefan Hajnoczi | return;
|
879 | 02fda01c | Stefan Hajnoczi | } |
880 | 27712df9 | Paolo Bonzini | if (value < min || value > max) {
|
881 | 02fda01c | Stefan Hajnoczi | error_set(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, |
882 | 27712df9 | Paolo Bonzini | dev->id?:"", name, (int64_t)value, min, max);
|
883 | 02fda01c | Stefan Hajnoczi | return;
|
884 | 02fda01c | Stefan Hajnoczi | } |
885 | 02fda01c | Stefan Hajnoczi | |
886 | 02fda01c | Stefan Hajnoczi | /* We rely on power-of-2 blocksizes for bitmasks */
|
887 | 02fda01c | Stefan Hajnoczi | if ((value & (value - 1)) != 0) { |
888 | 02fda01c | Stefan Hajnoczi | error_set(errp, QERR_PROPERTY_VALUE_NOT_POWER_OF_2, |
889 | c08fb2ac | Michael Roth | dev->id?:"", name, (int64_t)value);
|
890 | 02fda01c | Stefan Hajnoczi | return;
|
891 | 02fda01c | Stefan Hajnoczi | } |
892 | 02fda01c | Stefan Hajnoczi | |
893 | 02fda01c | Stefan Hajnoczi | *ptr = value; |
894 | 02fda01c | Stefan Hajnoczi | } |
895 | 02fda01c | Stefan Hajnoczi | |
896 | 02fda01c | Stefan Hajnoczi | PropertyInfo qdev_prop_blocksize = { |
897 | 02fda01c | Stefan Hajnoczi | .name = "blocksize",
|
898 | c08fb2ac | Michael Roth | .get = get_uint16, |
899 | 02fda01c | Stefan Hajnoczi | .set = set_blocksize, |
900 | 02fda01c | Stefan Hajnoczi | }; |
901 | 02fda01c | Stefan Hajnoczi | |
902 | 679042f0 | Anthony PERARD | /* --- pci host address --- */
|
903 | 679042f0 | Anthony PERARD | |
904 | 679042f0 | Anthony PERARD | static void get_pci_host_devaddr(Object *obj, Visitor *v, void *opaque, |
905 | 679042f0 | Anthony PERARD | const char *name, Error **errp) |
906 | 679042f0 | Anthony PERARD | { |
907 | 679042f0 | Anthony PERARD | DeviceState *dev = DEVICE(obj); |
908 | 679042f0 | Anthony PERARD | Property *prop = opaque; |
909 | 679042f0 | Anthony PERARD | PCIHostDeviceAddress *addr = qdev_get_prop_ptr(dev, prop); |
910 | 679042f0 | Anthony PERARD | char buffer[] = "xxxx:xx:xx.x"; |
911 | 679042f0 | Anthony PERARD | char *p = buffer;
|
912 | 679042f0 | Anthony PERARD | int rc = 0; |
913 | 679042f0 | Anthony PERARD | |
914 | 679042f0 | Anthony PERARD | rc = snprintf(buffer, sizeof(buffer), "%04x:%02x:%02x.%d", |
915 | 679042f0 | Anthony PERARD | addr->domain, addr->bus, addr->slot, addr->function); |
916 | 679042f0 | Anthony PERARD | assert(rc == sizeof(buffer) - 1); |
917 | 679042f0 | Anthony PERARD | |
918 | 679042f0 | Anthony PERARD | visit_type_str(v, &p, name, errp); |
919 | 679042f0 | Anthony PERARD | } |
920 | 679042f0 | Anthony PERARD | |
921 | 679042f0 | Anthony PERARD | /*
|
922 | 679042f0 | Anthony PERARD | * Parse [<domain>:]<bus>:<slot>.<func>
|
923 | 679042f0 | Anthony PERARD | * if <domain> is not supplied, it's assumed to be 0.
|
924 | 679042f0 | Anthony PERARD | */
|
925 | 679042f0 | Anthony PERARD | static void set_pci_host_devaddr(Object *obj, Visitor *v, void *opaque, |
926 | 679042f0 | Anthony PERARD | const char *name, Error **errp) |
927 | 679042f0 | Anthony PERARD | { |
928 | 679042f0 | Anthony PERARD | DeviceState *dev = DEVICE(obj); |
929 | 679042f0 | Anthony PERARD | Property *prop = opaque; |
930 | 679042f0 | Anthony PERARD | PCIHostDeviceAddress *addr = qdev_get_prop_ptr(dev, prop); |
931 | 679042f0 | Anthony PERARD | Error *local_err = NULL;
|
932 | 679042f0 | Anthony PERARD | char *str, *p;
|
933 | 679042f0 | Anthony PERARD | char *e;
|
934 | 679042f0 | Anthony PERARD | unsigned long val; |
935 | 679042f0 | Anthony PERARD | unsigned long dom = 0, bus = 0; |
936 | 679042f0 | Anthony PERARD | unsigned int slot = 0, func = 0; |
937 | 679042f0 | Anthony PERARD | |
938 | 679042f0 | Anthony PERARD | if (dev->state != DEV_STATE_CREATED) {
|
939 | 679042f0 | Anthony PERARD | error_set(errp, QERR_PERMISSION_DENIED); |
940 | 679042f0 | Anthony PERARD | return;
|
941 | 679042f0 | Anthony PERARD | } |
942 | 679042f0 | Anthony PERARD | |
943 | 679042f0 | Anthony PERARD | visit_type_str(v, &str, name, &local_err); |
944 | 679042f0 | Anthony PERARD | if (local_err) {
|
945 | 679042f0 | Anthony PERARD | error_propagate(errp, local_err); |
946 | 679042f0 | Anthony PERARD | return;
|
947 | 679042f0 | Anthony PERARD | } |
948 | 679042f0 | Anthony PERARD | |
949 | 679042f0 | Anthony PERARD | p = str; |
950 | 679042f0 | Anthony PERARD | val = strtoul(p, &e, 16);
|
951 | 679042f0 | Anthony PERARD | if (e == p || *e != ':') { |
952 | 679042f0 | Anthony PERARD | goto inval;
|
953 | 679042f0 | Anthony PERARD | } |
954 | 679042f0 | Anthony PERARD | bus = val; |
955 | 679042f0 | Anthony PERARD | |
956 | 679042f0 | Anthony PERARD | p = e + 1;
|
957 | 679042f0 | Anthony PERARD | val = strtoul(p, &e, 16);
|
958 | 679042f0 | Anthony PERARD | if (e == p) {
|
959 | 679042f0 | Anthony PERARD | goto inval;
|
960 | 679042f0 | Anthony PERARD | } |
961 | 679042f0 | Anthony PERARD | if (*e == ':') { |
962 | 679042f0 | Anthony PERARD | dom = bus; |
963 | 679042f0 | Anthony PERARD | bus = val; |
964 | 679042f0 | Anthony PERARD | p = e + 1;
|
965 | 679042f0 | Anthony PERARD | val = strtoul(p, &e, 16);
|
966 | 679042f0 | Anthony PERARD | if (e == p) {
|
967 | 679042f0 | Anthony PERARD | goto inval;
|
968 | 679042f0 | Anthony PERARD | } |
969 | 679042f0 | Anthony PERARD | } |
970 | 679042f0 | Anthony PERARD | slot = val; |
971 | 679042f0 | Anthony PERARD | |
972 | 679042f0 | Anthony PERARD | if (*e != '.') { |
973 | 679042f0 | Anthony PERARD | goto inval;
|
974 | 679042f0 | Anthony PERARD | } |
975 | 679042f0 | Anthony PERARD | p = e + 1;
|
976 | 679042f0 | Anthony PERARD | val = strtoul(p, &e, 10);
|
977 | 679042f0 | Anthony PERARD | if (e == p) {
|
978 | 679042f0 | Anthony PERARD | goto inval;
|
979 | 679042f0 | Anthony PERARD | } |
980 | 679042f0 | Anthony PERARD | func = val; |
981 | 679042f0 | Anthony PERARD | |
982 | 679042f0 | Anthony PERARD | if (dom > 0xffff || bus > 0xff || slot > 0x1f || func > 7) { |
983 | 679042f0 | Anthony PERARD | goto inval;
|
984 | 679042f0 | Anthony PERARD | } |
985 | 679042f0 | Anthony PERARD | |
986 | 679042f0 | Anthony PERARD | if (*e) {
|
987 | 679042f0 | Anthony PERARD | goto inval;
|
988 | 679042f0 | Anthony PERARD | } |
989 | 679042f0 | Anthony PERARD | |
990 | 679042f0 | Anthony PERARD | addr->domain = dom; |
991 | 679042f0 | Anthony PERARD | addr->bus = bus; |
992 | 679042f0 | Anthony PERARD | addr->slot = slot; |
993 | 679042f0 | Anthony PERARD | addr->function = func; |
994 | 679042f0 | Anthony PERARD | |
995 | 679042f0 | Anthony PERARD | g_free(str); |
996 | 679042f0 | Anthony PERARD | return;
|
997 | 679042f0 | Anthony PERARD | |
998 | 679042f0 | Anthony PERARD | inval:
|
999 | 679042f0 | Anthony PERARD | error_set_from_qdev_prop_error(errp, EINVAL, dev, prop, str); |
1000 | 679042f0 | Anthony PERARD | g_free(str); |
1001 | 679042f0 | Anthony PERARD | } |
1002 | 679042f0 | Anthony PERARD | |
1003 | 679042f0 | Anthony PERARD | PropertyInfo qdev_prop_pci_host_devaddr = { |
1004 | 679042f0 | Anthony PERARD | .name = "pci-host-devaddr",
|
1005 | 679042f0 | Anthony PERARD | .get = get_pci_host_devaddr, |
1006 | 679042f0 | Anthony PERARD | .set = set_pci_host_devaddr, |
1007 | 679042f0 | Anthony PERARD | }; |
1008 | 679042f0 | Anthony PERARD | |
1009 | ee6847d1 | Gerd Hoffmann | /* --- public helpers --- */
|
1010 | ee6847d1 | Gerd Hoffmann | |
1011 | ee6847d1 | Gerd Hoffmann | static Property *qdev_prop_walk(Property *props, const char *name) |
1012 | ee6847d1 | Gerd Hoffmann | { |
1013 | ee6847d1 | Gerd Hoffmann | if (!props)
|
1014 | ee6847d1 | Gerd Hoffmann | return NULL; |
1015 | ee6847d1 | Gerd Hoffmann | while (props->name) {
|
1016 | ee6847d1 | Gerd Hoffmann | if (strcmp(props->name, name) == 0) |
1017 | ee6847d1 | Gerd Hoffmann | return props;
|
1018 | ee6847d1 | Gerd Hoffmann | props++; |
1019 | ee6847d1 | Gerd Hoffmann | } |
1020 | ee6847d1 | Gerd Hoffmann | return NULL; |
1021 | ee6847d1 | Gerd Hoffmann | } |
1022 | ee6847d1 | Gerd Hoffmann | |
1023 | ee6847d1 | Gerd Hoffmann | static Property *qdev_prop_find(DeviceState *dev, const char *name) |
1024 | ee6847d1 | Gerd Hoffmann | { |
1025 | bce54474 | Paolo Bonzini | ObjectClass *class; |
1026 | ee6847d1 | Gerd Hoffmann | Property *prop; |
1027 | ee6847d1 | Gerd Hoffmann | |
1028 | ee6847d1 | Gerd Hoffmann | /* device properties */
|
1029 | bce54474 | Paolo Bonzini | class = object_get_class(OBJECT(dev)); |
1030 | bce54474 | Paolo Bonzini | do {
|
1031 | bce54474 | Paolo Bonzini | prop = qdev_prop_walk(DEVICE_CLASS(class)->props, name); |
1032 | bce54474 | Paolo Bonzini | if (prop) {
|
1033 | bce54474 | Paolo Bonzini | return prop;
|
1034 | bce54474 | Paolo Bonzini | } |
1035 | bce54474 | Paolo Bonzini | class = object_class_get_parent(class); |
1036 | bce54474 | Paolo Bonzini | } while (class != object_class_by_name(TYPE_DEVICE));
|
1037 | ee6847d1 | Gerd Hoffmann | |
1038 | ee6847d1 | Gerd Hoffmann | return NULL; |
1039 | ee6847d1 | Gerd Hoffmann | } |
1040 | ee6847d1 | Gerd Hoffmann | |
1041 | 7db4c4e8 | Paolo Bonzini | void error_set_from_qdev_prop_error(Error **errp, int ret, DeviceState *dev, |
1042 | 7db4c4e8 | Paolo Bonzini | Property *prop, const char *value) |
1043 | 7db4c4e8 | Paolo Bonzini | { |
1044 | 7db4c4e8 | Paolo Bonzini | switch (ret) {
|
1045 | 7db4c4e8 | Paolo Bonzini | case -EEXIST:
|
1046 | 7db4c4e8 | Paolo Bonzini | error_set(errp, QERR_PROPERTY_VALUE_IN_USE, |
1047 | f79f2bfc | Anthony Liguori | object_get_typename(OBJECT(dev)), prop->name, value); |
1048 | 7db4c4e8 | Paolo Bonzini | break;
|
1049 | 7db4c4e8 | Paolo Bonzini | default:
|
1050 | 7db4c4e8 | Paolo Bonzini | case -EINVAL:
|
1051 | 7db4c4e8 | Paolo Bonzini | error_set(errp, QERR_PROPERTY_VALUE_BAD, |
1052 | f79f2bfc | Anthony Liguori | object_get_typename(OBJECT(dev)), prop->name, value); |
1053 | 7db4c4e8 | Paolo Bonzini | break;
|
1054 | 7db4c4e8 | Paolo Bonzini | case -ENOENT:
|
1055 | 7db4c4e8 | Paolo Bonzini | error_set(errp, QERR_PROPERTY_VALUE_NOT_FOUND, |
1056 | f79f2bfc | Anthony Liguori | object_get_typename(OBJECT(dev)), prop->name, value); |
1057 | 7db4c4e8 | Paolo Bonzini | break;
|
1058 | 7db4c4e8 | Paolo Bonzini | case 0: |
1059 | 7db4c4e8 | Paolo Bonzini | break;
|
1060 | 7db4c4e8 | Paolo Bonzini | } |
1061 | 7db4c4e8 | Paolo Bonzini | } |
1062 | 7db4c4e8 | Paolo Bonzini | |
1063 | ee6847d1 | Gerd Hoffmann | int qdev_prop_parse(DeviceState *dev, const char *name, const char *value) |
1064 | ee6847d1 | Gerd Hoffmann | { |
1065 | d822979b | Paolo Bonzini | char *legacy_name;
|
1066 | d822979b | Paolo Bonzini | Error *err = NULL;
|
1067 | ee6847d1 | Gerd Hoffmann | |
1068 | d822979b | Paolo Bonzini | legacy_name = g_strdup_printf("legacy-%s", name);
|
1069 | d822979b | Paolo Bonzini | if (object_property_get_type(OBJECT(dev), legacy_name, NULL)) { |
1070 | 0c96e285 | Paolo Bonzini | object_property_parse(OBJECT(dev), value, legacy_name, &err); |
1071 | d822979b | Paolo Bonzini | } else {
|
1072 | 0c96e285 | Paolo Bonzini | object_property_parse(OBJECT(dev), value, name, &err); |
1073 | ee6847d1 | Gerd Hoffmann | } |
1074 | d822979b | Paolo Bonzini | g_free(legacy_name); |
1075 | d822979b | Paolo Bonzini | |
1076 | d822979b | Paolo Bonzini | if (err) {
|
1077 | 7db4c4e8 | Paolo Bonzini | qerror_report_err(err); |
1078 | 7db4c4e8 | Paolo Bonzini | error_free(err); |
1079 | 9ef5c4bf | Gerd Hoffmann | return -1; |
1080 | 9ef5c4bf | Gerd Hoffmann | } |
1081 | 9ef5c4bf | Gerd Hoffmann | return 0; |
1082 | ee6847d1 | Gerd Hoffmann | } |
1083 | ee6847d1 | Gerd Hoffmann | |
1084 | f4594a3b | Isaku Yamahata | void qdev_prop_set_bit(DeviceState *dev, const char *name, bool value) |
1085 | f4594a3b | Isaku Yamahata | { |
1086 | 9b170e60 | Paolo Bonzini | Error *errp = NULL;
|
1087 | 9b170e60 | Paolo Bonzini | object_property_set_bool(OBJECT(dev), value, name, &errp); |
1088 | 59f971d4 | Paolo Bonzini | assert_no_error(errp); |
1089 | f4594a3b | Isaku Yamahata | } |
1090 | f4594a3b | Isaku Yamahata | |
1091 | c7cc172d | Juan Quintela | void qdev_prop_set_uint8(DeviceState *dev, const char *name, uint8_t value) |
1092 | c7cc172d | Juan Quintela | { |
1093 | 9b170e60 | Paolo Bonzini | Error *errp = NULL;
|
1094 | 9b170e60 | Paolo Bonzini | object_property_set_int(OBJECT(dev), value, name, &errp); |
1095 | 59f971d4 | Paolo Bonzini | assert_no_error(errp); |
1096 | c7cc172d | Juan Quintela | } |
1097 | c7cc172d | Juan Quintela | |
1098 | ee6847d1 | Gerd Hoffmann | void qdev_prop_set_uint16(DeviceState *dev, const char *name, uint16_t value) |
1099 | ee6847d1 | Gerd Hoffmann | { |
1100 | 9b170e60 | Paolo Bonzini | Error *errp = NULL;
|
1101 | 9b170e60 | Paolo Bonzini | object_property_set_int(OBJECT(dev), value, name, &errp); |
1102 | 59f971d4 | Paolo Bonzini | assert_no_error(errp); |
1103 | ee6847d1 | Gerd Hoffmann | } |
1104 | ee6847d1 | Gerd Hoffmann | |
1105 | ee6847d1 | Gerd Hoffmann | void qdev_prop_set_uint32(DeviceState *dev, const char *name, uint32_t value) |
1106 | ee6847d1 | Gerd Hoffmann | { |
1107 | 9b170e60 | Paolo Bonzini | Error *errp = NULL;
|
1108 | 9b170e60 | Paolo Bonzini | object_property_set_int(OBJECT(dev), value, name, &errp); |
1109 | 59f971d4 | Paolo Bonzini | assert_no_error(errp); |
1110 | ee6847d1 | Gerd Hoffmann | } |
1111 | ee6847d1 | Gerd Hoffmann | |
1112 | 316940b0 | Gerd Hoffmann | void qdev_prop_set_int32(DeviceState *dev, const char *name, int32_t value) |
1113 | 316940b0 | Gerd Hoffmann | { |
1114 | 9b170e60 | Paolo Bonzini | Error *errp = NULL;
|
1115 | 9b170e60 | Paolo Bonzini | object_property_set_int(OBJECT(dev), value, name, &errp); |
1116 | 59f971d4 | Paolo Bonzini | assert_no_error(errp); |
1117 | 316940b0 | Gerd Hoffmann | } |
1118 | 316940b0 | Gerd Hoffmann | |
1119 | 5a053d1f | Blue Swirl | void qdev_prop_set_uint64(DeviceState *dev, const char *name, uint64_t value) |
1120 | 5a053d1f | Blue Swirl | { |
1121 | 9b170e60 | Paolo Bonzini | Error *errp = NULL;
|
1122 | 9b170e60 | Paolo Bonzini | object_property_set_int(OBJECT(dev), value, name, &errp); |
1123 | 59f971d4 | Paolo Bonzini | assert_no_error(errp); |
1124 | 5a053d1f | Blue Swirl | } |
1125 | 5a053d1f | Blue Swirl | |
1126 | cc984673 | Markus Armbruster | void qdev_prop_set_string(DeviceState *dev, const char *name, char *value) |
1127 | cc984673 | Markus Armbruster | { |
1128 | 9b170e60 | Paolo Bonzini | Error *errp = NULL;
|
1129 | 9b170e60 | Paolo Bonzini | object_property_set_str(OBJECT(dev), value, name, &errp); |
1130 | 59f971d4 | Paolo Bonzini | assert_no_error(errp); |
1131 | cc984673 | Markus Armbruster | } |
1132 | cc984673 | Markus Armbruster | |
1133 | 18846dee | Markus Armbruster | int qdev_prop_set_drive(DeviceState *dev, const char *name, BlockDriverState *value) |
1134 | 14b41872 | Gerd Hoffmann | { |
1135 | 9b170e60 | Paolo Bonzini | Error *errp = NULL;
|
1136 | 0a54a0ce | Paolo Bonzini | const char *bdrv_name = value ? bdrv_get_device_name(value) : ""; |
1137 | 0a54a0ce | Paolo Bonzini | object_property_set_str(OBJECT(dev), bdrv_name, |
1138 | 9b170e60 | Paolo Bonzini | name, &errp); |
1139 | 9b170e60 | Paolo Bonzini | if (errp) {
|
1140 | 9b170e60 | Paolo Bonzini | qerror_report_err(errp); |
1141 | 9b170e60 | Paolo Bonzini | error_free(errp); |
1142 | 18846dee | Markus Armbruster | return -1; |
1143 | 18846dee | Markus Armbruster | } |
1144 | 18846dee | Markus Armbruster | return 0; |
1145 | 14b41872 | Gerd Hoffmann | } |
1146 | 14b41872 | Gerd Hoffmann | |
1147 | 18846dee | Markus Armbruster | void qdev_prop_set_drive_nofail(DeviceState *dev, const char *name, BlockDriverState *value) |
1148 | 18846dee | Markus Armbruster | { |
1149 | 18846dee | Markus Armbruster | if (qdev_prop_set_drive(dev, name, value) < 0) { |
1150 | 18846dee | Markus Armbruster | exit(1);
|
1151 | 18846dee | Markus Armbruster | } |
1152 | 18846dee | Markus Armbruster | } |
1153 | 313feaab | Gerd Hoffmann | void qdev_prop_set_chr(DeviceState *dev, const char *name, CharDriverState *value) |
1154 | 313feaab | Gerd Hoffmann | { |
1155 | 9b170e60 | Paolo Bonzini | Error *errp = NULL;
|
1156 | 0a54a0ce | Paolo Bonzini | assert(!value || value->label); |
1157 | 0a54a0ce | Paolo Bonzini | object_property_set_str(OBJECT(dev), |
1158 | 0a54a0ce | Paolo Bonzini | value ? value->label : "", name, &errp);
|
1159 | 59f971d4 | Paolo Bonzini | assert_no_error(errp); |
1160 | 313feaab | Gerd Hoffmann | } |
1161 | 313feaab | Gerd Hoffmann | |
1162 | 2ef924b4 | Gerd Hoffmann | void qdev_prop_set_netdev(DeviceState *dev, const char *name, VLANClientState *value) |
1163 | 2ef924b4 | Gerd Hoffmann | { |
1164 | 9b170e60 | Paolo Bonzini | Error *errp = NULL;
|
1165 | 0a54a0ce | Paolo Bonzini | assert(!value || value->name); |
1166 | 0a54a0ce | Paolo Bonzini | object_property_set_str(OBJECT(dev), |
1167 | 0a54a0ce | Paolo Bonzini | value ? value->name : "", name, &errp);
|
1168 | 59f971d4 | Paolo Bonzini | assert_no_error(errp); |
1169 | 2ef924b4 | Gerd Hoffmann | } |
1170 | 2ef924b4 | Gerd Hoffmann | |
1171 | 851bec09 | Gerd Hoffmann | void qdev_prop_set_vlan(DeviceState *dev, const char *name, VLANState *value) |
1172 | 851bec09 | Gerd Hoffmann | { |
1173 | 9b170e60 | Paolo Bonzini | Error *errp = NULL;
|
1174 | 9b170e60 | Paolo Bonzini | object_property_set_int(OBJECT(dev), value ? value->id : -1, name, &errp);
|
1175 | 59f971d4 | Paolo Bonzini | assert_no_error(errp); |
1176 | 851bec09 | Gerd Hoffmann | } |
1177 | 851bec09 | Gerd Hoffmann | |
1178 | 1503fff3 | Gerd Hoffmann | void qdev_prop_set_macaddr(DeviceState *dev, const char *name, uint8_t *value) |
1179 | 1503fff3 | Gerd Hoffmann | { |
1180 | 9b170e60 | Paolo Bonzini | Error *errp = NULL;
|
1181 | 9b170e60 | Paolo Bonzini | char str[2 * 6 + 5 + 1]; |
1182 | 9b170e60 | Paolo Bonzini | snprintf(str, sizeof(str), "%02x:%02x:%02x:%02x:%02x:%02x", |
1183 | 9b170e60 | Paolo Bonzini | value[0], value[1], value[2], value[3], value[4], value[5]); |
1184 | 9b170e60 | Paolo Bonzini | |
1185 | 9b170e60 | Paolo Bonzini | object_property_set_str(OBJECT(dev), str, name, &errp); |
1186 | 59f971d4 | Paolo Bonzini | assert_no_error(errp); |
1187 | 1503fff3 | Gerd Hoffmann | } |
1188 | 1503fff3 | Gerd Hoffmann | |
1189 | 9b170e60 | Paolo Bonzini | void qdev_prop_set_enum(DeviceState *dev, const char *name, int value) |
1190 | 4e4fa398 | Jan Kiszka | { |
1191 | 9b170e60 | Paolo Bonzini | Property *prop; |
1192 | 9b170e60 | Paolo Bonzini | Error *errp = NULL;
|
1193 | 9b170e60 | Paolo Bonzini | |
1194 | 9b170e60 | Paolo Bonzini | prop = qdev_prop_find(dev, name); |
1195 | 9b170e60 | Paolo Bonzini | object_property_set_str(OBJECT(dev), prop->info->enum_table[value], |
1196 | 9b170e60 | Paolo Bonzini | name, &errp); |
1197 | 59f971d4 | Paolo Bonzini | assert_no_error(errp); |
1198 | 4e4fa398 | Jan Kiszka | } |
1199 | 4e4fa398 | Jan Kiszka | |
1200 | ee6847d1 | Gerd Hoffmann | void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value) |
1201 | ee6847d1 | Gerd Hoffmann | { |
1202 | 7a7aae21 | Paolo Bonzini | Property *prop; |
1203 | 7a7aae21 | Paolo Bonzini | void **ptr;
|
1204 | 7a7aae21 | Paolo Bonzini | |
1205 | 7a7aae21 | Paolo Bonzini | prop = qdev_prop_find(dev, name); |
1206 | 7a7aae21 | Paolo Bonzini | assert(prop && prop->info == &qdev_prop_ptr); |
1207 | 7a7aae21 | Paolo Bonzini | ptr = qdev_get_prop_ptr(dev, prop); |
1208 | 7a7aae21 | Paolo Bonzini | *ptr = value; |
1209 | ee6847d1 | Gerd Hoffmann | } |
1210 | ee6847d1 | Gerd Hoffmann | |
1211 | 458fb679 | Gerd Hoffmann | static QTAILQ_HEAD(, GlobalProperty) global_props = QTAILQ_HEAD_INITIALIZER(global_props);
|
1212 | b6b61144 | Gerd Hoffmann | |
1213 | 25920d6a | Kevin Wolf | static void qdev_prop_register_global(GlobalProperty *prop) |
1214 | b6b61144 | Gerd Hoffmann | { |
1215 | 458fb679 | Gerd Hoffmann | QTAILQ_INSERT_TAIL(&global_props, prop, next); |
1216 | b6b61144 | Gerd Hoffmann | } |
1217 | b6b61144 | Gerd Hoffmann | |
1218 | 458fb679 | Gerd Hoffmann | void qdev_prop_register_global_list(GlobalProperty *props)
|
1219 | b6b61144 | Gerd Hoffmann | { |
1220 | 458fb679 | Gerd Hoffmann | int i;
|
1221 | b6b61144 | Gerd Hoffmann | |
1222 | 458fb679 | Gerd Hoffmann | for (i = 0; props[i].driver != NULL; i++) { |
1223 | 458fb679 | Gerd Hoffmann | qdev_prop_register_global(props+i); |
1224 | b6b61144 | Gerd Hoffmann | } |
1225 | 458fb679 | Gerd Hoffmann | } |
1226 | 458fb679 | Gerd Hoffmann | |
1227 | 458fb679 | Gerd Hoffmann | void qdev_prop_set_globals(DeviceState *dev)
|
1228 | 458fb679 | Gerd Hoffmann | { |
1229 | bce54474 | Paolo Bonzini | ObjectClass *class = object_get_class(OBJECT(dev)); |
1230 | bce54474 | Paolo Bonzini | |
1231 | bce54474 | Paolo Bonzini | do {
|
1232 | bce54474 | Paolo Bonzini | GlobalProperty *prop; |
1233 | bce54474 | Paolo Bonzini | QTAILQ_FOREACH(prop, &global_props, next) { |
1234 | bce54474 | Paolo Bonzini | if (strcmp(object_class_get_name(class), prop->driver) != 0) { |
1235 | bce54474 | Paolo Bonzini | continue;
|
1236 | bce54474 | Paolo Bonzini | } |
1237 | bce54474 | Paolo Bonzini | if (qdev_prop_parse(dev, prop->property, prop->value) != 0) { |
1238 | bce54474 | Paolo Bonzini | exit(1);
|
1239 | bce54474 | Paolo Bonzini | } |
1240 | b6b61144 | Gerd Hoffmann | } |
1241 | bce54474 | Paolo Bonzini | class = object_class_get_parent(class); |
1242 | bce54474 | Paolo Bonzini | } while (class);
|
1243 | b6b61144 | Gerd Hoffmann | } |
1244 | 25920d6a | Kevin Wolf | |
1245 | 25920d6a | Kevin Wolf | static int qdev_add_one_global(QemuOpts *opts, void *opaque) |
1246 | 25920d6a | Kevin Wolf | { |
1247 | 25920d6a | Kevin Wolf | GlobalProperty *g; |
1248 | 25920d6a | Kevin Wolf | |
1249 | 7267c094 | Anthony Liguori | g = g_malloc0(sizeof(*g));
|
1250 | 25920d6a | Kevin Wolf | g->driver = qemu_opt_get(opts, "driver");
|
1251 | 25920d6a | Kevin Wolf | g->property = qemu_opt_get(opts, "property");
|
1252 | 25920d6a | Kevin Wolf | g->value = qemu_opt_get(opts, "value");
|
1253 | 25920d6a | Kevin Wolf | qdev_prop_register_global(g); |
1254 | 25920d6a | Kevin Wolf | return 0; |
1255 | 25920d6a | Kevin Wolf | } |
1256 | 25920d6a | Kevin Wolf | |
1257 | 25920d6a | Kevin Wolf | void qemu_add_globals(void) |
1258 | 25920d6a | Kevin Wolf | { |
1259 | 3329f07b | Gerd Hoffmann | qemu_opts_foreach(qemu_find_opts("global"), qdev_add_one_global, NULL, 0); |
1260 | 25920d6a | Kevin Wolf | } |