qdev-addr.c 1.9 KB

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