Statistics
| Branch: | Revision:

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
}