Statistics
| Branch: | Revision:

root / hw / qdev-properties.c @ 1237ad76

History | View | Annotate | Download (17.4 kB)

1 1503fff3 Gerd Hoffmann
#include "net.h"
2 ee6847d1 Gerd Hoffmann
#include "qdev.h"
3 9f59b566 Markus Armbruster
#include "qerror.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 6bf38816 Markus Armbruster
        return -EINVAL;
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 6bf38816 Markus Armbruster
        return -EINVAL;
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 6bf38816 Markus Armbruster
        return -EINVAL;
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 6bf38816 Markus Armbruster
        return -EINVAL;
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 6bf38816 Markus Armbruster
        return -EINVAL;
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 6bf38816 Markus Armbruster
        return -EINVAL;
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 6bf38816 Markus Armbruster
        return -EINVAL;
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 6bf38816 Markus Armbruster
        return -EINVAL;
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 d21357df Markus Armbruster
static void free_string(DeviceState *dev, Property *prop)
263 d21357df Markus Armbruster
{
264 d21357df Markus Armbruster
    qemu_free(*(char **)qdev_get_prop_ptr(dev, prop));
265 d21357df Markus Armbruster
}
266 d21357df Markus Armbruster
267 59419663 Gerd Hoffmann
static int print_string(DeviceState *dev, Property *prop, char *dest, size_t len)
268 59419663 Gerd Hoffmann
{
269 59419663 Gerd Hoffmann
    char **ptr = qdev_get_prop_ptr(dev, prop);
270 59419663 Gerd Hoffmann
    if (!*ptr)
271 59419663 Gerd Hoffmann
        return snprintf(dest, len, "<null>");
272 59419663 Gerd Hoffmann
    return snprintf(dest, len, "\"%s\"", *ptr);
273 59419663 Gerd Hoffmann
}
274 59419663 Gerd Hoffmann
275 59419663 Gerd Hoffmann
PropertyInfo qdev_prop_string = {
276 59419663 Gerd Hoffmann
    .name  = "string",
277 59419663 Gerd Hoffmann
    .type  = PROP_TYPE_STRING,
278 59419663 Gerd Hoffmann
    .size  = sizeof(char*),
279 59419663 Gerd Hoffmann
    .parse = parse_string,
280 59419663 Gerd Hoffmann
    .print = print_string,
281 d21357df Markus Armbruster
    .free  = free_string,
282 59419663 Gerd Hoffmann
};
283 59419663 Gerd Hoffmann
284 14b41872 Gerd Hoffmann
/* --- drive --- */
285 14b41872 Gerd Hoffmann
286 14b41872 Gerd Hoffmann
static int parse_drive(DeviceState *dev, Property *prop, const char *str)
287 14b41872 Gerd Hoffmann
{
288 14b41872 Gerd Hoffmann
    DriveInfo **ptr = qdev_get_prop_ptr(dev, prop);
289 14b41872 Gerd Hoffmann
290 14b41872 Gerd Hoffmann
    *ptr = drive_get_by_id(str);
291 14b41872 Gerd Hoffmann
    if (*ptr == NULL)
292 6bf38816 Markus Armbruster
        return -ENOENT;
293 14b41872 Gerd Hoffmann
    return 0;
294 14b41872 Gerd Hoffmann
}
295 14b41872 Gerd Hoffmann
296 14b41872 Gerd Hoffmann
static int print_drive(DeviceState *dev, Property *prop, char *dest, size_t len)
297 14b41872 Gerd Hoffmann
{
298 14b41872 Gerd Hoffmann
    DriveInfo **ptr = qdev_get_prop_ptr(dev, prop);
299 41b5e892 Gerd Hoffmann
    return snprintf(dest, len, "%s", (*ptr) ? (*ptr)->id : "<null>");
300 14b41872 Gerd Hoffmann
}
301 14b41872 Gerd Hoffmann
302 14b41872 Gerd Hoffmann
PropertyInfo qdev_prop_drive = {
303 14b41872 Gerd Hoffmann
    .name  = "drive",
304 14b41872 Gerd Hoffmann
    .type  = PROP_TYPE_DRIVE,
305 14b41872 Gerd Hoffmann
    .size  = sizeof(DriveInfo*),
306 14b41872 Gerd Hoffmann
    .parse = parse_drive,
307 14b41872 Gerd Hoffmann
    .print = print_drive,
308 14b41872 Gerd Hoffmann
};
309 14b41872 Gerd Hoffmann
310 313feaab Gerd Hoffmann
/* --- character device --- */
311 313feaab Gerd Hoffmann
312 06113719 Gerd Hoffmann
static int parse_chr(DeviceState *dev, Property *prop, const char *str)
313 06113719 Gerd Hoffmann
{
314 06113719 Gerd Hoffmann
    CharDriverState **ptr = qdev_get_prop_ptr(dev, prop);
315 06113719 Gerd Hoffmann
316 06113719 Gerd Hoffmann
    *ptr = qemu_chr_find(str);
317 06113719 Gerd Hoffmann
    if (*ptr == NULL)
318 6bf38816 Markus Armbruster
        return -ENOENT;
319 06113719 Gerd Hoffmann
    return 0;
320 06113719 Gerd Hoffmann
}
321 06113719 Gerd Hoffmann
322 313feaab Gerd Hoffmann
static int print_chr(DeviceState *dev, Property *prop, char *dest, size_t len)
323 313feaab Gerd Hoffmann
{
324 313feaab Gerd Hoffmann
    CharDriverState **ptr = qdev_get_prop_ptr(dev, prop);
325 bc19fcaa Blue Swirl
326 bc19fcaa Blue Swirl
    if (*ptr && (*ptr)->label) {
327 bc19fcaa Blue Swirl
        return snprintf(dest, len, "%s", (*ptr)->label);
328 bc19fcaa Blue Swirl
    } else {
329 bc19fcaa Blue Swirl
        return snprintf(dest, len, "<null>");
330 bc19fcaa Blue Swirl
    }
331 313feaab Gerd Hoffmann
}
332 313feaab Gerd Hoffmann
333 313feaab Gerd Hoffmann
PropertyInfo qdev_prop_chr = {
334 313feaab Gerd Hoffmann
    .name  = "chr",
335 313feaab Gerd Hoffmann
    .type  = PROP_TYPE_CHR,
336 313feaab Gerd Hoffmann
    .size  = sizeof(CharDriverState*),
337 06113719 Gerd Hoffmann
    .parse = parse_chr,
338 313feaab Gerd Hoffmann
    .print = print_chr,
339 313feaab Gerd Hoffmann
};
340 313feaab Gerd Hoffmann
341 2ef924b4 Gerd Hoffmann
/* --- netdev device --- */
342 2ef924b4 Gerd Hoffmann
343 2ef924b4 Gerd Hoffmann
static int parse_netdev(DeviceState *dev, Property *prop, const char *str)
344 2ef924b4 Gerd Hoffmann
{
345 2ef924b4 Gerd Hoffmann
    VLANClientState **ptr = qdev_get_prop_ptr(dev, prop);
346 2ef924b4 Gerd Hoffmann
347 2ef924b4 Gerd Hoffmann
    *ptr = qemu_find_netdev(str);
348 2ef924b4 Gerd Hoffmann
    if (*ptr == NULL)
349 6bf38816 Markus Armbruster
        return -ENOENT;
350 27f3f8a3 Markus Armbruster
    if ((*ptr)->peer) {
351 27f3f8a3 Markus Armbruster
        return -EEXIST;
352 27f3f8a3 Markus Armbruster
    }
353 2ef924b4 Gerd Hoffmann
    return 0;
354 2ef924b4 Gerd Hoffmann
}
355 2ef924b4 Gerd Hoffmann
356 2ef924b4 Gerd Hoffmann
static int print_netdev(DeviceState *dev, Property *prop, char *dest, size_t len)
357 2ef924b4 Gerd Hoffmann
{
358 2ef924b4 Gerd Hoffmann
    VLANClientState **ptr = qdev_get_prop_ptr(dev, prop);
359 2ef924b4 Gerd Hoffmann
360 2ef924b4 Gerd Hoffmann
    if (*ptr && (*ptr)->name) {
361 2ef924b4 Gerd Hoffmann
        return snprintf(dest, len, "%s", (*ptr)->name);
362 2ef924b4 Gerd Hoffmann
    } else {
363 2ef924b4 Gerd Hoffmann
        return snprintf(dest, len, "<null>");
364 2ef924b4 Gerd Hoffmann
    }
365 2ef924b4 Gerd Hoffmann
}
366 2ef924b4 Gerd Hoffmann
367 2ef924b4 Gerd Hoffmann
PropertyInfo qdev_prop_netdev = {
368 2ef924b4 Gerd Hoffmann
    .name  = "netdev",
369 2ef924b4 Gerd Hoffmann
    .type  = PROP_TYPE_NETDEV,
370 2ef924b4 Gerd Hoffmann
    .size  = sizeof(VLANClientState*),
371 2ef924b4 Gerd Hoffmann
    .parse = parse_netdev,
372 2ef924b4 Gerd Hoffmann
    .print = print_netdev,
373 2ef924b4 Gerd Hoffmann
};
374 2ef924b4 Gerd Hoffmann
375 851bec09 Gerd Hoffmann
/* --- vlan --- */
376 851bec09 Gerd Hoffmann
377 851bec09 Gerd Hoffmann
static int parse_vlan(DeviceState *dev, Property *prop, const char *str)
378 851bec09 Gerd Hoffmann
{
379 851bec09 Gerd Hoffmann
    VLANState **ptr = qdev_get_prop_ptr(dev, prop);
380 851bec09 Gerd Hoffmann
    int id;
381 851bec09 Gerd Hoffmann
382 851bec09 Gerd Hoffmann
    if (sscanf(str, "%d", &id) != 1)
383 6bf38816 Markus Armbruster
        return -EINVAL;
384 851bec09 Gerd Hoffmann
    *ptr = qemu_find_vlan(id, 1);
385 851bec09 Gerd Hoffmann
    if (*ptr == NULL)
386 6bf38816 Markus Armbruster
        return -ENOENT;
387 851bec09 Gerd Hoffmann
    return 0;
388 851bec09 Gerd Hoffmann
}
389 851bec09 Gerd Hoffmann
390 851bec09 Gerd Hoffmann
static int print_vlan(DeviceState *dev, Property *prop, char *dest, size_t len)
391 851bec09 Gerd Hoffmann
{
392 851bec09 Gerd Hoffmann
    VLANState **ptr = qdev_get_prop_ptr(dev, prop);
393 851bec09 Gerd Hoffmann
394 851bec09 Gerd Hoffmann
    if (*ptr) {
395 851bec09 Gerd Hoffmann
        return snprintf(dest, len, "%d", (*ptr)->id);
396 851bec09 Gerd Hoffmann
    } else {
397 851bec09 Gerd Hoffmann
        return snprintf(dest, len, "<null>");
398 851bec09 Gerd Hoffmann
    }
399 851bec09 Gerd Hoffmann
}
400 851bec09 Gerd Hoffmann
401 851bec09 Gerd Hoffmann
PropertyInfo qdev_prop_vlan = {
402 851bec09 Gerd Hoffmann
    .name  = "vlan",
403 851bec09 Gerd Hoffmann
    .type  = PROP_TYPE_VLAN,
404 851bec09 Gerd Hoffmann
    .size  = sizeof(VLANClientState*),
405 851bec09 Gerd Hoffmann
    .parse = parse_vlan,
406 851bec09 Gerd Hoffmann
    .print = print_vlan,
407 851bec09 Gerd Hoffmann
};
408 851bec09 Gerd Hoffmann
409 ee6847d1 Gerd Hoffmann
/* --- pointer --- */
410 ee6847d1 Gerd Hoffmann
411 036f7166 Markus Armbruster
/* Not a proper property, just for dirty hacks.  TODO Remove it!  */
412 ee6847d1 Gerd Hoffmann
PropertyInfo qdev_prop_ptr = {
413 ee6847d1 Gerd Hoffmann
    .name  = "ptr",
414 ee6847d1 Gerd Hoffmann
    .type  = PROP_TYPE_PTR,
415 ee6847d1 Gerd Hoffmann
    .size  = sizeof(void*),
416 ee6847d1 Gerd Hoffmann
};
417 ee6847d1 Gerd Hoffmann
418 ee6847d1 Gerd Hoffmann
/* --- mac address --- */
419 ee6847d1 Gerd Hoffmann
420 ee6847d1 Gerd Hoffmann
/*
421 ee6847d1 Gerd Hoffmann
 * accepted syntax versions:
422 ee6847d1 Gerd Hoffmann
 *   01:02:03:04:05:06
423 ee6847d1 Gerd Hoffmann
 *   01-02-03-04-05-06
424 ee6847d1 Gerd Hoffmann
 */
