Statistics
| Branch: | Revision:

root / hw / qdev-properties.c @ dc333cd6

History | View | Annotate | Download (16.2 kB)

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