Statistics
| Branch: | Revision:

root / hw / core / qdev-addr.c @ 49ab747f

History | View | Annotate | Download (1.9 kB)

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
}