Revision b000dfbd

b/hw/qdev-addr.c
42 42
    int64_t value;
43 43

  
44 44
    if (dev->realized) {
45
        error_set(errp, QERR_PERMISSION_DENIED);
45
        qdev_prop_set_after_realize(dev, name, errp);
46 46
        return;
47 47
    }
48 48

  
b/hw/qdev-properties-system.c
43 43
    int ret;
44 44

  
45 45
    if (dev->realized) {
46
        error_set(errp, QERR_PERMISSION_DENIED);
46
        qdev_prop_set_after_realize(dev, name, errp);
47 47
        return;
48 48
    }
49 49

  
......
287 287
    NetClientState *hubport;
288 288

  
289 289
    if (dev->realized) {
290
        error_set(errp, QERR_PERMISSION_DENIED);
290
        qdev_prop_set_after_realize(dev, name, errp);
291 291
        return;
292 292
    }
293 293

  
b/hw/qdev-properties.c
7 7
#include "qapi/visitor.h"
8 8
#include "char/char.h"
9 9

  
10
void qdev_prop_set_after_realize(DeviceState *dev, const char *name,
11
                                  Error **errp)
12
{
13
    if (dev->id) {
14
        error_setg(errp, "Attempt to set property '%s' on device '%s' "
15
                   "(type '%s') after it was realized", name, dev->id,
16
                   object_get_typename(OBJECT(dev)));
17
    } else {
18
        error_setg(errp, "Attempt to set property '%s' on anonymous device "
19
                   "(type '%s') after it was realized", name,
20
                   object_get_typename(OBJECT(dev)));
21
    }
22
}
23

  
10 24
void *qdev_get_prop_ptr(DeviceState *dev, Property *prop)
11 25
{
12 26
    void *ptr = dev;
......
33 47
    int *ptr = qdev_get_prop_ptr(dev, prop);
34 48

  
35 49
    if (dev->realized) {
36
        error_set(errp, QERR_PERMISSION_DENIED);
50
        qdev_prop_set_after_realize(dev, name, errp);
37 51
        return;
38 52
    }
39 53

  
......
86 100
    bool value;
87 101

  
88 102
    if (dev->realized) {
89
        error_set(errp, QERR_PERMISSION_DENIED);
103
        qdev_prop_set_after_realize(dev, name, errp);
90 104
        return;
91 105
    }
92 106

  
......
126 140
    uint8_t *ptr = qdev_get_prop_ptr(dev, prop);
127 141

  
128 142
    if (dev->realized) {
129
        error_set(errp, QERR_PERMISSION_DENIED);
143
        qdev_prop_set_after_realize(dev, name, errp);
130 144
        return;
131 145
    }
132 146

  
......
193 207
    uint16_t *ptr = qdev_get_prop_ptr(dev, prop);
194 208

  
195 209
    if (dev->realized) {
196
        error_set(errp, QERR_PERMISSION_DENIED);
210
        qdev_prop_set_after_realize(dev, name, errp);
197 211
        return;
198 212
    }
199 213

  
......
226 240
    uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
227 241

  
228 242
    if (dev->realized) {
229
        error_set(errp, QERR_PERMISSION_DENIED);
243
        qdev_prop_set_after_realize(dev, name, errp);
230 244
        return;
231 245
    }
232 246

  
......
251 265
    int32_t *ptr = qdev_get_prop_ptr(dev, prop);
252 266

  
253 267
    if (dev->realized) {
254
        error_set(errp, QERR_PERMISSION_DENIED);
268
        qdev_prop_set_after_realize(dev, name, errp);
255 269
        return;
256 270
    }
257 271

  
......
324 338
    uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
325 339

  
326 340
    if (dev->realized) {
327
        error_set(errp, QERR_PERMISSION_DENIED);
341
        qdev_prop_set_after_realize(dev, name, errp);
328 342
        return;
329 343
    }
330 344

  
......
414 428
    char *str;
415 429

  
416 430
    if (dev->realized) {
417
        error_set(errp, QERR_PERMISSION_DENIED);
431
        qdev_prop_set_after_realize(dev, name, errp);
418 432
        return;
419 433
    }
420 434

  
......
478 492
    char *str, *p;
479 493

  
480 494
    if (dev->realized) {
481
        error_set(errp, QERR_PERMISSION_DENIED);
495
        qdev_prop_set_after_realize(dev, name, errp);
482 496
        return;
483 497
    }
484 498

  
......
570 584
    char *str;
571 585

  
572 586
    if (dev->realized) {
573
        error_set(errp, QERR_PERMISSION_DENIED);
587
        qdev_prop_set_after_realize(dev, name, errp);
574 588
        return;
575 589
    }
576 590

  
......
641 655
    const int64_t max = 32768;
642 656

  
643 657
    if (dev->realized) {
644
        error_set(errp, QERR_PERMISSION_DENIED);
658
        qdev_prop_set_after_realize(dev, name, errp);
645 659
        return;
646 660
    }
647 661

  
......
709 723
    unsigned int slot = 0, func = 0;
710 724

  
711 725
    if (dev->realized) {
712
        error_set(errp, QERR_PERMISSION_DENIED);
726
        qdev_prop_set_after_realize(dev, name, errp);
713 727
        return;
714 728
    }
715 729

  
......
824 838
    int i;
825 839

  
826 840
    if (dev->realized) {
827
        error_set(errp, QERR_PERMISSION_DENIED);
841
        qdev_prop_set_after_realize(dev, name, errp);
828 842
        return;
829 843
    }
830 844
    if (*alenptr) {
b/hw/qdev-properties.h
167 167
 */
168 168
void qdev_property_add_static(DeviceState *dev, Property *prop, Error **errp);
169 169

  
170
/**
171
 * @qdev_prop_set_after_realize:
172
 * @dev: device
173
 * @name: name of property
174
 * @errp: indirect pointer to Error to be set
175
 * Set the Error object to report that an attempt was made to set a property
176
 * on a device after it has already been realized. This is a utility function
177
 * which allows property-setter functions to easily report the error in
178
 * a friendly format identifying both the device and the property.
179
 */
180
void qdev_prop_set_after_realize(DeviceState *dev, const char *name,
181
                                 Error **errp);
170 182
#endif
b/hw/qdev.c
562 562
    int ret;
563 563

  
564 564
    if (dev->realized) {
565
        error_set(errp, QERR_PERMISSION_DENIED);
565
        qdev_prop_set_after_realize(dev, name, errp);
566 566
        return;
567 567
    }
568 568

  

Also available in: Unified diff