sd: Fix "info qtree" on boards with SD cards
The SD card object is not a SysBusDevice, so don't create it with qdev_create() if we're not assigning it to a specific bus; use object_new() instead. This was causing 'info qtree' to segfault on boards with SD cards, because qdev_create(NULL, TYPE_FOO) puts the created object on the system bus, and then we may try to run functions like sysbus_dev_print() on it, which fail when casting the object to SysBusDevice. (This is the same mistake that we made with the NAND device and fixed in commit 6749695eaaf346c1.) Reported-by: xiaoqiang.zhao <zxq_yx_007@163.com> Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: xiaoqiang.zhao <zxq_yx_007@163.com> Message-id: 1458061009-7733-1-git-send-email-peter.maydell@linaro.org
This commit is contained in:
		
							parent
							
								
									6717f587a4
								
							
						
					
					
						commit
						fec44a8c70
					
				@ -563,17 +563,19 @@ static const VMStateDescription sd_vmstate = {
 | 
				
			|||||||
/* Legacy initialization function for use by non-qdevified callers */
 | 
					/* Legacy initialization function for use by non-qdevified callers */
 | 
				
			||||||
SDState *sd_init(BlockBackend *blk, bool is_spi)
 | 
					SDState *sd_init(BlockBackend *blk, bool is_spi)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    Object *obj;
 | 
				
			||||||
    DeviceState *dev;
 | 
					    DeviceState *dev;
 | 
				
			||||||
    Error *err = NULL;
 | 
					    Error *err = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    dev = qdev_create(NULL, TYPE_SD_CARD);
 | 
					    obj = object_new(TYPE_SD_CARD);
 | 
				
			||||||
 | 
					    dev = DEVICE(obj);
 | 
				
			||||||
    qdev_prop_set_drive(dev, "drive", blk, &err);
 | 
					    qdev_prop_set_drive(dev, "drive", blk, &err);
 | 
				
			||||||
    if (err) {
 | 
					    if (err) {
 | 
				
			||||||
        error_report("sd_init failed: %s", error_get_pretty(err));
 | 
					        error_report("sd_init failed: %s", error_get_pretty(err));
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    qdev_prop_set_bit(dev, "spi", is_spi);
 | 
					    qdev_prop_set_bit(dev, "spi", is_spi);
 | 
				
			||||||
    object_property_set_bool(OBJECT(dev), true, "realized", &err);
 | 
					    object_property_set_bool(obj, true, "realized", &err);
 | 
				
			||||||
    if (err) {
 | 
					    if (err) {
 | 
				
			||||||
        error_report("sd_init failed: %s", error_get_pretty(err));
 | 
					        error_report("sd_init failed: %s", error_get_pretty(err));
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user