425 ee6847d1 Gerd Hoffmann
static int parse_mac(DeviceState *dev, Property *prop, const char *str)
426 ee6847d1 Gerd Hoffmann
{
427 1503fff3 Gerd Hoffmann
    MACAddr *mac = qdev_get_prop_ptr(dev, prop);
428 ee6847d1 Gerd Hoffmann
    int i, pos;
429 ee6847d1 Gerd Hoffmann
    char *p;
430 ee6847d1 Gerd Hoffmann
431 ee6847d1 Gerd Hoffmann
    for (i = 0, pos = 0; i < 6; i++, pos += 3) {
432 88e150a5 Christoph Egger
        if (!qemu_isxdigit(str[pos]))
433 6bf38816 Markus Armbruster
            return -EINVAL;
434 88e150a5 Christoph Egger
        if (!qemu_isxdigit(str[pos+1]))
435 6bf38816 Markus Armbruster
            return -EINVAL;
436 1503fff3 Gerd Hoffmann
        if (i == 5) {
437 1503fff3 Gerd Hoffmann
            if (str[pos+2] != '\0')
438 6bf38816 Markus Armbruster
                return -EINVAL;
439 1503fff3 Gerd Hoffmann
        } else {
440 1503fff3 Gerd Hoffmann
            if (str[pos+2] != ':' && str[pos+2] != '-')
441 6bf38816 Markus Armbruster
                return -EINVAL;
442 1503fff3 Gerd Hoffmann
        }
443 1503fff3 Gerd Hoffmann
        mac->a[i] = strtol(str+pos, &p, 16);
444 ee6847d1 Gerd Hoffmann
    }
445 ee6847d1 Gerd Hoffmann
    return 0;
446 ee6847d1 Gerd Hoffmann
}
447 ee6847d1 Gerd Hoffmann
448 ee6847d1 Gerd Hoffmann
static int print_mac(DeviceState *dev, Property *prop, char *dest, size_t len)
449 ee6847d1 Gerd Hoffmann
{
450 1503fff3 Gerd Hoffmann
    MACAddr *mac = qdev_get_prop_ptr(dev, prop);
451 1503fff3 Gerd Hoffmann
452 ee6847d1 Gerd Hoffmann
    return snprintf(dest, len, "%02x:%02x:%02x:%02x:%02x:%02x",
453 1503fff3 Gerd Hoffmann
                    mac->a[0], mac->a[1], mac->a[2],
454 1503fff3 Gerd Hoffmann
                    mac->a[3], mac->a[4], mac->a[5]);
455 ee6847d1 Gerd Hoffmann
}
456 ee6847d1 Gerd Hoffmann
457 ee6847d1 Gerd Hoffmann
PropertyInfo qdev_prop_macaddr = {
458 1503fff3 Gerd Hoffmann
    .name  = "macaddr",
459 ee6847d1 Gerd Hoffmann
    .type  = PROP_TYPE_MACADDR,
460 1503fff3 Gerd Hoffmann
    .size  = sizeof(MACAddr),
461 ee6847d1 Gerd Hoffmann
    .parse = parse_mac,
462 ee6847d1 Gerd Hoffmann
    .print = print_mac,
463 ee6847d1 Gerd Hoffmann
};
464 ee6847d1 Gerd Hoffmann
465 05cb5fe4 Gerd Hoffmann
/* --- pci address --- */
466 05cb5fe4 Gerd Hoffmann
467 05cb5fe4 Gerd Hoffmann
/*
468 05cb5fe4 Gerd Hoffmann
 * bus-local address, i.e. "$slot" or "$slot.$fn"
469 05cb5fe4 Gerd Hoffmann
 */
