]> Git Repo - qemu.git/blob - hw/qdev-addr.c
hw/qdev-properties.c: Improve diagnostic for setting property after realize
[qemu.git] / hw / qdev-addr.c
1 #include "hw/qdev.h"
2 #include "hw/qdev-addr.h"
3 #include "exec/hwaddr.h"
4 #include "qapi/qmp/qerror.h"
5 #include "qapi/visitor.h"
6
7 /* --- target physical address --- */
8
9 static int parse_taddr(DeviceState *dev, Property *prop, const char *str)
10 {
11     hwaddr *ptr = qdev_get_prop_ptr(dev, prop);
12
13     *ptr = strtoull(str, NULL, 16);
14     return 0;
15 }
16
17 static int print_taddr(DeviceState *dev, Property *prop, char *dest, size_t len)
18 {
19     hwaddr *ptr = qdev_get_prop_ptr(dev, prop);
20     return snprintf(dest, len, "0x" TARGET_FMT_plx, *ptr);
21 }
22
23 static void get_taddr(Object *obj, Visitor *v, void *opaque,
24                       const char *name, Error **errp)
25 {
26     DeviceState *dev = DEVICE(obj);
27     Property *prop = opaque;
28     hwaddr *ptr = qdev_get_prop_ptr(dev, prop);
29     int64_t value;
30
31     value = *ptr;
32     visit_type_int64(v, &value, name, errp);
33 }
34
35 static void set_taddr(Object *obj, Visitor *v, void *opaque,
36                       const char *name, Error **errp)
37 {
38     DeviceState *dev = DEVICE(obj);
39     Property *prop = opaque;
40     hwaddr *ptr = qdev_get_prop_ptr(dev, prop);
41     Error *local_err = NULL;
42     int64_t value;
43
44     if (dev->realized) {
45         qdev_prop_set_after_realize(dev, name, errp);
46         return;
47     }
48
49     visit_type_int64(v, &value, name, &local_err);
50     if (local_err) {
51         error_propagate(errp, local_err);
52         return;
53     }
54     if ((uint64_t)value <= (uint64_t) ~(hwaddr)0) {
55         *ptr = value;
56     } else {
57         error_set(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE,
58                   dev->id?:"", name, value, (uint64_t) 0,
59                   (uint64_t) ~(hwaddr)0);
60     }
61 }
62
63
64 PropertyInfo qdev_prop_taddr = {
65     .name  = "taddr",
66     .parse = parse_taddr,
67     .print = print_taddr,
68     .get   = get_taddr,
69     .set   = set_taddr,
70 };
71
72 void qdev_prop_set_taddr(DeviceState *dev, const char *name, hwaddr value)
73 {
74     Error *errp = NULL;
75     object_property_set_int(OBJECT(dev), value, name, &errp);
76     assert(!errp);
77
78 }
This page took 0.028856 seconds and 4 git commands to generate.