Statistics
| Branch: | Revision:

root / hw / qdev-properties.c @ 68fb89a2

History | View | Annotate | Download (16.7 kB)

1 14b41872 Gerd Hoffmann
#include "sysemu.h"
2 1503fff3 Gerd Hoffmann
#include "net.h"
3 ee6847d1 Gerd Hoffmann
#include "qdev.h"
4 9f59b566 Markus Armbruster
#include "qerror.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 d2364ee4 Michael S. Tsirkin
    uint8_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 c7cc172d Juan Quintela
    const char *fmt;
72 c7cc172d Juan Quintela
73 c7cc172d Juan Quintela
    /* accept both hex and decimal */
74 c7cc172d Juan Quintela
    fmt = strncasecmp(str, "0x",2) == 0 ? "%" PRIx8 : "%" PRIu8;
75 c7cc172d Juan Quintela
    if (sscanf(str, fmt, ptr) != 1)
76 6bf38816 Markus Armbruster
        return -EINVAL;
77 c7cc172d Juan Quintela
    return 0;
78 c7cc172d Juan Quintela
}
79 c7cc172d Juan Quintela
80 c7cc172d Juan Quintela
static int print_uint8(DeviceState *dev, Property *prop, char *dest, size_t len)
81 c7cc172d Juan Quintela
{
82 c7cc172d Juan Quintela
    uint8_t *ptr = qdev_get_prop_ptr(dev, prop);
83 c7cc172d Juan Quintela
    return snprintf(dest, len, "%" PRIu8, *ptr);
84 c7cc172d Juan Quintela
}
85 c7cc172d Juan Quintela
86 c7cc172d Juan Quintela
PropertyInfo qdev_prop_uint8 = {
87 c7cc172d Juan Quintela
    .name  = "uint8",
88 c7cc172d Juan Quintela
    .type  = PROP_TYPE_UINT8,
89 c7cc172d Juan Quintela
    .size  = sizeof(uint8_t),
90 c7cc172d Juan Quintela
    .parse = parse_uint8,
91 c7cc172d Juan Quintela
    .print = print_uint8,
92 c7cc172d Juan Quintela
};
93 c7cc172d Juan Quintela
94 ee6847d1 Gerd Hoffmann
/* --- 16bit integer --- */
95 ee6847d1 Gerd Hoffmann
96 ee6847d1 Gerd Hoffmann
static int parse_uint16(DeviceState *dev, Property *prop, const char *str)
97 ee6847d1 Gerd Hoffmann
{
98 ee6847d1 Gerd Hoffmann
    uint16_t *ptr = qdev_get_prop_ptr(dev, prop);
99 ee6847d1 Gerd Hoffmann
    const char *fmt;
100 ee6847d1 Gerd Hoffmann
101 ee6847d1 Gerd Hoffmann
    /* accept both hex and decimal */
102 ee6847d1 Gerd Hoffmann
    fmt = strncasecmp(str, "0x",2) == 0 ? "%" PRIx16 : "%" PRIu16;
103 ee6847d1 Gerd Hoffmann
    if (sscanf(str, fmt, ptr) != 1)
104 6bf38816 Markus Armbruster
        return -EINVAL;
105 ee6847d1 Gerd Hoffmann
    return 0;
106 ee6847d1 Gerd Hoffmann
}
107 ee6847d1 Gerd Hoffmann
108 ee6847d1 Gerd Hoffmann
static int print_uint16(DeviceState *dev, Property *prop, char *dest, size_t len)
109 ee6847d1 Gerd Hoffmann
{
110 ee6847d1 Gerd Hoffmann
    uint16_t *ptr = qdev_get_prop_ptr(dev, prop);
111 ee6847d1 Gerd Hoffmann
    return snprintf(dest, len, "%" PRIu16, *ptr);
112 ee6847d1 Gerd Hoffmann
}
113 ee6847d1 Gerd Hoffmann
114 ee6847d1 Gerd Hoffmann
PropertyInfo qdev_prop_uint16 = {
115 ee6847d1 Gerd Hoffmann
    .name  = "uint16",
116 ee6847d1 Gerd Hoffmann
    .type  = PROP_TYPE_UINT16,
117 ee6847d1 Gerd Hoffmann
    .size  = sizeof(uint16_t),
118 ee6847d1 Gerd Hoffmann
    .parse = parse_uint16,
119 ee6847d1 Gerd Hoffmann
    .print = print_uint16,
120 ee6847d1 Gerd Hoffmann
};
121 ee6847d1 Gerd Hoffmann
122 ee6847d1 Gerd Hoffmann
/* --- 32bit integer --- */
123 ee6847d1 Gerd Hoffmann
124 ee6847d1 Gerd Hoffmann
static int parse_uint32(DeviceState *dev, Property *prop, const char *str)
125 ee6847d1 Gerd Hoffmann
{
126 ee6847d1 Gerd Hoffmann
    uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
127 ee6847d1 Gerd Hoffmann
    const char *fmt;
128 ee6847d1 Gerd Hoffmann
129 ee6847d1 Gerd Hoffmann
    /* accept both hex and decimal */
130 ee6847d1 Gerd Hoffmann
    fmt = strncasecmp(str, "0x",2) == 0 ? "%" PRIx32 : "%" PRIu32;
131 ee6847d1 Gerd Hoffmann
    if (sscanf(str, fmt, ptr) != 1)
132 6bf38816 Markus Armbruster
        return -EINVAL;
133 ee6847d1 Gerd Hoffmann
    return 0;
134 ee6847d1 Gerd Hoffmann
}
135 ee6847d1 Gerd Hoffmann
136 ee6847d1 Gerd Hoffmann
static int print_uint32(DeviceState *dev, Property *prop, char *dest, size_t len)
137 ee6847d1 Gerd Hoffmann
{
138 ee6847d1 Gerd Hoffmann
    uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
139 ee6847d1 Gerd Hoffmann
    return snprintf(dest, len, "%" PRIu32, *ptr);
140 ee6847d1 Gerd Hoffmann
}
141 ee6847d1 Gerd Hoffmann
142 ee6847d1 Gerd Hoffmann
PropertyInfo qdev_prop_uint32 = {
143 ee6847d1 Gerd Hoffmann
    .name  = "uint32",
144 ee6847d1 Gerd Hoffmann
    .type  = PROP_TYPE_UINT32,
145 ee6847d1 Gerd Hoffmann
    .size  = sizeof(uint32_t),
146 ee6847d1 Gerd Hoffmann
    .parse = parse_uint32,
147 ee6847d1 Gerd Hoffmann
    .print = print_uint32,
148 ee6847d1 Gerd Hoffmann
};
149 ee6847d1 Gerd Hoffmann
150 316940b0 Gerd Hoffmann
static int parse_int32(DeviceState *dev, Property *prop, const char *str)
151 316940b0 Gerd Hoffmann
{
152 316940b0 Gerd Hoffmann
    int32_t *ptr = qdev_get_prop_ptr(dev, prop);
153 316940b0 Gerd Hoffmann
154 316940b0 Gerd Hoffmann
    if (sscanf(str, "%" PRId32, ptr) != 1)
155 6bf38816 Markus Armbruster
        return -EINVAL;
156 316940b0 Gerd Hoffmann
    return 0;
157 316940b0 Gerd Hoffmann
}
158 316940b0 Gerd Hoffmann
159 316940b0 Gerd Hoffmann
static int print_int32(DeviceState *dev, Property *prop, char *dest, size_t len)
160 316940b0 Gerd Hoffmann
{
161 316940b0 Gerd Hoffmann
    int32_t *ptr = qdev_get_prop_ptr(dev, prop);
162 316940b0 Gerd Hoffmann
    return snprintf(dest, len, "%" PRId32, *ptr);
163 316940b0 Gerd Hoffmann
}
164 316940b0 Gerd Hoffmann
165 316940b0 Gerd Hoffmann
PropertyInfo qdev_prop_int32 = {
166 316940b0 Gerd Hoffmann
    .name  = "int32",
167 316940b0 Gerd Hoffmann
    .type  = PROP_TYPE_INT32,
168 316940b0 Gerd Hoffmann
    .size  = sizeof(int32_t),
169 316940b0 Gerd Hoffmann
    .parse = parse_int32,
170 316940b0 Gerd Hoffmann
    .print = print_int32,
171 316940b0 Gerd Hoffmann
};
172 316940b0 Gerd Hoffmann
173 ee6847d1 Gerd Hoffmann
/* --- 32bit hex value --- */
174 ee6847d1 Gerd Hoffmann
175 ee6847d1 Gerd Hoffmann
static int parse_hex32(DeviceState *dev, Property *prop, const char *str)
176 ee6847d1 Gerd Hoffmann
{
177 ee6847d1 Gerd Hoffmann
    uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
178 ee6847d1 Gerd Hoffmann
179 ee6847d1 Gerd Hoffmann
    if (sscanf(str, "%" PRIx32, ptr) != 1)
180 6bf38816 Markus Armbruster
        return -EINVAL;
181 ee6847d1 Gerd Hoffmann
    return 0;
182 ee6847d1 Gerd Hoffmann
}
183 ee6847d1 Gerd Hoffmann
184 ee6847d1 Gerd Hoffmann
static int print_hex32(DeviceState *dev, Property *prop, char *dest, size_t len)
185 ee6847d1 Gerd Hoffmann
{
186 ee6847d1 Gerd Hoffmann
    uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
187 ee6847d1 Gerd Hoffmann
    return snprintf(dest, len, "0x%" PRIx32, *ptr);
188 ee6847d1 Gerd Hoffmann
}
189 ee6847d1 Gerd Hoffmann
190 ee6847d1 Gerd Hoffmann
PropertyInfo qdev_prop_hex32 = {
191 ee6847d1 Gerd Hoffmann
    .name  = "hex32",
192 ee6847d1 Gerd Hoffmann
    .type  = PROP_TYPE_UINT32,
193 ee6847d1 Gerd Hoffmann
    .size  = sizeof(uint32_t),
194 ee6847d1 Gerd Hoffmann
    .parse = parse_hex32,
195 ee6847d1 Gerd Hoffmann
    .print = print_hex32,
196 ee6847d1 Gerd Hoffmann
};
197 ee6847d1 Gerd Hoffmann
198 5a053d1f Blue Swirl
/* --- 64bit integer --- */
199 5a053d1f Blue Swirl
200 5a053d1f Blue Swirl
static int parse_uint64(DeviceState *dev, Property *prop, const char *str)
201 5a053d1f Blue Swirl
{
202 5a053d1f Blue Swirl
    uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
203 5a053d1f Blue Swirl
    const char *fmt;
204 5a053d1f Blue Swirl
205 5a053d1f Blue Swirl
    /* accept both hex and decimal */
206 5a053d1f Blue Swirl
    fmt = strncasecmp(str, "0x",2) == 0 ? "%" PRIx64 : "%" PRIu64;
207 5a053d1f Blue Swirl
    if (sscanf(str, fmt, ptr) != 1)
208 6bf38816 Markus Armbruster
        return -EINVAL;
209 5a053d1f Blue Swirl
    return 0;
210 5a053d1f Blue Swirl
}
211 5a053d1f Blue Swirl
212 5a053d1f Blue Swirl
static int print_uint64(DeviceState *dev, Property *prop, char *dest, size_t len)
213 5a053d1f Blue Swirl
{
214 5a053d1f Blue Swirl
    uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
215 5a053d1f Blue Swirl
    return snprintf(dest, len, "%" PRIu64, *ptr);
216 5a053d1f Blue Swirl
}
217 5a053d1f Blue Swirl
218 5a053d1f Blue Swirl
PropertyInfo qdev_prop_uint64 = {
219 5a053d1f Blue Swirl
    .name  = "uint64",
220 5a053d1f Blue Swirl
    .type  = PROP_TYPE_UINT64,
221 5a053d1f Blue Swirl
    .size  = sizeof(uint64_t),
222 5a053d1f Blue Swirl
    .parse = parse_uint64,
223 5a053d1f Blue Swirl
    .print = print_uint64,
224 5a053d1f Blue Swirl
};
225 5a053d1f Blue Swirl
226 5a053d1f Blue Swirl
/* --- 64bit hex value --- */
227 5a053d1f Blue Swirl
228 5a053d1f Blue Swirl
static int parse_hex64(DeviceState *dev, Property *prop, const char *str)
229 5a053d1f Blue Swirl
{
230 5a053d1f Blue Swirl
    uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
231 5a053d1f Blue Swirl
232 5a053d1f Blue Swirl
    if (sscanf(str, "%" PRIx64, ptr) != 1)
233 6bf38816 Markus Armbruster
        return -EINVAL;
234 5a053d1f Blue Swirl
    return 0;
235 5a053d1f Blue Swirl
}
236 5a053d1f Blue Swirl
237 5a053d1f Blue Swirl
static int print_hex64(DeviceState *dev, Property *prop, char *dest, size_t len)
238 5a053d1f Blue Swirl
{
239 5a053d1f Blue Swirl
    uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
240 5a053d1f Blue Swirl
    return snprintf(dest, len, "0x%" PRIx64, *ptr);
241 5a053d1f Blue Swirl
}
242 5a053d1f Blue Swirl
243 5a053d1f Blue Swirl
PropertyInfo qdev_prop_hex64 = {
244 5a053d1f Blue Swirl
    .name  = "hex64",
245 5a053d1f Blue Swirl
    .type  = PROP_TYPE_UINT64,
246 5a053d1f Blue Swirl
    .size  = sizeof(uint64_t),
247 5a053d1f Blue Swirl
    .parse = parse_hex64,
248 5a053d1f Blue Swirl
    .print = print_hex64,
249 5a053d1f Blue Swirl
};
250 5a053d1f Blue Swirl
251 59419663 Gerd Hoffmann
/* --- string --- */
252 59419663 Gerd Hoffmann
253 59419663 Gerd Hoffmann
static int parse_string(DeviceState *dev, Property *prop, const char *str)
254 59419663 Gerd Hoffmann
{
255 59419663 Gerd Hoffmann
    char **ptr = qdev_get_prop_ptr(dev, prop);
256 59419663 Gerd Hoffmann
257 59419663 Gerd Hoffmann
    if (*ptr)
258 59419663 Gerd Hoffmann
        qemu_free(*ptr);
259 59419663 Gerd Hoffmann
    *ptr = qemu_strdup(str);
260 59419663 Gerd Hoffmann
    return 0;
261 59419663 Gerd Hoffmann
}
262 59419663 Gerd Hoffmann
263 59419663 Gerd Hoffmann
static int print_string(DeviceState *dev, Property *prop, char *dest, size_t len)
264 59419663 Gerd Hoffmann
{
265 59419663 Gerd Hoffmann
    char **ptr = qdev_get_prop_ptr(dev, prop);
266 59419663 Gerd Hoffmann
    if (!*ptr)
267 59419663 Gerd Hoffmann
        return snprintf(dest, len, "<null>");
268 59419663 Gerd Hoffmann
    return snprintf(dest, len, "\"%s\"", *ptr);
269 59419663 Gerd Hoffmann
}
270 59419663 Gerd Hoffmann
271 59419663 Gerd Hoffmann
PropertyInfo qdev_prop_string = {
272 59419663 Gerd Hoffmann
    .name  = "string",
273 59419663 Gerd Hoffmann
    .type  = PROP_TYPE_STRING,
274 59419663 Gerd Hoffmann
    .size  = sizeof(char*),
275 59419663 Gerd Hoffmann
    .parse = parse_string,
276 59419663 Gerd Hoffmann
    .print = print_string,
277 59419663 Gerd Hoffmann
};
278 59419663 Gerd Hoffmann
279 14b41872 Gerd Hoffmann
/* --- drive --- */
280 14b41872 Gerd Hoffmann
281 14b41872 Gerd Hoffmann
static int parse_drive(DeviceState *dev, Property *prop, const char *str)
282 14b41872 Gerd Hoffmann
{
283 14b41872 Gerd Hoffmann
    DriveInfo **ptr = qdev_get_prop_ptr(dev, prop);
284 14b41872 Gerd Hoffmann
285 14b41872 Gerd Hoffmann
    *ptr = drive_get_by_id(str);
286 14b41872 Gerd Hoffmann
    if (*ptr == NULL)
287 6bf38816 Markus Armbruster
        return -ENOENT;
288 14b41872 Gerd Hoffmann
    return 0;
289 14b41872 Gerd Hoffmann
}
290 14b41872 Gerd Hoffmann
291 14b41872 Gerd Hoffmann
static int print_drive(DeviceState *dev, Property *prop, char *dest, size_t len)
292 14b41872 Gerd Hoffmann
{
293 14b41872 Gerd Hoffmann
    DriveInfo **ptr = qdev_get_prop_ptr(dev, prop);
294 41b5e892 Gerd Hoffmann
    return snprintf(dest, len, "%s", (*ptr) ? (*ptr)->id : "<null>");
295 14b41872 Gerd Hoffmann
}
296 14b41872 Gerd Hoffmann
297 14b41872 Gerd Hoffmann
PropertyInfo qdev_prop_drive = {
298 14b41872 Gerd Hoffmann
    .name  = "drive",
299 14b41872 Gerd Hoffmann
    .type  = PROP_TYPE_DRIVE,
300 14b41872 Gerd Hoffmann
    .size  = sizeof(DriveInfo*),
301 14b41872 Gerd Hoffmann
    .parse = parse_drive,
302 14b41872 Gerd Hoffmann
    .print = print_drive,
303 14b41872 Gerd Hoffmann
};
304 14b41872 Gerd Hoffmann
305 313feaab Gerd Hoffmann
/* --- character device --- */
306 313feaab Gerd Hoffmann
307 06113719 Gerd Hoffmann
static int parse_chr(DeviceState *dev, Property *prop, const char *str)
308 06113719 Gerd Hoffmann
{
309 06113719 Gerd Hoffmann
    CharDriverState **ptr = qdev_get_prop_ptr(dev, prop);
310 06113719 Gerd Hoffmann
311 06113719 Gerd Hoffmann
    *ptr = qemu_chr_find(str);
312 06113719 Gerd Hoffmann
    if (*ptr == NULL)
313 6bf38816 Markus Armbruster
        return -ENOENT;
314 06113719 Gerd Hoffmann
    return 0;
315 06113719 Gerd Hoffmann
}
316 06113719 Gerd Hoffmann
317 313feaab Gerd Hoffmann
static int print_chr(DeviceState *dev, Property *prop, char *dest, size_t len)
318 313feaab Gerd Hoffmann
{
319 313feaab Gerd Hoffmann
    CharDriverState **ptr = qdev_get_prop_ptr(dev, prop);
320 bc19fcaa Blue Swirl
321 bc19fcaa Blue Swirl
    if (*ptr && (*ptr)->label) {
322 bc19fcaa Blue Swirl
        return snprintf(dest, len, "%s", (*ptr)->label);
323 bc19fcaa Blue Swirl
    } else {
324 bc19fcaa Blue Swirl
        return snprintf(dest, len, "<null>");
325 bc19fcaa Blue Swirl
    }
326 313feaab Gerd Hoffmann
}
327 313feaab Gerd Hoffmann
328 313feaab Gerd Hoffmann
PropertyInfo qdev_prop_chr = {
329 313feaab Gerd Hoffmann
    .name  = "chr",
330 313feaab Gerd Hoffmann
    .type  = PROP_TYPE_CHR,
331 313feaab Gerd Hoffmann
    .size  = sizeof(CharDriverState*),
332 06113719 Gerd Hoffmann
    .parse = parse_chr,
333 313feaab Gerd Hoffmann
    .print = print_chr,
334 313feaab Gerd Hoffmann
};
335 313feaab Gerd Hoffmann
336 2ef924b4 Gerd Hoffmann
/* --- netdev device --- */
337 2ef924b4 Gerd Hoffmann
338 2ef924b4 Gerd Hoffmann
static int parse_netdev(DeviceState *dev, Property *prop, const char *str)
339 2ef924b4 Gerd Hoffmann
{
340 2ef924b4 Gerd Hoffmann
    VLANClientState **ptr = qdev_get_prop_ptr(dev, prop);
341 2ef924b4 Gerd Hoffmann
342 2ef924b4 Gerd Hoffmann
    *ptr = qemu_find_netdev(str);
343 2ef924b4 Gerd Hoffmann
    if (*ptr == NULL)
344 6bf38816 Markus Armbruster
        return -ENOENT;
345 27f3f8a3 Markus Armbruster
    if ((*ptr)->peer) {
346 27f3f8a3 Markus Armbruster
        return -EEXIST;
347 27f3f8a3 Markus Armbruster
    }
348 2ef924b4 Gerd Hoffmann
    return 0;
349 2ef924b4 Gerd Hoffmann
}
350 2ef924b4 Gerd Hoffmann
351 2ef924b4 Gerd Hoffmann
static int print_netdev(DeviceState *dev, Property *prop, char *dest, size_t len)
352 2ef924b4 Gerd Hoffmann
{
353 2ef924b4 Gerd Hoffmann
    VLANClientState **ptr = qdev_get_prop_ptr(dev, prop);
354 2ef924b4 Gerd Hoffmann
355 2ef924b4 Gerd Hoffmann
    if (*ptr && (*ptr)->name) {
356 2ef924b4 Gerd Hoffmann
        return snprintf(dest, len, "%s", (*ptr)->name);
357 2ef924b4 Gerd Hoffmann
    } else {
358 2ef924b4 Gerd Hoffmann
        return snprintf(dest, len, "<null>");
359 2ef924b4 Gerd Hoffmann
    }
360 2ef924b4 Gerd Hoffmann
}
361 2ef924b4 Gerd Hoffmann
362 2ef924b4 Gerd Hoffmann
PropertyInfo qdev_prop_netdev = {
363 2ef924b4 Gerd Hoffmann
    .name  = "netdev",
364 2ef924b4 Gerd Hoffmann
    .type  = PROP_TYPE_NETDEV,
365 2ef924b4 Gerd Hoffmann
    .size  = sizeof(VLANClientState*),
366 2ef924b4 Gerd Hoffmann
    .parse = parse_netdev,
367 2ef924b4 Gerd Hoffmann
    .print = print_netdev,
368 2ef924b4 Gerd Hoffmann
};
369 2ef924b4 Gerd Hoffmann
370 851bec09 Gerd Hoffmann
/* --- vlan --- */
371 851bec09 Gerd Hoffmann
372 851bec09 Gerd Hoffmann
static int parse_vlan(DeviceState *dev, Property *prop, const char *str)
373 851bec09 Gerd Hoffmann
{
374 851bec09 Gerd Hoffmann
    VLANState **ptr = qdev_get_prop_ptr(dev, prop);
375 851bec09 Gerd Hoffmann
    int id;
376 851bec09 Gerd Hoffmann
377 851bec09 Gerd Hoffmann
    if (sscanf(str, "%d", &id) != 1)
378 6bf38816 Markus Armbruster
        return -EINVAL;
379 851bec09 Gerd Hoffmann
    *ptr = qemu_find_vlan(id, 1);
380 851bec09 Gerd Hoffmann
    if (*ptr == NULL)
381 6bf38816 Markus Armbruster
        return -ENOENT;
382 851bec09 Gerd Hoffmann
    return 0;
383 851bec09 Gerd Hoffmann
}
384 851bec09 Gerd Hoffmann
385 851bec09 Gerd Hoffmann
static int print_vlan(DeviceState *dev, Property *prop, char *dest, size_t len)
386 851bec09 Gerd Hoffmann
{
387 851bec09 Gerd Hoffmann
    VLANState **ptr = qdev_get_prop_ptr(dev, prop);
388 851bec09 Gerd Hoffmann
389 851bec09 Gerd Hoffmann
    if (*ptr) {
390 851bec09 Gerd Hoffmann
        return snprintf(dest, len, "%d", (*ptr)->id);
391 851bec09 Gerd Hoffmann
    } else {
392 851bec09 Gerd Hoffmann
        return snprintf(dest, len, "<null>");
393 851bec09 Gerd Hoffmann
    }
394 851bec09 Gerd Hoffmann
}
395 851bec09 Gerd Hoffmann
396 851bec09 Gerd Hoffmann
PropertyInfo qdev_prop_vlan = {
397 851bec09 Gerd Hoffmann
    .name  = "vlan",
398 851bec09 Gerd Hoffmann
    .type  = PROP_TYPE_VLAN,
399 851bec09 Gerd Hoffmann
    .size  = sizeof(VLANClientState*),
400 851bec09 Gerd Hoffmann
    .parse = parse_vlan,
401 851bec09 Gerd Hoffmann
    .print = print_vlan,
402 851bec09 Gerd Hoffmann
};
403 851bec09 Gerd Hoffmann
404 ee6847d1 Gerd Hoffmann
/* --- pointer --- */
405 ee6847d1 Gerd Hoffmann
406 036f7166 Markus Armbruster
/* Not a proper property, just for dirty hacks.  TODO Remove it!  */
407 ee6847d1 Gerd Hoffmann
PropertyInfo qdev_prop_ptr = {
408 ee6847d1 Gerd Hoffmann
    .name  = "ptr",
409 ee6847d1 Gerd Hoffmann
    .type  = PROP_TYPE_PTR,
410 ee6847d1 Gerd Hoffmann
    .size  = sizeof(void*),
411 ee6847d1 Gerd Hoffmann
};
412 ee6847d1 Gerd Hoffmann
413 ee6847d1 Gerd Hoffmann
/* --- mac address --- */
414 ee6847d1 Gerd Hoffmann
415 ee6847d1 Gerd Hoffmann
/*
416 ee6847d1 Gerd Hoffmann
 * accepted syntax versions:
417 ee6847d1 Gerd Hoffmann
 *   01:02:03:04:05:06
418 ee6847d1 Gerd Hoffmann
 *   01-02-03-04-05-06
419 ee6847d1 Gerd Hoffmann
 */