470 05cb5fe4 Gerd Hoffmann
static int parse_pci_devfn(DeviceState *dev, Property *prop, const char *str)
471 05cb5fe4 Gerd Hoffmann
{
472 05cb5fe4 Gerd Hoffmann
    uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
473 05cb5fe4 Gerd Hoffmann
    unsigned int slot, fn, n;
474 05cb5fe4 Gerd Hoffmann
475 05cb5fe4 Gerd Hoffmann
    if (sscanf(str, "%x.%x%n", &slot, &fn, &n) != 2) {
476 05cb5fe4 Gerd Hoffmann
        fn = 0;
477 05cb5fe4 Gerd Hoffmann
        if (sscanf(str, "%x%n", &slot, &n) != 1) {
478 6bf38816 Markus Armbruster
            return -EINVAL;
479 05cb5fe4 Gerd Hoffmann
        }
480 05cb5fe4 Gerd Hoffmann
    }
481 05cb5fe4 Gerd Hoffmann
    if (str[n] != '\0')
482 6bf38816 Markus Armbruster
        return -EINVAL;
483 05cb5fe4 Gerd Hoffmann
    if (fn > 7)
484 6bf38816 Markus Armbruster
        return -EINVAL;
485 05cb5fe4 Gerd Hoffmann
    *ptr = slot << 3 | fn;
486 05cb5fe4 Gerd Hoffmann
    return 0;
487 05cb5fe4 Gerd Hoffmann
}
488 05cb5fe4 Gerd Hoffmann
489 05cb5fe4 Gerd Hoffmann
static int print_pci_devfn(DeviceState *dev, Property *prop, char *dest, size_t len)
490 05cb5fe4 Gerd Hoffmann
{
491 05cb5fe4 Gerd Hoffmann
    uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
492 05cb5fe4 Gerd Hoffmann
493 73538c31 Blue Swirl
    if (*ptr == -1) {
494 05cb5fe4 Gerd Hoffmann
        return snprintf(dest, len, "<unset>");
495 05cb5fe4 Gerd Hoffmann
    } else {
496 05cb5fe4 Gerd Hoffmann
        return snprintf(dest, len, "%02x.%x", *ptr >> 3, *ptr & 7);
497 05cb5fe4 Gerd Hoffmann
    }
498 05cb5fe4 Gerd Hoffmann
}
499 05cb5fe4 Gerd Hoffmann
500 05cb5fe4 Gerd Hoffmann
PropertyInfo qdev_prop_pci_devfn = {
501 05cb5fe4 Gerd Hoffmann
    .name  = "pci-devfn",
502 05cb5fe4 Gerd Hoffmann
    .type  = PROP_TYPE_UINT32,
503 05cb5fe4 Gerd Hoffmann
    .size  = sizeof(uint32_t),
504 05cb5fe4 Gerd Hoffmann
    .parse = parse_pci_devfn,
505 05cb5fe4 Gerd Hoffmann
    .print = print_pci_devfn,
506 05cb5fe4 Gerd Hoffmann
};
507 05cb5fe4 Gerd Hoffmann
508 ee6847d1 Gerd Hoffmann
/* --- public helpers --- */
509 ee6847d1 Gerd Hoffmann
510 ee6847d1 Gerd Hoffmann
static Property *qdev_prop_walk(Property *props, const char *name)
511 ee6847d1 Gerd Hoffmann
{
512 ee6847d1 Gerd Hoffmann
    if (!props)
513 ee6847d1 Gerd Hoffmann
        return NULL;
514 ee6847d1 Gerd Hoffmann
    while (props->name) {
515 ee6847d1 Gerd Hoffmann
        if (strcmp(props->name, name) == 0)
516 ee6847d1 Gerd Hoffmann
            return props;
517 ee6847d1 Gerd Hoffmann
        props++;
518 ee6847d1 Gerd Hoffmann
    }
519 ee6847d1 Gerd Hoffmann
    return NULL;
520 ee6847d1 Gerd Hoffmann
}
521 ee6847d1 Gerd Hoffmann
522 ee6847d1 Gerd Hoffmann
static Property *qdev_prop_find(DeviceState *dev, const char *name)
523 ee6847d1 Gerd Hoffmann
{
524 ee6847d1 Gerd Hoffmann
    Property *prop;
525 ee6847d1 Gerd Hoffmann
526 ee6847d1 Gerd Hoffmann
    /* device properties */
527 ee6847d1 Gerd Hoffmann
    prop = qdev_prop_walk(dev->info->props, name);
528 ee6847d1 Gerd Hoffmann
    if (prop)
529 ee6847d1 Gerd Hoffmann
        return prop;
530 ee6847d1 Gerd Hoffmann
531 ee6847d1 Gerd Hoffmann
    /* bus properties */
532 ee6847d1 Gerd Hoffmann
    prop = qdev_prop_walk(dev->parent_bus->info->props, name);
533 ee6847d1 Gerd Hoffmann
    if (prop)
534 ee6847d1 Gerd Hoffmann
        return prop;
535 ee6847d1 Gerd Hoffmann
536 ee6847d1 Gerd Hoffmann
    return NULL;
537 ee6847d1 Gerd Hoffmann
}
538 ee6847d1 Gerd Hoffmann
539 d8ed79ae Gerd Hoffmann
int qdev_prop_exists(DeviceState *dev, const char *name)
540 d8ed79ae Gerd Hoffmann
{
541 d8ed79ae Gerd Hoffmann
    return qdev_prop_find(dev, name) ? true : false;
542 d8ed79ae Gerd Hoffmann
}
543 d8ed79ae Gerd Hoffmann
544 ee6847d1 Gerd Hoffmann
int qdev_prop_parse(DeviceState *dev, const char *name, const char *value)
545 ee6847d1 Gerd Hoffmann
{
546 ee6847d1 Gerd Hoffmann
    Property *prop;
547 6bf38816 Markus Armbruster
    int ret;
548 ee6847d1 Gerd Hoffmann
549 ee6847d1 Gerd Hoffmann
    prop = qdev_prop_find(dev, name);
550 036f7166 Markus Armbruster
    /*
551 036f7166 Markus Armbruster
     * TODO Properties without a parse method are just for dirty
552 036f7166 Markus Armbruster
     * hacks.  qdev_prop_ptr is the only such PropertyInfo.  It's
553 036f7166 Markus Armbruster
     * marked for removal.  The test !prop->info->parse should be
554 036f7166 Markus Armbruster
     * removed along with it.
555 036f7166 Markus Armbruster
     */
556 036f7166 Markus Armbruster
    if (!prop || !prop->info->parse) {
557 fdcfa190 Markus Armbruster
        qerror_report(QERR_PROPERTY_NOT_FOUND, dev->info->name, name);
558 ee6847d1 Gerd Hoffmann
        return -1;
559 ee6847d1 Gerd Hoffmann
    }
560 6bf38816 Markus Armbruster
    ret = prop->info->parse(dev, prop, value);
561 6bf38816 Markus Armbruster
    if (ret < 0) {
562 6bf38816 Markus Armbruster
        switch (ret) {
563 27f3f8a3 Markus Armbruster
        case -EEXIST:
564 fdcfa190 Markus Armbruster
            qerror_report(QERR_PROPERTY_VALUE_IN_USE,
565 fdcfa190 Markus Armbruster
                          dev->info->name, name, value);
566 27f3f8a3 Markus Armbruster
            break;
567 6bf38816 Markus Armbruster
        default:
568 6bf38816 Markus Armbruster
        case -EINVAL:
569 fdcfa190 Markus Armbruster
            qerror_report(QERR_PROPERTY_VALUE_BAD,
570 fdcfa190 Markus Armbruster
                          dev->info->name, name, value);
571 6bf38816 Markus Armbruster
            break;
572 6bf38816 Markus Armbruster
        case -ENOENT:
573 fdcfa190 Markus Armbruster
            qerror_report(QERR_PROPERTY_VALUE_NOT_FOUND,
574 fdcfa190 Markus Armbruster
                          dev->info->name, name, value);
575 6bf38816 Markus Armbruster
            break;
576 6bf38816 Markus Armbruster
        }
577 9ef5c4bf Gerd Hoffmann
        return -1;
578 9ef5c4bf Gerd Hoffmann
    }
579 9ef5c4bf Gerd Hoffmann
    return 0;
580 ee6847d1 Gerd Hoffmann
}
581 ee6847d1 Gerd Hoffmann
582 ee6847d1 Gerd Hoffmann
void qdev_prop_set(DeviceState *dev, const char *name, void *src, enum PropertyType type)
583 ee6847d1 Gerd Hoffmann
{
584 ee6847d1 Gerd Hoffmann
    Property *prop;
585 ee6847d1 Gerd Hoffmann
586 ee6847d1 Gerd Hoffmann
    prop = qdev_prop_find(dev, name);
587 ee6847d1 Gerd Hoffmann
    if (!prop) {
588 ee6847d1 Gerd Hoffmann
        fprintf(stderr, "%s: property \"%s.%s\" not found\n",
589 ee6847d1 Gerd Hoffmann
                __FUNCTION__, dev->info->name, name);
590 ee6847d1 Gerd Hoffmann
        abort();
591 ee6847d1 Gerd Hoffmann
    }
592 ee6847d1 Gerd Hoffmann
    if (prop->info->type != type) {
593 ee6847d1 Gerd Hoffmann
        fprintf(stderr, "%s: property \"%s.%s\" type mismatch\n",
594 ee6847d1 Gerd Hoffmann
                __FUNCTION__, dev->info->name, name);
595 ee6847d1 Gerd Hoffmann
        abort();
596 ee6847d1 Gerd Hoffmann
    }
597 d2364ee4 Michael S. Tsirkin
    qdev_prop_cpy(dev, prop, src);
598 ee6847d1 Gerd Hoffmann
}
599 ee6847d1 Gerd Hoffmann
600 c7cc172d Juan Quintela
void qdev_prop_set_uint8(DeviceState *dev, const char *name, uint8_t value)
601 c7cc172d Juan Quintela
{
602 c7cc172d Juan Quintela
    qdev_prop_set(dev, name, &value, PROP_TYPE_UINT8);
603 c7cc172d Juan Quintela
}
604 c7cc172d Juan Quintela
605 ee6847d1 Gerd Hoffmann
void qdev_prop_set_uint16(DeviceState *dev, const char *name, uint16_t value)
606 ee6847d1 Gerd Hoffmann
{
607 ee6847d1 Gerd Hoffmann
    qdev_prop_set(dev, name, &value, PROP_TYPE_UINT16);
608 ee6847d1 Gerd Hoffmann
}
609 ee6847d1 Gerd Hoffmann
610 ee6847d1 Gerd Hoffmann
void qdev_prop_set_uint32(DeviceState *dev, const char *name, uint32_t value)
611 ee6847d1 Gerd Hoffmann
{
612 ee6847d1 Gerd Hoffmann
    qdev_prop_set(dev, name, &value, PROP_TYPE_UINT32);
613 ee6847d1 Gerd Hoffmann
}
614 ee6847d1 Gerd Hoffmann
615 316940b0 Gerd Hoffmann
void qdev_prop_set_int32(DeviceState *dev, const char *name, int32_t value)
616 316940b0 Gerd Hoffmann
{
617 316940b0 Gerd Hoffmann
    qdev_prop_set(dev, name, &value, PROP_TYPE_INT32);
618 316940b0 Gerd Hoffmann
}
619 316940b0 Gerd Hoffmann
620 5a053d1f Blue Swirl
void qdev_prop_set_uint64(DeviceState *dev, const char *name, uint64_t value)
621 5a053d1f Blue Swirl
{
622 5a053d1f Blue Swirl
    qdev_prop_set(dev, name, &value, PROP_TYPE_UINT64);
623 5a053d1f Blue Swirl
}
624 5a053d1f Blue Swirl
625 cc984673 Markus Armbruster
void qdev_prop_set_string(DeviceState *dev, const char *name, char *value)
626 cc984673 Markus Armbruster
{
627 cc984673 Markus Armbruster
    qdev_prop_set(dev, name, &value, PROP_TYPE_STRING);
628 cc984673 Markus Armbruster
}
629 cc984673 Markus Armbruster
630 14b41872 Gerd Hoffmann
void qdev_prop_set_drive(DeviceState *dev, const char *name, DriveInfo *value)
631 14b41872 Gerd Hoffmann
{
632 14b41872 Gerd Hoffmann
    qdev_prop_set(dev, name, &value, PROP_TYPE_DRIVE);
633 14b41872 Gerd Hoffmann
}
634 14b41872 Gerd Hoffmann
635 313feaab Gerd Hoffmann
void qdev_prop_set_chr(DeviceState *dev, const char *name, CharDriverState *value)
636 313feaab Gerd Hoffmann
{
637 313feaab Gerd Hoffmann
    qdev_prop_set(dev, name, &value, PROP_TYPE_CHR);
638 313feaab Gerd Hoffmann
}
639 313feaab Gerd Hoffmann
640 2ef924b4 Gerd Hoffmann
void qdev_prop_set_netdev(DeviceState *dev, const char *name, VLANClientState *value)
641 2ef924b4 Gerd Hoffmann
{
642 2ef924b4 Gerd Hoffmann
    qdev_prop_set(dev, name, &value, PROP_TYPE_NETDEV);
643 2ef924b4 Gerd Hoffmann
}
644 2ef924b4 Gerd Hoffmann
645 851bec09 Gerd Hoffmann
void qdev_prop_set_vlan(DeviceState *dev, const char *name, VLANState *value)
646 851bec09 Gerd Hoffmann
{
647 851bec09 Gerd Hoffmann
    qdev_prop_set(dev, name, &value, PROP_TYPE_VLAN);
648 851bec09 Gerd Hoffmann
}
649 851bec09 Gerd Hoffmann
650 1503fff3 Gerd Hoffmann
void qdev_prop_set_macaddr(DeviceState *dev, const char *name, uint8_t *value)
651 1503fff3 Gerd Hoffmann
{
652 1503fff3 Gerd Hoffmann
    qdev_prop_set(dev, name, value, PROP_TYPE_MACADDR);
653 1503fff3 Gerd Hoffmann
}
654 1503fff3 Gerd Hoffmann
655 ee6847d1 Gerd Hoffmann
void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value)
656 ee6847d1 Gerd Hoffmann
{
657 ee6847d1 Gerd Hoffmann
    qdev_prop_set(dev, name, &value, PROP_TYPE_PTR);
658 ee6847d1 Gerd Hoffmann
}
659 ee6847d1 Gerd Hoffmann
660 ee6847d1 Gerd Hoffmann
void qdev_prop_set_defaults(DeviceState *dev, Property *props)
661 ee6847d1 Gerd Hoffmann
{
662 ee6847d1 Gerd Hoffmann
    if (!props)
663 ee6847d1 Gerd Hoffmann
        return;
664 ee6847d1 Gerd Hoffmann
    while (props->name) {
665 ee6847d1 Gerd Hoffmann
        if (props->defval) {
666 d2364ee4 Michael S. Tsirkin
            qdev_prop_cpy(dev, props, props->defval);
667 ee6847d1 Gerd Hoffmann
        }
668 ee6847d1 Gerd Hoffmann
        props++;
669 ee6847d1 Gerd Hoffmann
    }
670 ee6847d1 Gerd Hoffmann
}
671 ee6847d1 Gerd Hoffmann
672 458fb679 Gerd Hoffmann
static QTAILQ_HEAD(, GlobalProperty) global_props = QTAILQ_HEAD_INITIALIZER(global_props);
673 b6b61144 Gerd Hoffmann
674 25920d6a Kevin Wolf
static void qdev_prop_register_global(GlobalProperty *prop)
675 b6b61144 Gerd Hoffmann
{
676 458fb679 Gerd Hoffmann
    QTAILQ_INSERT_TAIL(&global_props, prop, next);
677 b6b61144 Gerd Hoffmann
}
678 b6b61144 Gerd Hoffmann
679 458fb679 Gerd Hoffmann
void qdev_prop_register_global_list(GlobalProperty *props)
680 b6b61144 Gerd Hoffmann
{
681 458fb679 Gerd Hoffmann
    int i;
682 b6b61144 Gerd Hoffmann
683 458fb679 Gerd Hoffmann
    for (i = 0; props[i].driver != NULL; i++) {
684 458fb679 Gerd Hoffmann
        qdev_prop_register_global(props+i);
685 b6b61144 Gerd Hoffmann
    }
686 458fb679 Gerd Hoffmann
}
687 458fb679 Gerd Hoffmann
688 458fb679 Gerd Hoffmann
void qdev_prop_set_globals(DeviceState *dev)
689 458fb679 Gerd Hoffmann
{
690 458fb679 Gerd Hoffmann
    GlobalProperty *prop;
691 458fb679 Gerd Hoffmann
692 458fb679 Gerd Hoffmann
    QTAILQ_FOREACH(prop, &global_props, next) {
693 07a8de35 Gerd Hoffmann
        if (strcmp(dev->info->name, prop->driver) != 0 &&
694 07a8de35 Gerd Hoffmann
            strcmp(dev->info->bus_info->name, prop->driver) != 0) {
695 b6b61144 Gerd Hoffmann
            continue;
696 b6b61144 Gerd Hoffmann
        }
697 b6b61144 Gerd Hoffmann
        if (qdev_prop_parse(dev, prop->property, prop->value) != 0) {
698 9ef5c4bf Gerd Hoffmann
            exit(1);
699 b6b61144 Gerd Hoffmann
        }
700 b6b61144 Gerd Hoffmann
    }
701 b6b61144 Gerd Hoffmann
}
702 25920d6a Kevin Wolf
703 25920d6a Kevin Wolf
static int qdev_add_one_global(QemuOpts *opts, void *opaque)
704 25920d6a Kevin Wolf
{
705 25920d6a Kevin Wolf
    GlobalProperty *g;
706 25920d6a Kevin Wolf
707 25920d6a Kevin Wolf
    g = qemu_mallocz(sizeof(*g));
708 25920d6a Kevin Wolf
    g->driver   = qemu_opt_get(opts, "driver");
709 25920d6a Kevin Wolf
    g->property = qemu_opt_get(opts, "property");
710 25920d6a Kevin Wolf
    g->value    = qemu_opt_get(opts, "value");
711 25920d6a Kevin Wolf
    qdev_prop_register_global(g);
712 25920d6a Kevin Wolf
    return 0;
713 25920d6a Kevin Wolf
}
714 25920d6a Kevin Wolf
715 25920d6a Kevin Wolf
void qemu_add_globals(void)
716 25920d6a Kevin Wolf
{
717 25920d6a Kevin Wolf
    qemu_opts_foreach(&qemu_global_opts, qdev_add_one_global, NULL, 0);
718 25920d6a Kevin Wolf
}