Statistics
| Branch: | Revision:

root / hw / qdev-properties.c @ 00c3a05b

History | View | Annotate | Download (19.3 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 d2364ee4 Michael S. Tsirkin
    assert(prop->info->type == PROP_TYPE_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
static void qdev_prop_cpy(DeviceState *dev, Property *props, void *src)
30 d2364ee4 Michael S. Tsirkin
{
31 d2364ee4 Michael S. Tsirkin
    if (props->info->type == PROP_TYPE_BIT) {
32 d2364ee4 Michael S. Tsirkin
        bool *defval = src;
33 d2364ee4 Michael S. Tsirkin
        bit_prop_set(dev, props, *defval);
34 d2364ee4 Michael S. Tsirkin
    } else {
35 d2364ee4 Michael S. Tsirkin
        char *dst = qdev_get_prop_ptr(dev, props);
36 d2364ee4 Michael S. Tsirkin
        memcpy(dst, src, props->info->size);
37 d2364ee4 Michael S. Tsirkin
    }
38 d2364ee4 Michael S. Tsirkin
}
39 d2364ee4 Michael S. Tsirkin
40 d2364ee4 Michael S. Tsirkin
/* Bit */
41 d2364ee4 Michael S. Tsirkin
static int parse_bit(DeviceState *dev, Property *prop, const char *str)
42 d2364ee4 Michael S. Tsirkin
{
43 d2364ee4 Michael S. Tsirkin
    if (!strncasecmp(str, "on", 2))
44 d2364ee4 Michael S. Tsirkin
        bit_prop_set(dev, prop, true);
45 d2364ee4 Michael S. Tsirkin
    else if (!strncasecmp(str, "off", 3))
46 d2364ee4 Michael S. Tsirkin
        bit_prop_set(dev, prop, false);
47 d2364ee4 Michael S. Tsirkin
    else
48 6bf38816 Markus Armbruster
        return -EINVAL;
49 d2364ee4 Michael S. Tsirkin
    return 0;
50 d2364ee4 Michael S. Tsirkin
}
51 d2364ee4 Michael S. Tsirkin
52 d2364ee4 Michael S. Tsirkin
static int print_bit(DeviceState *dev, Property *prop, char *dest, size_t len)
53 d2364ee4 Michael S. Tsirkin
{
54 5a5e3d55 David 'Digit' Turner
    uint32_t *p = qdev_get_prop_ptr(dev, prop);
55 d2364ee4 Michael S. Tsirkin
    return snprintf(dest, len, (*p & qdev_get_prop_mask(prop)) ? "on" : "off");
56 d2364ee4 Michael S. Tsirkin
}
57 d2364ee4 Michael S. Tsirkin
58 d2364ee4 Michael S. Tsirkin
PropertyInfo qdev_prop_bit = {
59 d2364ee4 Michael S. Tsirkin
    .name  = "on/off",
60 d2364ee4 Michael S. Tsirkin
    .type  = PROP_TYPE_BIT,
61 d2364ee4 Michael S. Tsirkin
    .size  = sizeof(uint32_t),
62 d2364ee4 Michael S. Tsirkin
    .parse = parse_bit,
63 d2364ee4 Michael S. Tsirkin
    .print = print_bit,
64 d2364ee4 Michael S. Tsirkin
};
65 d2364ee4 Michael S. Tsirkin
66 c7cc172d Juan Quintela
/* --- 8bit integer --- */
67 c7cc172d Juan Quintela
68 c7cc172d Juan Quintela
static int parse_uint8(DeviceState *dev, Property *prop, const char *str)
69 c7cc172d Juan Quintela
{
70 c7cc172d Juan Quintela
    uint8_t *ptr = qdev_get_prop_ptr(dev, prop);
71 449041d4 Kevin Wolf
    char *end;
72 c7cc172d Juan Quintela
73 c7cc172d Juan Quintela
    /* accept both hex and decimal */
74 449041d4 Kevin Wolf
    *ptr = strtoul(str, &end, 0);
75 449041d4 Kevin Wolf
    if ((*end != '\0') || (end == str)) {
76 6bf38816 Markus Armbruster
        return -EINVAL;
77 449041d4 Kevin Wolf
    }
78 449041d4 Kevin Wolf
79 c7cc172d Juan Quintela
    return 0;
80 c7cc172d Juan Quintela
}
81 c7cc172d Juan Quintela
82 c7cc172d Juan Quintela
static int print_uint8(DeviceState *dev, Property *prop, char *dest, size_t len)
83 c7cc172d Juan Quintela
{
84 c7cc172d Juan Quintela
    uint8_t *ptr = qdev_get_prop_ptr(dev, prop);
85 c7cc172d Juan Quintela
    return snprintf(dest, len, "%" PRIu8, *ptr);
86 c7cc172d Juan Quintela
}
87 c7cc172d Juan Quintela
88 c7cc172d Juan Quintela
PropertyInfo qdev_prop_uint8 = {
89 c7cc172d Juan Quintela
    .name  = "uint8",
90 c7cc172d Juan Quintela
    .type  = PROP_TYPE_UINT8,
91 c7cc172d Juan Quintela
    .size  = sizeof(uint8_t),
92 c7cc172d Juan Quintela
    .parse = parse_uint8,
93 c7cc172d Juan Quintela
    .print = print_uint8,
94 c7cc172d Juan Quintela
};
95 c7cc172d Juan Quintela
96 6835678c Jan Kiszka
/* --- 8bit hex value --- */
97 6835678c Jan Kiszka
98 6835678c Jan Kiszka
static int parse_hex8(DeviceState *dev, Property *prop, const char *str)
99 6835678c Jan Kiszka
{
100 6835678c Jan Kiszka
    uint8_t *ptr = qdev_get_prop_ptr(dev, prop);
101 6835678c Jan Kiszka
    char *end;
102 6835678c Jan Kiszka
103 6835678c Jan Kiszka
    *ptr = strtoul(str, &end, 16);
104 6835678c Jan Kiszka
    if ((*end != '\0') || (end == str)) {
105 6835678c Jan Kiszka
        return -EINVAL;
106 6835678c Jan Kiszka
    }
107 6835678c Jan Kiszka
108 6835678c Jan Kiszka
    return 0;
109 6835678c Jan Kiszka
}
110 6835678c Jan Kiszka
111 6835678c Jan Kiszka
static int print_hex8(DeviceState *dev, Property *prop, char *dest, size_t len)
112 6835678c Jan Kiszka
{
113 6835678c Jan Kiszka
    uint8_t *ptr = qdev_get_prop_ptr(dev, prop);
114 6835678c Jan Kiszka
    return snprintf(dest, len, "0x%" PRIx8, *ptr);
115 6835678c Jan Kiszka
}
116 6835678c Jan Kiszka
117 6835678c Jan Kiszka
PropertyInfo qdev_prop_hex8 = {
118 6835678c Jan Kiszka
    .name  = "hex8",
119 6835678c Jan Kiszka
    .type  = PROP_TYPE_UINT8,
120 6835678c Jan Kiszka
    .size  = sizeof(uint8_t),
121 6835678c Jan Kiszka
    .parse = parse_hex8,
122 6835678c Jan Kiszka
    .print = print_hex8,
123 6835678c Jan Kiszka
};
124 6835678c Jan Kiszka
125 ee6847d1 Gerd Hoffmann
/* --- 16bit integer --- */
126 ee6847d1 Gerd Hoffmann
127 ee6847d1 Gerd Hoffmann
static int parse_uint16(DeviceState *dev, Property *prop, const char *str)
128 ee6847d1 Gerd Hoffmann
{
129 ee6847d1 Gerd Hoffmann
    uint16_t *ptr = qdev_get_prop_ptr(dev, prop);
130 449041d4 Kevin Wolf
    char *end;
131 ee6847d1 Gerd Hoffmann
132 ee6847d1 Gerd Hoffmann
    /* accept both hex and decimal */
133 449041d4 Kevin Wolf
    *ptr = strtoul(str, &end, 0);
134 449041d4 Kevin Wolf
    if ((*end != '\0') || (end == str)) {
135 6bf38816 Markus Armbruster
        return -EINVAL;
136 449041d4 Kevin Wolf
    }
137 449041d4 Kevin Wolf
138 ee6847d1 Gerd Hoffmann
    return 0;
139 ee6847d1 Gerd Hoffmann
}
140 ee6847d1 Gerd Hoffmann
141 ee6847d1 Gerd Hoffmann
static int print_uint16(DeviceState *dev, Property *prop, char *dest, size_t len)
142 ee6847d1 Gerd Hoffmann
{
143 ee6847d1 Gerd Hoffmann
    uint16_t *ptr = qdev_get_prop_ptr(dev, prop);
144 ee6847d1 Gerd Hoffmann
    return snprintf(dest, len, "%" PRIu16, *ptr);
145 ee6847d1 Gerd Hoffmann
}
146 ee6847d1 Gerd Hoffmann
147 ee6847d1 Gerd Hoffmann
PropertyInfo qdev_prop_uint16 = {
148 ee6847d1 Gerd Hoffmann
    .name  = "uint16",
149 ee6847d1 Gerd Hoffmann
    .type  = PROP_TYPE_UINT16,
150 ee6847d1 Gerd Hoffmann
    .size  = sizeof(uint16_t),
151 ee6847d1 Gerd Hoffmann
    .parse = parse_uint16,
152 ee6847d1 Gerd Hoffmann
    .print = print_uint16,
153 ee6847d1 Gerd Hoffmann
};
154 ee6847d1 Gerd Hoffmann
155 ee6847d1 Gerd Hoffmann
/* --- 32bit integer --- */
156 ee6847d1 Gerd Hoffmann
157 ee6847d1 Gerd Hoffmann
static int parse_uint32(DeviceState *dev, Property *prop, const char *str)
158 ee6847d1 Gerd Hoffmann
{
159 ee6847d1 Gerd Hoffmann
    uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
160 449041d4 Kevin Wolf
    char *end;
161 ee6847d1 Gerd Hoffmann
162 ee6847d1 Gerd Hoffmann
    /* accept both hex and decimal */
163 449041d4 Kevin Wolf
    *ptr = strtoul(str, &end, 0);
164 449041d4 Kevin Wolf
    if ((*end != '\0') || (end == str)) {
165 6bf38816 Markus Armbruster
        return -EINVAL;
166 449041d4 Kevin Wolf
    }
167 449041d4 Kevin Wolf
168 ee6847d1 Gerd Hoffmann
    return 0;
169 ee6847d1 Gerd Hoffmann
}
170 ee6847d1 Gerd Hoffmann
171 ee6847d1 Gerd Hoffmann
static int print_uint32(DeviceState *dev, Property *prop, char *dest, size_t len)
172 ee6847d1 Gerd Hoffmann
{
173 ee6847d1 Gerd Hoffmann
    uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
174 ee6847d1 Gerd Hoffmann
    return snprintf(dest, len, "%" PRIu32, *ptr);
175 ee6847d1 Gerd Hoffmann
}
176 ee6847d1 Gerd Hoffmann
177 ee6847d1 Gerd Hoffmann
PropertyInfo qdev_prop_uint32 = {
178 ee6847d1 Gerd Hoffmann
    .name  = "uint32",
179 ee6847d1 Gerd Hoffmann
    .type  = PROP_TYPE_UINT32,
180 ee6847d1 Gerd Hoffmann
    .size  = sizeof(uint32_t),
181 ee6847d1 Gerd Hoffmann
    .parse = parse_uint32,
182 ee6847d1 Gerd Hoffmann
    .print = print_uint32,
183 ee6847d1 Gerd Hoffmann
};
184 ee6847d1 Gerd Hoffmann
185 316940b0 Gerd Hoffmann
static int parse_int32(DeviceState *dev, Property *prop, const char *str)
186 316940b0 Gerd Hoffmann
{
187 316940b0 Gerd Hoffmann
    int32_t *ptr = qdev_get_prop_ptr(dev, prop);
188 449041d4 Kevin Wolf
    char *end;
189 316940b0 Gerd Hoffmann
190 449041d4 Kevin Wolf
    *ptr = strtol(str, &end, 10);
191 449041d4 Kevin Wolf
    if ((*end != '\0') || (end == str)) {
192 6bf38816 Markus Armbruster
        return -EINVAL;
193 449041d4 Kevin Wolf
    }
194 449041d4 Kevin Wolf
195 316940b0 Gerd Hoffmann
    return 0;
196 316940b0 Gerd Hoffmann
}
197 316940b0 Gerd Hoffmann
198 316940b0 Gerd Hoffmann
static int print_int32(DeviceState *dev, Property *prop, char *dest, size_t len)
199 316940b0 Gerd Hoffmann
{
200 316940b0 Gerd Hoffmann
    int32_t *ptr = qdev_get_prop_ptr(dev, prop);
201 316940b0 Gerd Hoffmann
    return snprintf(dest, len, "%" PRId32, *ptr);
202 316940b0 Gerd Hoffmann
}
203 316940b0 Gerd Hoffmann
204 316940b0 Gerd Hoffmann
PropertyInfo qdev_prop_int32 = {
205 316940b0 Gerd Hoffmann
    .name  = "int32",
206 316940b0 Gerd Hoffmann
    .type  = PROP_TYPE_INT32,
207 316940b0 Gerd Hoffmann
    .size  = sizeof(int32_t),
208 316940b0 Gerd Hoffmann
    .parse = parse_int32,
209 316940b0 Gerd Hoffmann
    .print = print_int32,
210 316940b0 Gerd Hoffmann
};
211 316940b0 Gerd Hoffmann
212 ee6847d1 Gerd Hoffmann
/* --- 32bit hex value --- */
213 ee6847d1 Gerd Hoffmann
214 ee6847d1 Gerd Hoffmann
static int parse_hex32(DeviceState *dev, Property *prop, const char *str)
215 ee6847d1 Gerd Hoffmann
{
216 ee6847d1 Gerd Hoffmann
    uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
217 449041d4 Kevin Wolf
    char *end;
218 ee6847d1 Gerd Hoffmann
219 449041d4 Kevin Wolf
    *ptr = strtoul(str, &end, 16);
220 449041d4 Kevin Wolf
    if ((*end != '\0') || (end == str)) {
221 6bf38816 Markus Armbruster
        return -EINVAL;
222 449041d4 Kevin Wolf
    }
223 449041d4 Kevin Wolf
224 ee6847d1 Gerd Hoffmann
    return 0;
225 ee6847d1 Gerd Hoffmann
}
226 ee6847d1 Gerd Hoffmann
227 ee6847d1 Gerd Hoffmann
static int print_hex32(DeviceState *dev, Property *prop, char *dest, size_t len)
228 ee6847d1 Gerd Hoffmann
{
229 ee6847d1 Gerd Hoffmann
    uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
230 ee6847d1 Gerd Hoffmann
    return snprintf(dest, len, "0x%" PRIx32, *ptr);
231 ee6847d1 Gerd Hoffmann
}
232 ee6847d1 Gerd Hoffmann
233 ee6847d1 Gerd Hoffmann
PropertyInfo qdev_prop_hex32 = {
234 ee6847d1 Gerd Hoffmann
    .name  = "hex32",
235 ee6847d1 Gerd Hoffmann
    .type  = PROP_TYPE_UINT32,
236 ee6847d1 Gerd Hoffmann
    .size  = sizeof(uint32_t),
237 ee6847d1 Gerd Hoffmann
    .parse = parse_hex32,
238 ee6847d1 Gerd Hoffmann
    .print = print_hex32,
239 ee6847d1 Gerd Hoffmann
};
240 ee6847d1 Gerd Hoffmann
241 5a053d1f Blue Swirl
/* --- 64bit integer --- */
242 5a053d1f Blue Swirl
243 5a053d1f Blue Swirl
static int parse_uint64(DeviceState *dev, Property *prop, const char *str)
244 5a053d1f Blue Swirl
{
245 5a053d1f Blue Swirl
    uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
246 449041d4 Kevin Wolf
    char *end;
247 5a053d1f Blue Swirl
248 5a053d1f Blue Swirl
    /* accept both hex and decimal */
249 449041d4 Kevin Wolf
    *ptr = strtoull(str, &end, 0);
250 449041d4 Kevin Wolf
    if ((*end != '\0') || (end == str)) {
251 6bf38816 Markus Armbruster
        return -EINVAL;
252 449041d4 Kevin Wolf
    }
253 449041d4 Kevin Wolf
254 5a053d1f Blue Swirl
    return 0;
255 5a053d1f Blue Swirl
}
256 5a053d1f Blue Swirl
257 5a053d1f Blue Swirl
static int print_uint64(DeviceState *dev, Property *prop, char *dest, size_t len)
258 5a053d1f Blue Swirl
{
259 5a053d1f Blue Swirl
    uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
260 5a053d1f Blue Swirl
    return snprintf(dest, len, "%" PRIu64, *ptr);
261 5a053d1f Blue Swirl
}
262 5a053d1f Blue Swirl
263 5a053d1f Blue Swirl
PropertyInfo qdev_prop_uint64 = {
264 5a053d1f Blue Swirl
    .name  = "uint64",
265 5a053d1f Blue Swirl
    .type  = PROP_TYPE_UINT64,
266 5a053d1f Blue Swirl
    .size  = sizeof(uint64_t),
267 5a053d1f Blue Swirl
    .parse = parse_uint64,
268 5a053d1f Blue Swirl
    .print = print_uint64,
269 5a053d1f Blue Swirl
};
270 5a053d1f Blue Swirl
271 5a053d1f Blue Swirl
/* --- 64bit hex value --- */
272 5a053d1f Blue Swirl
273 5a053d1f Blue Swirl
static int parse_hex64(DeviceState *dev, Property *prop, const char *str)
274 5a053d1f Blue Swirl
{
275 5a053d1f Blue Swirl
    uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
276 449041d4 Kevin Wolf
    char *end;
277 5a053d1f Blue Swirl
278 449041d4 Kevin Wolf
    *ptr = strtoull(str, &end, 16);
279 449041d4 Kevin Wolf
    if ((*end != '\0') || (end == str)) {
280 6bf38816 Markus Armbruster
        return -EINVAL;
281 449041d4 Kevin Wolf
    }
282 449041d4 Kevin Wolf
283 5a053d1f Blue Swirl
    return 0;
284 5a053d1f Blue Swirl
}
285 5a053d1f Blue Swirl
286 5a053d1f Blue Swirl
static int print_hex64(DeviceState *dev, Property *prop, char *dest, size_t len)
287 5a053d1f Blue Swirl
{
288 5a053d1f Blue Swirl
    uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
289 5a053d1f Blue Swirl
    return snprintf(dest, len, "0x%" PRIx64, *ptr);
290 5a053d1f Blue Swirl
}
291 5a053d1f Blue Swirl
292 5a053d1f Blue Swirl
PropertyInfo qdev_prop_hex64 = {
293 5a053d1f Blue Swirl
    .name  = "hex64",
294 5a053d1f Blue Swirl
    .type  = PROP_TYPE_UINT64,
295 5a053d1f Blue Swirl
    .size  = sizeof(uint64_t),
296 5a053d1f Blue Swirl
    .parse = parse_hex64,
297 5a053d1f Blue Swirl
    .print = print_hex64,
298 5a053d1f Blue Swirl
};
299 5a053d1f Blue Swirl
300 59419663 Gerd Hoffmann
/* --- string --- */
301 59419663 Gerd Hoffmann
302 59419663 Gerd Hoffmann
static int parse_string(DeviceState *dev, Property *prop, const char *str)
303 59419663 Gerd Hoffmann
{
304 59419663 Gerd Hoffmann
    char **ptr = qdev_get_prop_ptr(dev, prop);
305 59419663 Gerd Hoffmann
306 59419663 Gerd Hoffmann
    if (*ptr)
307 7267c094 Anthony Liguori
        g_free(*ptr);
308 7267c094 Anthony Liguori
    *ptr = g_strdup(str);
309 59419663 Gerd Hoffmann
    return 0;
310 59419663 Gerd Hoffmann
}
311 59419663 Gerd Hoffmann
312 d21357df Markus Armbruster
static void free_string(DeviceState *dev, Property *prop)
313 d21357df Markus Armbruster
{
314 7267c094 Anthony Liguori
    g_free(*(char **)qdev_get_prop_ptr(dev, prop));
315 d21357df Markus Armbruster
}
316 d21357df Markus Armbruster
317 59419663 Gerd Hoffmann
static int print_string(DeviceState *dev, Property *prop, char *dest, size_t len)
318 59419663 Gerd Hoffmann
{
319 59419663 Gerd Hoffmann
    char **ptr = qdev_get_prop_ptr(dev, prop);
320 59419663 Gerd Hoffmann
    if (!*ptr)
321 59419663 Gerd Hoffmann
        return snprintf(dest, len, "<null>");
322 59419663 Gerd Hoffmann
    return snprintf(dest, len, "\"%s\"", *ptr);
323 59419663 Gerd Hoffmann
}
324 59419663 Gerd Hoffmann
325 59419663 Gerd Hoffmann
PropertyInfo qdev_prop_string = {
326 59419663 Gerd Hoffmann
    .name  = "string",
327 59419663 Gerd Hoffmann
    .type  = PROP_TYPE_STRING,
328 59419663 Gerd Hoffmann
    .size  = sizeof(char*),
329 59419663 Gerd Hoffmann
    .parse = parse_string,
330 59419663 Gerd Hoffmann
    .print = print_string,
331 d21357df Markus Armbruster
    .free  = free_string,
332 59419663 Gerd Hoffmann
};
333 59419663 Gerd Hoffmann
334 14b41872 Gerd Hoffmann
/* --- drive --- */
335 14b41872 Gerd Hoffmann
336 14b41872 Gerd Hoffmann
static int parse_drive(DeviceState *dev, Property *prop, const char *str)
337 14b41872 Gerd Hoffmann
{
338 f8b6cc00 Markus Armbruster
    BlockDriverState **ptr = qdev_get_prop_ptr(dev, prop);
339 f8b6cc00 Markus Armbruster
    BlockDriverState *bs;
340 14b41872 Gerd Hoffmann
341 f8b6cc00 Markus Armbruster
    bs = bdrv_find(str);
342 f8b6cc00 Markus Armbruster
    if (bs == NULL)
343 6bf38816 Markus Armbruster
        return -ENOENT;
344 fa879d62 Markus Armbruster
    if (bdrv_attach_dev(bs, dev) < 0)
345 18846dee Markus Armbruster
        return -EEXIST;
346 f8b6cc00 Markus Armbruster
    *ptr = bs;
347 14b41872 Gerd Hoffmann
    return 0;
348 14b41872 Gerd Hoffmann
}
349 14b41872 Gerd Hoffmann
350 14bafc54 Markus Armbruster
static void free_drive(DeviceState *dev, Property *prop)
351 14bafc54 Markus Armbruster
{
352 f8b6cc00 Markus Armbruster
    BlockDriverState **ptr = qdev_get_prop_ptr(dev, prop);
353 14bafc54 Markus Armbruster
354 14bafc54 Markus Armbruster
    if (*ptr) {
355 fa879d62 Markus Armbruster
        bdrv_detach_dev(*ptr, dev);
356 f8b6cc00 Markus Armbruster
        blockdev_auto_del(*ptr);
357 14bafc54 Markus Armbruster
    }
358 14bafc54 Markus Armbruster
}
359 14bafc54 Markus Armbruster
360 14b41872 Gerd Hoffmann
static int print_drive(DeviceState *dev, Property *prop, char *dest, size_t len)
361 14b41872 Gerd Hoffmann
{
362 f8b6cc00 Markus Armbruster
    BlockDriverState **ptr = qdev_get_prop_ptr(dev, prop);
363 f8b6cc00 Markus Armbruster
    return snprintf(dest, len, "%s",
364 f8b6cc00 Markus Armbruster
                    *ptr ? bdrv_get_device_name(*ptr) : "<null>");
365 14b41872 Gerd Hoffmann
}
366 14b41872 Gerd Hoffmann
367 14b41872 Gerd Hoffmann
PropertyInfo qdev_prop_drive = {
368 14b41872 Gerd Hoffmann
    .name  = "drive",
369 14b41872 Gerd Hoffmann
    .type  = PROP_TYPE_DRIVE,
370 f8b6cc00 Markus Armbruster
    .size  = sizeof(BlockDriverState *),
371 14b41872 Gerd Hoffmann
    .parse = parse_drive,
372 14b41872 Gerd Hoffmann
    .print = print_drive,
373 14bafc54 Markus Armbruster
    .free  = free_drive,
374 14b41872 Gerd Hoffmann
};
375 14b41872 Gerd Hoffmann
376 313feaab Gerd Hoffmann
/* --- character device --- */
377 313feaab Gerd Hoffmann
378 06113719 Gerd Hoffmann
static int parse_chr(DeviceState *dev, Property *prop, const char *str)
379 06113719 Gerd Hoffmann
{
380 06113719 Gerd Hoffmann
    CharDriverState **ptr = qdev_get_prop_ptr(dev, prop);
381 06113719 Gerd Hoffmann
382 06113719 Gerd Hoffmann
    *ptr = qemu_chr_find(str);
383 2d6c1ef4 Amit Shah
    if (*ptr == NULL) {
384 6bf38816 Markus Armbruster
        return -ENOENT;
385 2d6c1ef4 Amit Shah
    }
386 d5b27167 Kusanagi Kouichi
    if ((*ptr)->avail_connections < 1) {
387 2d6c1ef4 Amit Shah
        return -EEXIST;
388 2d6c1ef4 Amit Shah
    }
389 d5b27167 Kusanagi Kouichi
    --(*ptr)->avail_connections;
390 06113719 Gerd Hoffmann
    return 0;
391 06113719 Gerd Hoffmann
}
392 06113719 Gerd Hoffmann
393 313feaab Gerd Hoffmann
static int print_chr(DeviceState *dev, Property *prop, char *dest, size_t len)
394 313feaab Gerd Hoffmann
{
395 313feaab Gerd Hoffmann
    CharDriverState **ptr = qdev_get_prop_ptr(dev, prop);
396 bc19fcaa Blue Swirl
397 bc19fcaa Blue Swirl
    if (*ptr && (*ptr)->label) {
398 bc19fcaa Blue Swirl
        return snprintf(dest, len, "%s", (*ptr)->label);
399 bc19fcaa Blue Swirl
    } else {
400 bc19fcaa Blue Swirl
        return snprintf(dest, len, "<null>");
401 bc19fcaa Blue Swirl
    }
402 313feaab Gerd Hoffmann
}
403 313feaab Gerd Hoffmann
404 313feaab Gerd Hoffmann
PropertyInfo qdev_prop_chr = {
405 313feaab Gerd Hoffmann
    .name  = "chr",
406 313feaab Gerd Hoffmann
    .type  = PROP_TYPE_CHR,
407 313feaab Gerd Hoffmann
    .size  = sizeof(CharDriverState*),
408 06113719 Gerd Hoffmann
    .parse = parse_chr,
409 313feaab Gerd Hoffmann
    .print = print_chr,
410 313feaab Gerd Hoffmann
};
411 313feaab Gerd Hoffmann
412 2ef924b4 Gerd Hoffmann
/* --- netdev device --- */
413 2ef924b4 Gerd Hoffmann
414 2ef924b4 Gerd Hoffmann
static int parse_netdev(DeviceState *dev, Property *prop, const char *str)
415 2ef924b4 Gerd Hoffmann
{
416 2ef924b4 Gerd Hoffmann
    VLANClientState **ptr = qdev_get_prop_ptr(dev, prop);
417 2ef924b4 Gerd Hoffmann
418 2ef924b4 Gerd Hoffmann
    *ptr = qemu_find_netdev(str);
419 2ef924b4 Gerd Hoffmann
    if (*ptr == NULL)
420 6bf38816 Markus Armbruster
        return -ENOENT;
421 27f3f8a3 Markus Armbruster
    if ((*ptr)->peer) {
422 27f3f8a3 Markus Armbruster
        return -EEXIST;
423 27f3f8a3 Markus Armbruster
    }
424 2ef924b4 Gerd Hoffmann
    return 0;
425 2ef924b4 Gerd Hoffmann
}
426 2ef924b4 Gerd Hoffmann
427 2ef924b4 Gerd Hoffmann
static int print_netdev(DeviceState *dev, Property *prop, char *dest, size_t len)
428 2ef924b4 Gerd Hoffmann
{
429 2ef924b4 Gerd Hoffmann
    VLANClientState **ptr = qdev_get_prop_ptr(dev, prop);
430 2ef924b4 Gerd Hoffmann
431 2ef924b4 Gerd Hoffmann
    if (*ptr && (*ptr)->name) {
432 2ef924b4 Gerd Hoffmann
        return snprintf(dest, len, "%s", (*ptr)->name);
433 2ef924b4 Gerd Hoffmann
    } else {
434 2ef924b4 Gerd Hoffmann
        return snprintf(dest, len, "<null>");
435 2ef924b4 Gerd Hoffmann
    }
436 2ef924b4 Gerd Hoffmann
}
437 2ef924b4 Gerd Hoffmann
438 2ef924b4 Gerd Hoffmann
PropertyInfo qdev_prop_netdev = {
439 2ef924b4 Gerd Hoffmann
    .name  = "netdev",
440 2ef924b4 Gerd Hoffmann
    .type  = PROP_TYPE_NETDEV,
441 2ef924b4 Gerd Hoffmann
    .size  = sizeof(VLANClientState*),
442 2ef924b4 Gerd Hoffmann
    .parse = parse_netdev,
443 2ef924b4 Gerd Hoffmann
    .print = print_netdev,
444 2ef924b4 Gerd Hoffmann
};
445 2ef924b4 Gerd Hoffmann
446 851bec09 Gerd Hoffmann
/* --- vlan --- */
447 851bec09 Gerd Hoffmann
448 851bec09 Gerd Hoffmann
static int parse_vlan(DeviceState *dev, Property *prop, const char *str)
449 851bec09 Gerd Hoffmann
{
450 851bec09 Gerd Hoffmann
    VLANState **ptr = qdev_get_prop_ptr(dev, prop);
451 851bec09 Gerd Hoffmann
    int id;
452 851bec09 Gerd Hoffmann
453 851bec09 Gerd Hoffmann
    if (sscanf(str, "%d", &id) != 1)
454 6bf38816 Markus Armbruster
        return -EINVAL;
455 851bec09 Gerd Hoffmann
    *ptr = qemu_find_vlan(id, 1);
456 851bec09 Gerd Hoffmann
    if (*ptr == NULL)
457 6bf38816 Markus Armbruster
        return -ENOENT;
458 851bec09 Gerd Hoffmann
    return 0;
459 851bec09 Gerd Hoffmann
}
460 851bec09 Gerd Hoffmann
461 851bec09 Gerd Hoffmann
static int print_vlan(DeviceState *dev, Property *prop, char *dest, size_t len)
462 851bec09 Gerd Hoffmann
{
463 851bec09 Gerd Hoffmann
    VLANState **ptr = qdev_get_prop_ptr(dev, prop);
464 851bec09 Gerd Hoffmann
465 851bec09 Gerd Hoffmann
    if (*ptr) {
466 851bec09 Gerd Hoffmann
        return snprintf(dest, len, "%d", (*ptr)->id);
467 851bec09 Gerd Hoffmann
    } else {
468 851bec09 Gerd Hoffmann
        return snprintf(dest, len, "<null>");
469 851bec09 Gerd Hoffmann
    }
470 851bec09 Gerd Hoffmann
}
471 851bec09 Gerd Hoffmann
472 851bec09 Gerd Hoffmann
PropertyInfo qdev_prop_vlan = {
473 851bec09 Gerd Hoffmann
    .name  = "vlan",
474 851bec09 Gerd Hoffmann
    .type  = PROP_TYPE_VLAN,
475 851bec09 Gerd Hoffmann
    .size  = sizeof(VLANClientState*),
476 851bec09 Gerd Hoffmann
    .parse = parse_vlan,
477 851bec09 Gerd Hoffmann
    .print = print_vlan,
478 851bec09 Gerd Hoffmann
};
479 851bec09 Gerd Hoffmann
480 ee6847d1 Gerd Hoffmann
/* --- pointer --- */
481 ee6847d1 Gerd Hoffmann
482 036f7166 Markus Armbruster
/* Not a proper property, just for dirty hacks.  TODO Remove it!  */
483 ee6847d1 Gerd Hoffmann
PropertyInfo qdev_prop_ptr = {
484 ee6847d1 Gerd Hoffmann
    .name  = "ptr",
485 ee6847d1 Gerd Hoffmann
    .type  = PROP_TYPE_PTR,
486 ee6847d1 Gerd Hoffmann
    .size  = sizeof(void*),
487 ee6847d1 Gerd Hoffmann
};
488 ee6847d1 Gerd Hoffmann
489 ee6847d1 Gerd Hoffmann
/* --- mac address --- */
490 ee6847d1 Gerd Hoffmann
491 ee6847d1 Gerd Hoffmann
/*
492 ee6847d1 Gerd Hoffmann
 * accepted syntax versions:
493 ee6847d1 Gerd Hoffmann
 *   01:02:03:04:05:06
494 ee6847d1 Gerd Hoffmann
 *   01-02-03-04-05-06
495 ee6847d1 Gerd Hoffmann
 */
496 ee6847d1 Gerd Hoffmann
static int parse_mac(DeviceState *dev, Property *prop, const char *str)
497 ee6847d1 Gerd Hoffmann
{
498 1503fff3 Gerd Hoffmann
    MACAddr *mac = qdev_get_prop_ptr(dev, prop);
499 ee6847d1 Gerd Hoffmann
    int i, pos;
500 ee6847d1 Gerd Hoffmann
    char *p;
501 ee6847d1 Gerd Hoffmann
502 ee6847d1 Gerd Hoffmann
    for (i = 0, pos = 0; i < 6; i++, pos += 3) {
503 88e150a5 Christoph Egger
        if (!qemu_isxdigit(str[pos]))
504 6bf38816 Markus Armbruster
            return -EINVAL;
505 88e150a5 Christoph Egger
        if (!qemu_isxdigit(str[pos+1]))
506 6bf38816 Markus Armbruster
            return -EINVAL;
507 1503fff3 Gerd Hoffmann
        if (i == 5) {
508 1503fff3 Gerd Hoffmann
            if (str[pos+2] != '\0')
509 6bf38816 Markus Armbruster
                return -EINVAL;
510 1503fff3 Gerd Hoffmann
        } else {
511 1503fff3 Gerd Hoffmann
            if (str[pos+2] != ':' && str[pos+2] != '-')
512 6bf38816 Markus Armbruster
                return -EINVAL;
513 1503fff3 Gerd Hoffmann
        }
514 1503fff3 Gerd Hoffmann
        mac->a[i] = strtol(str+pos, &p, 16);
515 ee6847d1 Gerd Hoffmann
    }
516 ee6847d1 Gerd Hoffmann
    return 0;
517 ee6847d1 Gerd Hoffmann
}
518 ee6847d1 Gerd Hoffmann
519 ee6847d1 Gerd Hoffmann
static int print_mac(DeviceState *dev, Property *prop, char *dest, size_t len)
520 ee6847d1 Gerd Hoffmann
{
521 1503fff3 Gerd Hoffmann
    MACAddr *mac = qdev_get_prop_ptr(dev, prop);
522 1503fff3 Gerd Hoffmann
523 ee6847d1 Gerd Hoffmann
    return snprintf(dest, len, "%02x:%02x:%02x:%02x:%02x:%02x",
524 1503fff3 Gerd Hoffmann
                    mac->a[0], mac->a[1], mac->a[2],
525 1503fff3 Gerd Hoffmann
                    mac->a[3], mac->a[4], mac->a[5]);
526 ee6847d1 Gerd Hoffmann
}
527 ee6847d1 Gerd Hoffmann
528 ee6847d1 Gerd Hoffmann
PropertyInfo qdev_prop_macaddr = {
529 1503fff3 Gerd Hoffmann
    .name  = "macaddr",
530 ee6847d1 Gerd Hoffmann
    .type  = PROP_TYPE_MACADDR,
531 1503fff3 Gerd Hoffmann
    .size  = sizeof(MACAddr),
532 ee6847d1 Gerd Hoffmann
    .parse = parse_mac,
533 ee6847d1 Gerd Hoffmann
    .print = print_mac,
534 ee6847d1 Gerd Hoffmann
};
535 ee6847d1 Gerd Hoffmann
536 05cb5fe4 Gerd Hoffmann
/* --- pci address --- */
537 05cb5fe4 Gerd Hoffmann
538 05cb5fe4 Gerd Hoffmann
/*
539 05cb5fe4 Gerd Hoffmann
 * bus-local address, i.e. "$slot" or "$slot.$fn"
540 05cb5fe4 Gerd Hoffmann
 */
541 05cb5fe4 Gerd Hoffmann
static int parse_pci_devfn(DeviceState *dev, Property *prop, const char *str)
542 05cb5fe4 Gerd Hoffmann
{
543 05cb5fe4 Gerd Hoffmann
    uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
544 05cb5fe4 Gerd Hoffmann
    unsigned int slot, fn, n;
545 05cb5fe4 Gerd Hoffmann
546 05cb5fe4 Gerd Hoffmann
    if (sscanf(str, "%x.%x%n", &slot, &fn, &n) != 2) {
547 05cb5fe4 Gerd Hoffmann
        fn = 0;
548 05cb5fe4 Gerd Hoffmann
        if (sscanf(str, "%x%n", &slot, &n) != 1) {
549 6bf38816 Markus Armbruster
            return -EINVAL;
550 05cb5fe4 Gerd Hoffmann
        }
551 05cb5fe4 Gerd Hoffmann
    }
552 05cb5fe4 Gerd Hoffmann
    if (str[n] != '\0')
553 6bf38816 Markus Armbruster
        return -EINVAL;
554 05cb5fe4 Gerd Hoffmann
    if (fn > 7)
555 6bf38816 Markus Armbruster
        return -EINVAL;
556 ffe3ce11 Donald Dutile
    if (slot > 31)
557 ffe3ce11 Donald Dutile
        return -EINVAL;
558 05cb5fe4 Gerd Hoffmann
    *ptr = slot << 3 | fn;
559 05cb5fe4 Gerd Hoffmann
    return 0;
560 05cb5fe4 Gerd Hoffmann
}
561 05cb5fe4 Gerd Hoffmann
562 05cb5fe4 Gerd Hoffmann
static int print_pci_devfn(DeviceState *dev, Property *prop, char *dest, size_t len)
563 05cb5fe4 Gerd Hoffmann
{
564 05cb5fe4 Gerd Hoffmann
    uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
565 05cb5fe4 Gerd Hoffmann
566 73538c31 Blue Swirl
    if (*ptr == -1) {
567 05cb5fe4 Gerd Hoffmann
        return snprintf(dest, len, "<unset>");
568 05cb5fe4 Gerd Hoffmann
    } else {
569 05cb5fe4 Gerd Hoffmann
        return snprintf(dest, len, "%02x.%x", *ptr >> 3, *ptr & 7);
570 05cb5fe4 Gerd Hoffmann
    }
571 05cb5fe4 Gerd Hoffmann
}
572 05cb5fe4 Gerd Hoffmann
573 05cb5fe4 Gerd Hoffmann
PropertyInfo qdev_prop_pci_devfn = {
574 05cb5fe4 Gerd Hoffmann
    .name  = "pci-devfn",
575 05cb5fe4 Gerd Hoffmann
    .type  = PROP_TYPE_UINT32,
576 05cb5fe4 Gerd Hoffmann
    .size  = sizeof(uint32_t),
577 05cb5fe4 Gerd Hoffmann
    .parse = parse_pci_devfn,
578 05cb5fe4 Gerd Hoffmann
    .print = print_pci_devfn,
579 05cb5fe4 Gerd Hoffmann
};
580 05cb5fe4 Gerd Hoffmann
581 ee6847d1 Gerd Hoffmann
/* --- public helpers --- */
582 ee6847d1 Gerd Hoffmann
583 ee6847d1 Gerd Hoffmann
static Property *qdev_prop_walk(Property *props, const char *name)
584 ee6847d1 Gerd Hoffmann
{
585 ee6847d1 Gerd Hoffmann
    if (!props)
586 ee6847d1 Gerd Hoffmann
        return NULL;
587 ee6847d1 Gerd Hoffmann
    while (props->name) {
588 ee6847d1 Gerd Hoffmann
        if (strcmp(props->name, name) == 0)
589 ee6847d1 Gerd Hoffmann
            return props;
590 ee6847d1 Gerd Hoffmann
        props++;
591 ee6847d1 Gerd Hoffmann
    }
592 ee6847d1 Gerd Hoffmann
    return NULL;
593 ee6847d1 Gerd Hoffmann
}
594 ee6847d1 Gerd Hoffmann
595 ee6847d1 Gerd Hoffmann
static Property *qdev_prop_find(DeviceState *dev, const char *name)
596 ee6847d1 Gerd Hoffmann
{
597 ee6847d1 Gerd Hoffmann
    Property *prop;
598 ee6847d1 Gerd Hoffmann
599 ee6847d1 Gerd Hoffmann
    /* device properties */
600 ee6847d1 Gerd Hoffmann
    prop = qdev_prop_walk(dev->info->props, name);
601 ee6847d1 Gerd Hoffmann
    if (prop)
602 ee6847d1 Gerd Hoffmann
        return prop;
603 ee6847d1 Gerd Hoffmann
604 ee6847d1 Gerd Hoffmann
    /* bus properties */
605 ee6847d1 Gerd Hoffmann
    prop = qdev_prop_walk(dev->parent_bus->info->props, name);
606 ee6847d1 Gerd Hoffmann
    if (prop)
607 ee6847d1 Gerd Hoffmann
        return prop;
608 ee6847d1 Gerd Hoffmann
609 ee6847d1 Gerd Hoffmann
    return NULL;
610 ee6847d1 Gerd Hoffmann
}
611 ee6847d1 Gerd Hoffmann
612 d8ed79ae Gerd Hoffmann
int qdev_prop_exists(DeviceState *dev, const char *name)
613 d8ed79ae Gerd Hoffmann
{
614 d8ed79ae Gerd Hoffmann
    return qdev_prop_find(dev, name) ? true : false;
615 d8ed79ae Gerd Hoffmann
}
616 d8ed79ae Gerd Hoffmann
617 ee6847d1 Gerd Hoffmann
int qdev_prop_parse(DeviceState *dev, const char *name, const char *value)
618 ee6847d1 Gerd Hoffmann
{
619 ee6847d1 Gerd Hoffmann
    Property *prop;
620 6bf38816 Markus Armbruster
    int ret;
621 ee6847d1 Gerd Hoffmann
622 ee6847d1 Gerd Hoffmann
    prop = qdev_prop_find(dev, name);
623 036f7166 Markus Armbruster
    /*
624 036f7166 Markus Armbruster
     * TODO Properties without a parse method are just for dirty
625 036f7166 Markus Armbruster
     * hacks.  qdev_prop_ptr is the only such PropertyInfo.  It's
626 036f7166 Markus Armbruster
     * marked for removal.  The test !prop->info->parse should be
627 036f7166 Markus Armbruster
     * removed along with it.
628 036f7166 Markus Armbruster
     */
629 036f7166 Markus Armbruster
    if (!prop || !prop->info->parse) {
630 fdcfa190 Markus Armbruster
        qerror_report(QERR_PROPERTY_NOT_FOUND, dev->info->name, name);
631 ee6847d1 Gerd Hoffmann
        return -1;
632 ee6847d1 Gerd Hoffmann
    }
633 6bf38816 Markus Armbruster
    ret = prop->info->parse(dev, prop, value);
634 6bf38816 Markus Armbruster
    if (ret < 0) {
635 6bf38816 Markus Armbruster
        switch (ret) {
636 27f3f8a3 Markus Armbruster
        case -EEXIST:
637 fdcfa190 Markus Armbruster
            qerror_report(QERR_PROPERTY_VALUE_IN_USE,
638 fdcfa190 Markus Armbruster
                          dev->info->name, name, value);
639 27f3f8a3 Markus Armbruster
            break;
640 6bf38816 Markus Armbruster
        default:
641 6bf38816 Markus Armbruster
        case -EINVAL:
642 fdcfa190 Markus Armbruster
            qerror_report(QERR_PROPERTY_VALUE_BAD,
643 fdcfa190 Markus Armbruster
                          dev->info->name, name, value);
644 6bf38816 Markus Armbruster
            break;
645 6bf38816 Markus Armbruster
        case -ENOENT:
646 fdcfa190 Markus Armbruster
            qerror_report(QERR_PROPERTY_VALUE_NOT_FOUND,
647 fdcfa190 Markus Armbruster
                          dev->info->name, name, value);
648 6bf38816 Markus Armbruster
            break;
649 6bf38816 Markus Armbruster
        }
650 9ef5c4bf Gerd Hoffmann
        return -1;
651 9ef5c4bf Gerd Hoffmann
    }
652 9ef5c4bf Gerd Hoffmann
    return 0;
653 ee6847d1 Gerd Hoffmann
}
654 ee6847d1 Gerd Hoffmann
655 ee6847d1 Gerd Hoffmann
void qdev_prop_set(DeviceState *dev, const char *name, void *src, enum PropertyType type)
656 ee6847d1 Gerd Hoffmann
{
657 ee6847d1 Gerd Hoffmann
    Property *prop;
658 ee6847d1 Gerd Hoffmann
659 ee6847d1 Gerd Hoffmann
    prop = qdev_prop_find(dev, name);
660 ee6847d1 Gerd Hoffmann
    if (!prop) {
661 ee6847d1 Gerd Hoffmann
        fprintf(stderr, "%s: property \"%s.%s\" not found\n",
662 ee6847d1 Gerd Hoffmann
                __FUNCTION__, dev->info->name, name);
663 ee6847d1 Gerd Hoffmann
        abort();
664 ee6847d1 Gerd Hoffmann
    }
665 ee6847d1 Gerd Hoffmann
    if (prop->info->type != type) {
666 ee6847d1 Gerd Hoffmann
        fprintf(stderr, "%s: property \"%s.%s\" type mismatch\n",
667 ee6847d1 Gerd Hoffmann
                __FUNCTION__, dev->info->name, name);
668 ee6847d1 Gerd Hoffmann
        abort();
669 ee6847d1 Gerd Hoffmann
    }
670 d2364ee4 Michael S. Tsirkin
    qdev_prop_cpy(dev, prop, src);
671 ee6847d1 Gerd Hoffmann
}
672 ee6847d1 Gerd Hoffmann
673 f4594a3b Isaku Yamahata
void qdev_prop_set_bit(DeviceState *dev, const char *name, bool value)
674 f4594a3b Isaku Yamahata
{
675 f4594a3b Isaku Yamahata
    qdev_prop_set(dev, name, &value, PROP_TYPE_BIT);
676 f4594a3b Isaku Yamahata
}
677 f4594a3b Isaku Yamahata
678 c7cc172d Juan Quintela
void qdev_prop_set_uint8(DeviceState *dev, const char *name, uint8_t value)
679 c7cc172d Juan Quintela
{
680 c7cc172d Juan Quintela
    qdev_prop_set(dev, name, &value, PROP_TYPE_UINT8);
681 c7cc172d Juan Quintela
}
682 c7cc172d Juan Quintela
683 ee6847d1 Gerd Hoffmann
void qdev_prop_set_uint16(DeviceState *dev, const char *name, uint16_t value)
684 ee6847d1 Gerd Hoffmann
{
685 ee6847d1 Gerd Hoffmann
    qdev_prop_set(dev, name, &value, PROP_TYPE_UINT16);
686 ee6847d1 Gerd Hoffmann
}
687 ee6847d1 Gerd Hoffmann
688 ee6847d1 Gerd Hoffmann
void qdev_prop_set_uint32(DeviceState *dev, const char *name, uint32_t value)
689 ee6847d1 Gerd Hoffmann
{
690 ee6847d1 Gerd Hoffmann
    qdev_prop_set(dev, name, &value, PROP_TYPE_UINT32);
691 ee6847d1 Gerd Hoffmann
}
692 ee6847d1 Gerd Hoffmann
693 316940b0 Gerd Hoffmann
void qdev_prop_set_int32(DeviceState *dev, const char *name, int32_t value)
694 316940b0 Gerd Hoffmann
{
695 316940b0 Gerd Hoffmann
    qdev_prop_set(dev, name, &value, PROP_TYPE_INT32);
696 316940b0 Gerd Hoffmann
}
697 316940b0 Gerd Hoffmann
698 5a053d1f Blue Swirl
void qdev_prop_set_uint64(DeviceState *dev, const char *name, uint64_t value)
699 5a053d1f Blue Swirl
{
700 5a053d1f Blue Swirl
    qdev_prop_set(dev, name, &value, PROP_TYPE_UINT64);
701 5a053d1f Blue Swirl
}
702 5a053d1f Blue Swirl
703 cc984673 Markus Armbruster
void qdev_prop_set_string(DeviceState *dev, const char *name, char *value)
704 cc984673 Markus Armbruster
{
705 cc984673 Markus Armbruster
    qdev_prop_set(dev, name, &value, PROP_TYPE_STRING);
706 cc984673 Markus Armbruster
}
707 cc984673 Markus Armbruster
708 18846dee Markus Armbruster
int qdev_prop_set_drive(DeviceState *dev, const char *name, BlockDriverState *value)
709 14b41872 Gerd Hoffmann
{
710 18846dee Markus Armbruster
    int res;
711 18846dee Markus Armbruster
712 fa879d62 Markus Armbruster
    res = bdrv_attach_dev(value, dev);
713 18846dee Markus Armbruster
    if (res < 0) {
714 18846dee Markus Armbruster
        error_report("Can't attach drive %s to %s.%s: %s",
715 18846dee Markus Armbruster
                     bdrv_get_device_name(value),
716 18846dee Markus Armbruster
                     dev->id ? dev->id : dev->info->name,
717 18846dee Markus Armbruster
                     name, strerror(-res));
718 18846dee Markus Armbruster
        return -1;
719 18846dee Markus Armbruster
    }
720 14b41872 Gerd Hoffmann
    qdev_prop_set(dev, name, &value, PROP_TYPE_DRIVE);
721 18846dee Markus Armbruster
    return 0;
722 14b41872 Gerd Hoffmann
}
723 14b41872 Gerd Hoffmann
724 18846dee Markus Armbruster
void qdev_prop_set_drive_nofail(DeviceState *dev, const char *name, BlockDriverState *value)
725 18846dee Markus Armbruster
{
726 18846dee Markus Armbruster
    if (qdev_prop_set_drive(dev, name, value) < 0) {
727 18846dee Markus Armbruster
        exit(1);
728 18846dee Markus Armbruster
    }
729 18846dee Markus Armbruster
}
730 313feaab Gerd Hoffmann
void qdev_prop_set_chr(DeviceState *dev, const char *name, CharDriverState *value)
731 313feaab Gerd Hoffmann
{
732 313feaab Gerd Hoffmann
    qdev_prop_set(dev, name, &value, PROP_TYPE_CHR);
733 313feaab Gerd Hoffmann
}
734 313feaab Gerd Hoffmann
735 2ef924b4 Gerd Hoffmann
void qdev_prop_set_netdev(DeviceState *dev, const char *name, VLANClientState *value)
736 2ef924b4 Gerd Hoffmann
{
737 2ef924b4 Gerd Hoffmann
    qdev_prop_set(dev, name, &value, PROP_TYPE_NETDEV);
738 2ef924b4 Gerd Hoffmann
}
739 2ef924b4 Gerd Hoffmann
740 851bec09 Gerd Hoffmann
void qdev_prop_set_vlan(DeviceState *dev, const char *name, VLANState *value)
741 851bec09 Gerd Hoffmann
{
742 851bec09 Gerd Hoffmann
    qdev_prop_set(dev, name, &value, PROP_TYPE_VLAN);
743 851bec09 Gerd Hoffmann
}
744 851bec09 Gerd Hoffmann
745 1503fff3 Gerd Hoffmann
void qdev_prop_set_macaddr(DeviceState *dev, const char *name, uint8_t *value)
746 1503fff3 Gerd Hoffmann
{
747 1503fff3 Gerd Hoffmann
    qdev_prop_set(dev, name, value, PROP_TYPE_MACADDR);
748 1503fff3 Gerd Hoffmann
}
749 1503fff3 Gerd Hoffmann
750 ee6847d1 Gerd Hoffmann
void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value)
751 ee6847d1 Gerd Hoffmann
{
752 ee6847d1 Gerd Hoffmann
    qdev_prop_set(dev, name, &value, PROP_TYPE_PTR);
753 ee6847d1 Gerd Hoffmann
}
754 ee6847d1 Gerd Hoffmann
755 ee6847d1 Gerd Hoffmann
void qdev_prop_set_defaults(DeviceState *dev, Property *props)
756 ee6847d1 Gerd Hoffmann
{
757 ee6847d1 Gerd Hoffmann
    if (!props)
758 ee6847d1 Gerd Hoffmann
        return;
759 ee6847d1 Gerd Hoffmann
    while (props->name) {
760 ee6847d1 Gerd Hoffmann
        if (props->defval) {
761 d2364ee4 Michael S. Tsirkin
            qdev_prop_cpy(dev, props, props->defval);
762 ee6847d1 Gerd Hoffmann
        }
763 ee6847d1 Gerd Hoffmann
        props++;
764 ee6847d1 Gerd Hoffmann
    }
765 ee6847d1 Gerd Hoffmann
}
766 ee6847d1 Gerd Hoffmann
767 458fb679 Gerd Hoffmann
static QTAILQ_HEAD(, GlobalProperty) global_props = QTAILQ_HEAD_INITIALIZER(global_props);
768 b6b61144 Gerd Hoffmann
769 25920d6a Kevin Wolf
static void qdev_prop_register_global(GlobalProperty *prop)
770 b6b61144 Gerd Hoffmann
{
771 458fb679 Gerd Hoffmann
    QTAILQ_INSERT_TAIL(&global_props, prop, next);
772 b6b61144 Gerd Hoffmann
}
773 b6b61144 Gerd Hoffmann
774 458fb679 Gerd Hoffmann
void qdev_prop_register_global_list(GlobalProperty *props)
775 b6b61144 Gerd Hoffmann
{
776 458fb679 Gerd Hoffmann
    int i;
777 b6b61144 Gerd Hoffmann
778 458fb679 Gerd Hoffmann
    for (i = 0; props[i].driver != NULL; i++) {
779 458fb679 Gerd Hoffmann
        qdev_prop_register_global(props+i);
780 b6b61144 Gerd Hoffmann
    }
781 458fb679 Gerd Hoffmann
}
782 458fb679 Gerd Hoffmann
783 458fb679 Gerd Hoffmann
void qdev_prop_set_globals(DeviceState *dev)
784 458fb679 Gerd Hoffmann
{
785 458fb679 Gerd Hoffmann
    GlobalProperty *prop;
786 458fb679 Gerd Hoffmann
787 458fb679 Gerd Hoffmann
    QTAILQ_FOREACH(prop, &global_props, next) {
788 07a8de35 Gerd Hoffmann
        if (strcmp(dev->info->name, prop->driver) != 0 &&
789 07a8de35 Gerd Hoffmann
            strcmp(dev->info->bus_info->name, prop->driver) != 0) {
790 b6b61144 Gerd Hoffmann
            continue;
791 b6b61144 Gerd Hoffmann
        }
792 b6b61144 Gerd Hoffmann
        if (qdev_prop_parse(dev, prop->property, prop->value) != 0) {
793 9ef5c4bf Gerd Hoffmann
            exit(1);
794 b6b61144 Gerd Hoffmann
        }
795 b6b61144 Gerd Hoffmann
    }
796 b6b61144 Gerd Hoffmann
}
797 25920d6a Kevin Wolf
798 25920d6a Kevin Wolf
static int qdev_add_one_global(QemuOpts *opts, void *opaque)
799 25920d6a Kevin Wolf
{
800 25920d6a Kevin Wolf
    GlobalProperty *g;
801 25920d6a Kevin Wolf
802 7267c094 Anthony Liguori
    g = g_malloc0(sizeof(*g));
803 25920d6a Kevin Wolf
    g->driver   = qemu_opt_get(opts, "driver");
804 25920d6a Kevin Wolf
    g->property = qemu_opt_get(opts, "property");
805 25920d6a Kevin Wolf
    g->value    = qemu_opt_get(opts, "value");
806 25920d6a Kevin Wolf
    qdev_prop_register_global(g);
807 25920d6a Kevin Wolf
    return 0;
808 25920d6a Kevin Wolf
}
809 25920d6a Kevin Wolf
810 25920d6a Kevin Wolf
void qemu_add_globals(void)
811 25920d6a Kevin Wolf
{
812 3329f07b Gerd Hoffmann
    qemu_opts_foreach(qemu_find_opts("global"), qdev_add_one_global, NULL, 0);
813 25920d6a Kevin Wolf
}