420 ee6847d1 Gerd Hoffmann
static int parse_mac(DeviceState *dev, Property *prop, const char *str)
421 ee6847d1 Gerd Hoffmann
{
422 1503fff3 Gerd Hoffmann
    MACAddr *mac = qdev_get_prop_ptr(dev, prop);
423 ee6847d1 Gerd Hoffmann
    int i, pos;
424 ee6847d1 Gerd Hoffmann
    char *p;
425 ee6847d1 Gerd Hoffmann
426 ee6847d1 Gerd Hoffmann
    for (i = 0, pos = 0; i < 6; i++, pos += 3) {
427 88e150a5 Christoph Egger
        if (!qemu_isxdigit(str[pos]))
428 6bf38816 Markus Armbruster
            return -EINVAL;
429 88e150a5 Christoph Egger
        if (!qemu_isxdigit(str[pos+1]))
430 6bf38816 Markus Armbruster
            return -EINVAL;
431 1503fff3 Gerd Hoffmann
        if (i == 5) {
432 1503fff3 Gerd Hoffmann
            if (str[pos+2] != '\0')
433 6bf38816 Markus Armbruster
                return -EINVAL;
434 1503fff3 Gerd Hoffmann
        } else {
435 1503fff3 Gerd Hoffmann
            if (str[pos+2] != ':' && str[pos+2] != '-')
436 6bf38816 Markus Armbruster
                return -EINVAL;
437 1503fff3 Gerd Hoffmann
        }
438 1503fff3 Gerd Hoffmann
        mac->a[i] = strtol(str+pos, &p, 16);
439 ee6847d1 Gerd Hoffmann
    }
440 ee6847d1 Gerd Hoffmann
    return 0;
441 ee6847d1 Gerd Hoffmann
}
442 ee6847d1 Gerd Hoffmann
443 ee6847d1 Gerd Hoffmann
static int print_mac(DeviceState *dev, Property *prop, char *dest, size_t len)
444 ee6847d1 Gerd Hoffmann
{
445 1503fff3 Gerd Hoffmann
    MACAddr *mac = qdev_get_prop_ptr(dev, prop);
446 1503fff3 Gerd Hoffmann
447 ee6847d1 Gerd Hoffmann
    return snprintf(dest, len, "%02x:%02x:%02x:%02x:%02x:%02x",
448 1503fff3 Gerd Hoffmann
                    mac->a[0], mac->a[1], mac->a[2],
449 1503fff3 Gerd Hoffmann
                    mac->a[3], mac->a[4], mac->a[5]);
450 ee6847d1 Gerd Hoffmann
}
451 ee6847d1 Gerd Hoffmann
452 ee6847d1 Gerd Hoffmann
PropertyInfo qdev_prop_macaddr = {
453 1503fff3 Gerd Hoffmann
    .name  = "macaddr",
454 ee6847d1 Gerd Hoffmann
    .type  = PROP_TYPE_MACADDR,
455 1503fff3 Gerd Hoffmann
    .size  = sizeof(MACAddr),
456 ee6847d1 Gerd Hoffmann
    .parse = parse_mac,
457 ee6847d1 Gerd Hoffmann
    .print = print_mac,
458 ee6847d1 Gerd Hoffmann
};
459 ee6847d1 Gerd Hoffmann
460 05cb5fe4 Gerd Hoffmann
/* --- pci address --- */
461 05cb5fe4 Gerd Hoffmann
462 05cb5fe4 Gerd Hoffmann
/*
463 05cb5fe4 Gerd Hoffmann
 * bus-local address, i.e. "$slot" or "$slot.$fn"
464 05cb5fe4 Gerd Hoffmann
 */
