qdev-addr.c 1.9 KB

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