root / hw / qdev-addr.c @ a8170e5e
History | View | Annotate | Download (1.9 kB)
1 |
#include "qdev.h" |
---|---|
2 |
#include "qdev-addr.h" |
3 |
#include "hwaddr.h" |
4 |
|
5 |
/* --- target physical address --- */
|
6 |
|
7 |
static int parse_taddr(DeviceState *dev, Property *prop, const char *str) |
8 |
{ |
9 |
hwaddr *ptr = qdev_get_prop_ptr(dev, prop); |
10 |
|
11 |
*ptr = strtoull(str, NULL, 16); |
12 |
return 0; |
13 |
} |
14 |
|
15 |
static int print_taddr(DeviceState *dev, Property *prop, char *dest, size_t len) |
16 |
{ |
17 |
hwaddr *ptr = qdev_get_prop_ptr(dev, prop); |
18 |
return snprintf(dest, len, "0x" TARGET_FMT_plx, *ptr); |
19 |
} |
20 |
|
21 |
static void get_taddr(Object *obj, Visitor *v, void *opaque, |
22 |
const char *name, Error **errp) |
23 |
{ |
24 |
DeviceState *dev = DEVICE(obj); |
25 |
Property *prop = opaque; |
26 |
hwaddr *ptr = qdev_get_prop_ptr(dev, prop); |
27 |
int64_t value; |
28 |
|
29 |
value = *ptr; |
30 |
visit_type_int64(v, &value, name, errp); |
31 |
} |
32 |
|
33 |
static void set_taddr(Object *obj, Visitor *v, void *opaque, |
34 |
const char *name, Error **errp) |
35 |
{ |
36 |
DeviceState *dev = DEVICE(obj); |
37 |
Property *prop = opaque; |
38 |
hwaddr *ptr = qdev_get_prop_ptr(dev, prop); |
39 |
Error *local_err = NULL;
|
40 |
int64_t value; |
41 |
|
42 |
if (dev->state != DEV_STATE_CREATED) {
|
43 |
error_set(errp, QERR_PERMISSION_DENIED); |
44 |
return;
|
45 |
} |
46 |
|
47 |
visit_type_int64(v, &value, name, &local_err); |
48 |
if (local_err) {
|
49 |
error_propagate(errp, local_err); |
50 |
return;
|
51 |
} |
52 |
if ((uint64_t)value <= (uint64_t) ~(hwaddr)0) { |
53 |
*ptr = value; |
54 |
} else {
|
55 |
error_set(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, |
56 |
dev->id?:"", name, value, (uint64_t) 0, |
57 |
(uint64_t) ~(hwaddr)0);
|
58 |
} |
59 |
} |
60 |
|
61 |
|
62 |
PropertyInfo qdev_prop_taddr = { |
63 |
.name = "taddr",
|
64 |
.parse = parse_taddr, |
65 |
.print = print_taddr, |
66 |
.get = get_taddr, |
67 |
.set = set_taddr, |
68 |
}; |
69 |
|
70 |
void qdev_prop_set_taddr(DeviceState *dev, const char *name, hwaddr value) |
71 |
{ |
72 |
Error *errp = NULL;
|
73 |
object_property_set_int(OBJECT(dev), value, name, &errp); |
74 |
assert(!errp); |
75 |
|
76 |
} |