Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 1 | #include "qdev.h" |
| 2 | #include "qdev-addr.h" |
Paolo Bonzini | 022c62c | 2012-12-17 18:19:49 +0100 | [diff] [blame] | 3 | #include "exec/hwaddr.h" |
Paolo Bonzini | 7b1b5d1 | 2012-12-17 18:19:43 +0100 | [diff] [blame] | 4 | #include "qapi/visitor.h" |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 5 | |
| 6 | /* --- target physical address --- */ |
| 7 | |
| 8 | static int parse_taddr(DeviceState *dev, Property *prop, const char *str) |
| 9 | { |
Avi Kivity | a8170e5 | 2012-10-23 12:30:10 +0200 | [diff] [blame] | 10 | hwaddr *ptr = qdev_get_prop_ptr(dev, prop); |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 11 | |
| 12 | *ptr = strtoull(str, NULL, 16); |
| 13 | return 0; |
| 14 | } |
| 15 | |
| 16 | static int print_taddr(DeviceState *dev, Property *prop, char *dest, size_t len) |
| 17 | { |
Avi Kivity | a8170e5 | 2012-10-23 12:30:10 +0200 | [diff] [blame] | 18 | hwaddr *ptr = qdev_get_prop_ptr(dev, prop); |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 19 | return snprintf(dest, len, "0x" TARGET_FMT_plx, *ptr); |
| 20 | } |
| 21 | |
Anthony Liguori | 57c9faf | 2012-01-30 08:55:55 -0600 | [diff] [blame] | 22 | static void get_taddr(Object *obj, Visitor *v, void *opaque, |
Paolo Bonzini | 80e555c | 2011-12-18 17:05:09 +0100 | [diff] [blame] | 23 | const char *name, Error **errp) |
| 24 | { |
Anthony Liguori | 57c9faf | 2012-01-30 08:55:55 -0600 | [diff] [blame] | 25 | DeviceState *dev = DEVICE(obj); |
Paolo Bonzini | 80e555c | 2011-12-18 17:05:09 +0100 | [diff] [blame] | 26 | Property *prop = opaque; |
Avi Kivity | a8170e5 | 2012-10-23 12:30:10 +0200 | [diff] [blame] | 27 | hwaddr *ptr = qdev_get_prop_ptr(dev, prop); |
Paolo Bonzini | 80e555c | 2011-12-18 17:05:09 +0100 | [diff] [blame] | 28 | int64_t value; |
| 29 | |
| 30 | value = *ptr; |
Michael Roth | c08fb2a | 2012-02-22 12:26:37 -0600 | [diff] [blame] | 31 | visit_type_int64(v, &value, name, errp); |
Paolo Bonzini | 80e555c | 2011-12-18 17:05:09 +0100 | [diff] [blame] | 32 | } |
| 33 | |
Anthony Liguori | 57c9faf | 2012-01-30 08:55:55 -0600 | [diff] [blame] | 34 | static void set_taddr(Object *obj, Visitor *v, void *opaque, |
Paolo Bonzini | 80e555c | 2011-12-18 17:05:09 +0100 | [diff] [blame] | 35 | const char *name, Error **errp) |
| 36 | { |
Anthony Liguori | 57c9faf | 2012-01-30 08:55:55 -0600 | [diff] [blame] | 37 | DeviceState *dev = DEVICE(obj); |
Paolo Bonzini | 80e555c | 2011-12-18 17:05:09 +0100 | [diff] [blame] | 38 | Property *prop = opaque; |
Avi Kivity | a8170e5 | 2012-10-23 12:30:10 +0200 | [diff] [blame] | 39 | hwaddr *ptr = qdev_get_prop_ptr(dev, prop); |
Paolo Bonzini | 80e555c | 2011-12-18 17:05:09 +0100 | [diff] [blame] | 40 | Error *local_err = NULL; |
| 41 | int64_t value; |
| 42 | |
Andreas Färber | 7983c8a | 2013-01-09 03:58:10 +0100 | [diff] [blame] | 43 | if (dev->realized) { |
Paolo Bonzini | 80e555c | 2011-12-18 17:05:09 +0100 | [diff] [blame] | 44 | error_set(errp, QERR_PERMISSION_DENIED); |
| 45 | return; |
| 46 | } |
| 47 | |
Michael Roth | c08fb2a | 2012-02-22 12:26:37 -0600 | [diff] [blame] | 48 | visit_type_int64(v, &value, name, &local_err); |
Paolo Bonzini | 80e555c | 2011-12-18 17:05:09 +0100 | [diff] [blame] | 49 | if (local_err) { |
| 50 | error_propagate(errp, local_err); |
| 51 | return; |
| 52 | } |
Avi Kivity | a8170e5 | 2012-10-23 12:30:10 +0200 | [diff] [blame] | 53 | if ((uint64_t)value <= (uint64_t) ~(hwaddr)0) { |
Paolo Bonzini | 80e555c | 2011-12-18 17:05:09 +0100 | [diff] [blame] | 54 | *ptr = value; |
| 55 | } else { |
| 56 | error_set(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, |
| 57 | dev->id?:"", name, value, (uint64_t) 0, |
Avi Kivity | a8170e5 | 2012-10-23 12:30:10 +0200 | [diff] [blame] | 58 | (uint64_t) ~(hwaddr)0); |
Paolo Bonzini | 80e555c | 2011-12-18 17:05:09 +0100 | [diff] [blame] | 59 | } |
| 60 | } |
| 61 | |
| 62 | |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 63 | PropertyInfo qdev_prop_taddr = { |
| 64 | .name = "taddr", |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 65 | .parse = parse_taddr, |
| 66 | .print = print_taddr, |
Paolo Bonzini | 80e555c | 2011-12-18 17:05:09 +0100 | [diff] [blame] | 67 | .get = get_taddr, |
| 68 | .set = set_taddr, |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 69 | }; |
| 70 | |
Avi Kivity | a8170e5 | 2012-10-23 12:30:10 +0200 | [diff] [blame] | 71 | void qdev_prop_set_taddr(DeviceState *dev, const char *name, hwaddr value) |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 72 | { |
Paolo Bonzini | 9b170e6 | 2012-02-02 12:51:44 +0100 | [diff] [blame] | 73 | Error *errp = NULL; |
| 74 | object_property_set_int(OBJECT(dev), value, name, &errp); |
| 75 | assert(!errp); |
| 76 | |
Gerd Hoffmann | ee6847d | 2009-07-15 13:43:31 +0200 | [diff] [blame] | 77 | } |