465 05cb5fe4 Gerd Hoffmann
static int parse_pci_devfn(DeviceState *dev, Property *prop, const char *str)
466 05cb5fe4 Gerd Hoffmann
{
467 05cb5fe4 Gerd Hoffmann
    uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
468 05cb5fe4 Gerd Hoffmann
    unsigned int slot, fn, n;
469 05cb5fe4 Gerd Hoffmann
470 05cb5fe4 Gerd Hoffmann
    if (sscanf(str, "%x.%x%n", &slot, &fn, &n) != 2) {
471 05cb5fe4 Gerd Hoffmann
        fn = 0;
472 05cb5fe4 Gerd Hoffmann
        if (sscanf(str, "%x%n", &slot, &n) != 1) {
473 6bf38816 Markus Armbruster
            return -EINVAL;
474 05cb5fe4 Gerd Hoffmann
        }
475 05cb5fe4 Gerd Hoffmann
    }
476 05cb5fe4 Gerd Hoffmann
    if (str[n] != '\0')
477 6bf38816 Markus Armbruster
        return -EINVAL;
478 05cb5fe4 Gerd Hoffmann
    if (fn > 7)
479 6bf38816 Markus Armbruster
        return -EINVAL;
480 05cb5fe4 Gerd Hoffmann
    *ptr = slot << 3 | fn;
481 05cb5fe4 Gerd Hoffmann
    return 0;
482 05cb5fe4 Gerd Hoffmann
}
483 05cb5fe4 Gerd Hoffmann
484 05cb5fe4 Gerd Hoffmann
static int print_pci_devfn(DeviceState *dev, Property *prop, char *dest, size_t len)
485 05cb5fe4 Gerd Hoffmann
{
486 05cb5fe4 Gerd Hoffmann
    uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
487 05cb5fe4 Gerd Hoffmann
488 73538c31 Blue Swirl
    if (*ptr == -1) {
489 05cb5fe4 Gerd Hoffmann
        return snprintf(dest, len, "<unset>");
490 05cb5fe4 Gerd Hoffmann
    } else {
491 05cb5fe4 Gerd Hoffmann
        return snprintf(dest, len, "%02x.%x", *ptr >> 3, *ptr & 7);
492 05cb5fe4 Gerd Hoffmann
    }
493 05cb5fe4 Gerd Hoffmann
}
494 05cb5fe4 Gerd Hoffmann
495 05cb5fe4 Gerd Hoffmann
PropertyInfo qdev_prop_pci_devfn = {
496 05cb5fe4 Gerd Hoffmann
    .name  = "pci-devfn",
497 05cb5fe4 Gerd Hoffmann
    .type  = PROP_TYPE_UINT32,
498 05cb5fe4 Gerd Hoffmann
    .size  = sizeof(uint32_t),
499 05cb5fe4 Gerd Hoffmann
    .parse = parse_pci_devfn,
500 05cb5fe4 Gerd Hoffmann
    .print = print_pci_devfn,
501 05cb5fe4 Gerd Hoffmann
};
502 05cb5fe4 Gerd Hoffmann
503 ee6847d1 Gerd Hoffmann
/* --- public helpers --- */
504 ee6847d1 Gerd Hoffmann
505 ee6847d1 Gerd Hoffmann
static Property *qdev_prop_walk(Property *props, const char *name)
506 ee6847d1 Gerd Hoffmann
{
507 ee6847d1 Gerd Hoffmann
    if (!props)
508 ee6847d1 Gerd Hoffmann
        return NULL;
509 ee6847d1 Gerd Hoffmann
    while (props->name) {
510 ee6847d1 Gerd Hoffmann
        if (strcmp(props->name, name) == 0)
511 ee6847d1 Gerd Hoffmann
            return props;
512 ee6847d1 Gerd Hoffmann
        props++;
513 ee6847d1 Gerd Hoffmann
    }
514 ee6847d1 Gerd Hoffmann
    return NULL;
515 ee6847d1 Gerd Hoffmann
}
516 ee6847d1 Gerd Hoffmann
517 ee6847d1 Gerd Hoffmann
static Property *qdev_prop_find(DeviceState *dev, const char *name)
518 ee6847d1 Gerd Hoffmann
{
519 ee6847d1 Gerd Hoffmann
    Property *prop;
520 ee6847d1 Gerd Hoffmann
521 ee6847d1 Gerd Hoffmann
    /* device properties */
522 ee6847d1 Gerd Hoffmann
    prop = qdev_prop_walk(dev->info->props, name);
523 ee6847d1 Gerd Hoffmann
    if (prop)
524 ee6847d1 Gerd Hoffmann
        return prop;
525 ee6847d1 Gerd Hoffmann
526 ee6847d1 Gerd Hoffmann
    /* bus properties */
527 ee6847d1 Gerd Hoffmann
    prop = qdev_prop_walk(dev->parent_bus->info->props, name);
528 ee6847d1 Gerd Hoffmann
    if (prop)
529 ee6847d1 Gerd Hoffmann
        return prop;
530 ee6847d1 Gerd Hoffmann
531 ee6847d1 Gerd Hoffmann
    return NULL;
532 ee6847d1 Gerd Hoffmann
}
533 ee6847d1 Gerd Hoffmann
534 d8ed79ae Gerd Hoffmann
int qdev_prop_exists(DeviceState *dev, const char *name)
535 d8ed79ae Gerd Hoffmann
{
536 d8ed79ae Gerd Hoffmann
    return qdev_prop_find(dev, name) ? true : false;
537 d8ed79ae Gerd Hoffmann
}
538 d8ed79ae Gerd Hoffmann
539 ee6847d1 Gerd Hoffmann
int qdev_prop_parse(DeviceState *dev, const char *name, const char *value)
540 ee6847d1 Gerd Hoffmann
{
541 ee6847d1 Gerd Hoffmann
    Property *prop;
542 6bf38816 Markus Armbruster
    int ret;
543 ee6847d1 Gerd Hoffmann
544 ee6847d1 Gerd Hoffmann
    prop = qdev_prop_find(dev, name);
545 036f7166 Markus Armbruster
    /*
546 036f7166 Markus Armbruster
     * TODO Properties without a parse method are just for dirty
547 036f7166 Markus Armbruster
     * hacks.  qdev_prop_ptr is the only such PropertyInfo.  It's
548 036f7166 Markus Armbruster
     * marked for removal.  The test !prop->info->parse should be
549 036f7166 Markus Armbruster
     * removed along with it.
550 036f7166 Markus Armbruster
     */
551 036f7166 Markus Armbruster
    if (!prop || !prop->info->parse) {
552 fdcfa190 Markus Armbruster
        qerror_report(QERR_PROPERTY_NOT_FOUND, dev->info->name, name);
553 ee6847d1 Gerd Hoffmann
        return -1;
554 ee6847d1 Gerd Hoffmann
    }
555 6bf38816 Markus Armbruster
    ret = prop->info->parse(dev, prop, value);
556 6bf38816 Markus Armbruster
    if (ret < 0) {
557 6bf38816 Markus Armbruster
        switch (ret) {
558 27f3f8a3 Markus Armbruster
        case -EEXIST:
559 fdcfa190 Markus Armbruster
            qerror_report(QERR_PROPERTY_VALUE_IN_USE,
560 fdcfa190 Markus Armbruster
                          dev->info->name, name, value);
561 27f3f8a3 Markus Armbruster
            break;
562 6bf38816 Markus Armbruster
        default:
563 6bf38816 Markus Armbruster
        case -EINVAL:
564 fdcfa190 Markus Armbruster
            qerror_report(QERR_PROPERTY_VALUE_BAD,
565 fdcfa190 Markus Armbruster
                          dev->info->name, name, value);
566 6bf38816 Markus Armbruster
            break;
567 6bf38816 Markus Armbruster
        case -ENOENT:
568 fdcfa190 Markus Armbruster
            qerror_report(QERR_PROPERTY_VALUE_NOT_FOUND,
569 fdcfa190 Markus Armbruster
                          dev->info->name, name, value);
570 6bf38816 Markus Armbruster
            break;
571 6bf38816 Markus Armbruster
        }
572 9ef5c4bf Gerd Hoffmann
        return -1;
573 9ef5c4bf Gerd Hoffmann
    }
574 9ef5c4bf Gerd Hoffmann
    return 0;
575 ee6847d1 Gerd Hoffmann
}
576 ee6847d1 Gerd Hoffmann
577 ee6847d1 Gerd Hoffmann
void qdev_prop_set(DeviceState *dev, const char *name, void *src, enum PropertyType type)
578 ee6847d1 Gerd Hoffmann
{
579 ee6847d1 Gerd Hoffmann
    Property *prop;
580 ee6847d1 Gerd Hoffmann
581 ee6847d1 Gerd Hoffmann
    prop = qdev_prop_find(dev, name);
582 ee6847d1 Gerd Hoffmann
    if (!prop) {
583 ee6847d1 Gerd Hoffmann
        fprintf(stderr, "%s: property \"%s.%s\" not found\n",
584 ee6847d1 Gerd Hoffmann
                __FUNCTION__, dev->info->name, name);
585 ee6847d1 Gerd Hoffmann
        abort();
586 ee6847d1 Gerd Hoffmann
    }
587 ee6847d1 Gerd Hoffmann
    if (prop->info->type != type) {
588 ee6847d1 Gerd Hoffmann
        fprintf(stderr, "%s: property \"%s.%s\" type mismatch\n",
589 ee6847d1 Gerd Hoffmann
                __FUNCTION__, dev->info->name, name);
590 ee6847d1 Gerd Hoffmann
        abort();
591 ee6847d1 Gerd Hoffmann
    }
592 d2364ee4 Michael S. Tsirkin
    qdev_prop_cpy(dev, prop, src);
593 ee6847d1 Gerd Hoffmann
}
594 ee6847d1 Gerd Hoffmann
595 c7cc172d Juan Quintela
void qdev_prop_set_uint8(DeviceState *dev, const char *name, uint8_t value)
596 c7cc172d Juan Quintela
{
597 c7cc172d Juan Quintela
    qdev_prop_set(dev, name, &value, PROP_TYPE_UINT8);
598 c7cc172d Juan Quintela
}
599 c7cc172d Juan Quintela
600 ee6847d1 Gerd Hoffmann
void qdev_prop_set_uint16(DeviceState *dev, const char *name, uint16_t value)
601 ee6847d1 Gerd Hoffmann
{
602 ee6847d1 Gerd Hoffmann
    qdev_prop_set(dev, name, &value, PROP_TYPE_UINT16);
603 ee6847d1 Gerd Hoffmann
}
604 ee6847d1 Gerd Hoffmann
605 ee6847d1 Gerd Hoffmann
void qdev_prop_set_uint32(DeviceState *dev, const char *name, uint32_t value)
606 ee6847d1 Gerd Hoffmann
{
607 ee6847d1 Gerd Hoffmann
    qdev_prop_set(dev, name, &value, PROP_TYPE_UINT32);
608 ee6847d1 Gerd Hoffmann
}
609 ee6847d1 Gerd Hoffmann
610 316940b0 Gerd Hoffmann
void qdev_prop_set_int32(DeviceState *dev, const char *name, int32_t value)
611 316940b0 Gerd Hoffmann
{
612 316940b0 Gerd Hoffmann
    qdev_prop_set(dev, name, &value, PROP_TYPE_INT32);
613 316940b0 Gerd Hoffmann
}
614 316940b0 Gerd Hoffmann
615 5a053d1f Blue Swirl
void qdev_prop_set_uint64(DeviceState *dev, const char *name, uint64_t value)
616 5a053d1f Blue Swirl
{
617 5a053d1f Blue Swirl
    qdev_prop_set(dev, name, &value, PROP_TYPE_UINT64);
618 5a053d1f Blue Swirl
}
619 5a053d1f Blue Swirl
620 14b41872 Gerd Hoffmann
void qdev_prop_set_drive(DeviceState *dev, const char *name, DriveInfo *value)
621 14b41872 Gerd Hoffmann
{
622 14b41872 Gerd Hoffmann
    qdev_prop_set(dev, name, &value, PROP_TYPE_DRIVE);
623 14b41872 Gerd Hoffmann
}
624 14b41872 Gerd Hoffmann
625 313feaab Gerd Hoffmann
void qdev_prop_set_chr(DeviceState *dev, const char *name, CharDriverState *value)
626 313feaab Gerd Hoffmann
{
627 313feaab Gerd Hoffmann
    qdev_prop_set(dev, name, &value, PROP_TYPE_CHR);
628 313feaab Gerd Hoffmann
}
629 313feaab Gerd Hoffmann
630 2ef924b4 Gerd Hoffmann
void qdev_prop_set_netdev(DeviceState *dev, const char *name, VLANClientState *value)
631 2ef924b4 Gerd Hoffmann
{
632 2ef924b4 Gerd Hoffmann
    qdev_prop_set(dev, name, &value, PROP_TYPE_NETDEV);
633 2ef924b4 Gerd Hoffmann
}
634 2ef924b4 Gerd Hoffmann
635 851bec09 Gerd Hoffmann
void qdev_prop_set_vlan(DeviceState *dev, const char *name, VLANState *value)
636 851bec09 Gerd Hoffmann
{
637 851bec09 Gerd Hoffmann
    qdev_prop_set(dev, name, &value, PROP_TYPE_VLAN);
638 851bec09 Gerd Hoffmann
}
639 851bec09 Gerd Hoffmann
640 1503fff3 Gerd Hoffmann
void qdev_prop_set_macaddr(DeviceState *dev, const char *name, uint8_t *value)
641 1503fff3 Gerd Hoffmann
{
642 1503fff3 Gerd Hoffmann
    qdev_prop_set(dev, name, value, PROP_TYPE_MACADDR);
643 1503fff3 Gerd Hoffmann
}
644 1503fff3 Gerd Hoffmann
645 ee6847d1 Gerd Hoffmann
void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value)
646 ee6847d1 Gerd Hoffmann
{
647 ee6847d1 Gerd Hoffmann
    qdev_prop_set(dev, name, &value, PROP_TYPE_PTR);
648 ee6847d1 Gerd Hoffmann
}
649 ee6847d1 Gerd Hoffmann
650 ee6847d1 Gerd Hoffmann
void qdev_prop_set_defaults(DeviceState *dev, Property *props)
651 ee6847d1 Gerd Hoffmann
{
652 ee6847d1 Gerd Hoffmann
    if (!props)
653 ee6847d1 Gerd Hoffmann
        return;
654 ee6847d1 Gerd Hoffmann
    while (props->name) {
655 ee6847d1 Gerd Hoffmann
        if (props->defval) {
656 d2364ee4 Michael S. Tsirkin
            qdev_prop_cpy(dev, props, props->defval);
657 ee6847d1 Gerd Hoffmann
        }
658 ee6847d1 Gerd Hoffmann
        props++;
659 ee6847d1 Gerd Hoffmann
    }
660 ee6847d1 Gerd Hoffmann
}
661 ee6847d1 Gerd Hoffmann
662 458fb679 Gerd Hoffmann
static QTAILQ_HEAD(, GlobalProperty) global_props = QTAILQ_HEAD_INITIALIZER(global_props);
663 b6b61144 Gerd Hoffmann
664 458fb679 Gerd Hoffmann
void qdev_prop_register_global(GlobalProperty *prop)
665 b6b61144 Gerd Hoffmann
{
666 458fb679 Gerd Hoffmann
    QTAILQ_INSERT_TAIL(&global_props, prop, next);
667 b6b61144 Gerd Hoffmann
}
668 b6b61144 Gerd Hoffmann
669 458fb679 Gerd Hoffmann
void qdev_prop_register_global_list(GlobalProperty *props)
670 b6b61144 Gerd Hoffmann
{
671 458fb679 Gerd Hoffmann
    int i;
672 b6b61144 Gerd Hoffmann
673 458fb679 Gerd Hoffmann
    for (i = 0; props[i].driver != NULL; i++) {
674 458fb679 Gerd Hoffmann
        qdev_prop_register_global(props+i);
675 b6b61144 Gerd Hoffmann
    }
676 458fb679 Gerd Hoffmann
}
677 458fb679 Gerd Hoffmann
678 458fb679 Gerd Hoffmann
void qdev_prop_set_globals(DeviceState *dev)
679 458fb679 Gerd Hoffmann
{
680 458fb679 Gerd Hoffmann
    GlobalProperty *prop;
681 458fb679 Gerd Hoffmann
682 458fb679 Gerd Hoffmann
    QTAILQ_FOREACH(prop, &global_props, next) {
683 07a8de35 Gerd Hoffmann
        if (strcmp(dev->info->name, prop->driver) != 0 &&
684 07a8de35 Gerd Hoffmann
            strcmp(dev->info->bus_info->name, prop->driver) != 0) {
685 b6b61144 Gerd Hoffmann
            continue;
686 b6b61144 Gerd Hoffmann
        }
687 b6b61144 Gerd Hoffmann
        if (qdev_prop_parse(dev, prop->property, prop->value) != 0) {
688 9ef5c4bf Gerd Hoffmann
            exit(1);
689 b6b61144 Gerd Hoffmann
        }
690 b6b61144 Gerd Hoffmann
    }
691 b6b61144 Gerd Hoffmann
}