hw/arm/fsl-imx: Fix introspection problem with fsl-imx6 and fsl-imx7
QEMU currently exits unexpectedly when trying to introspect the fsl-imx6
and fsl-imx7 devices on systems with many SMP CPUs:
$ echo "{'execute':'qmp_capabilities'}"\
       "{'execute':'device-list-properties',"\
       " 'arguments':{'typename':'fsl,imx6'}}" \
       | arm-softmmu/qemu-system-arm -M virt,accel=qtest -qmp stdio -smp 8
{"QMP": {"version": {"qemu": {"micro": 91, "minor": 11, "major": 2},
 "package": "build-all"}, "capabilities": []}}
{"return": {}}
fsl,imx6: Only 4 CPUs are supported (8 requested)
And:
$ echo "{'execute':'qmp_capabilities'}"\
       "{'execute':'device-list-properties',"\
       " 'arguments':{'typename':'fsl,imx7'}}" \
       | arm-softmmu/qemu-system-arm -M raspi2,accel=qtest -qmp stdio
{"QMP": {"version": {"qemu": {"micro": 91, "minor": 11, "major": 2},
 "package": "build-all"}, "capabilities": []}}
{"return": {}}
fsl,imx7: Only 2 CPUs are supported (4 requested)
This happens because these devices are doing an exit() from their
instance_init function - which should never be done since instance_init
can be called at any time for device introspection! Fix it by moving
the deadly check into the realize() function instead.
Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-id: 1522908551-14885-1-git-send-email-thuth@redhat.com
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
			
			
This commit is contained in:
		
							parent
							
								
									8aabc5437b
								
							
						
					
					
						commit
						f640a5914f
					
				@ -37,13 +37,7 @@ static void fsl_imx6_init(Object *obj)
 | 
				
			|||||||
    char name[NAME_SIZE];
 | 
					    char name[NAME_SIZE];
 | 
				
			||||||
    int i;
 | 
					    int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (smp_cpus > FSL_IMX6_NUM_CPUS) {
 | 
					    for (i = 0; i < MIN(smp_cpus, FSL_IMX6_NUM_CPUS); i++) {
 | 
				
			||||||
        error_report("%s: Only %d CPUs are supported (%d requested)",
 | 
					 | 
				
			||||||
                     TYPE_FSL_IMX6, FSL_IMX6_NUM_CPUS, smp_cpus);
 | 
					 | 
				
			||||||
        exit(1);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (i = 0; i < smp_cpus; i++) {
 | 
					 | 
				
			||||||
        object_initialize(&s->cpu[i], sizeof(s->cpu[i]),
 | 
					        object_initialize(&s->cpu[i], sizeof(s->cpu[i]),
 | 
				
			||||||
                          "cortex-a9-" TYPE_ARM_CPU);
 | 
					                          "cortex-a9-" TYPE_ARM_CPU);
 | 
				
			||||||
        snprintf(name, NAME_SIZE, "cpu%d", i);
 | 
					        snprintf(name, NAME_SIZE, "cpu%d", i);
 | 
				
			||||||
@ -119,6 +113,12 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
 | 
				
			|||||||
    uint16_t i;
 | 
					    uint16_t i;
 | 
				
			||||||
    Error *err = NULL;
 | 
					    Error *err = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (smp_cpus > FSL_IMX6_NUM_CPUS) {
 | 
				
			||||||
 | 
					        error_setg(errp, "%s: Only %d CPUs are supported (%d requested)",
 | 
				
			||||||
 | 
					                   TYPE_FSL_IMX6, FSL_IMX6_NUM_CPUS, smp_cpus);
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = 0; i < smp_cpus; i++) {
 | 
					    for (i = 0; i < smp_cpus; i++) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* On uniprocessor, the CBAR is set to 0 */
 | 
					        /* On uniprocessor, the CBAR is set to 0 */
 | 
				
			||||||
 | 
				
			|||||||
@ -35,13 +35,8 @@ static void fsl_imx7_init(Object *obj)
 | 
				
			|||||||
    char name[NAME_SIZE];
 | 
					    char name[NAME_SIZE];
 | 
				
			||||||
    int i;
 | 
					    int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (smp_cpus > FSL_IMX7_NUM_CPUS) {
 | 
					 | 
				
			||||||
        error_report("%s: Only %d CPUs are supported (%d requested)",
 | 
					 | 
				
			||||||
                     TYPE_FSL_IMX7, FSL_IMX7_NUM_CPUS, smp_cpus);
 | 
					 | 
				
			||||||
        exit(1);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = 0; i < smp_cpus; i++) {
 | 
					    for (i = 0; i < MIN(smp_cpus, FSL_IMX7_NUM_CPUS); i++) {
 | 
				
			||||||
        object_initialize(&s->cpu[i], sizeof(s->cpu[i]),
 | 
					        object_initialize(&s->cpu[i], sizeof(s->cpu[i]),
 | 
				
			||||||
                          ARM_CPU_TYPE_NAME("cortex-a7"));
 | 
					                          ARM_CPU_TYPE_NAME("cortex-a7"));
 | 
				
			||||||
        snprintf(name, NAME_SIZE, "cpu%d", i);
 | 
					        snprintf(name, NAME_SIZE, "cpu%d", i);
 | 
				
			||||||
@ -197,6 +192,12 @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
 | 
				
			|||||||
    qemu_irq irq;
 | 
					    qemu_irq irq;
 | 
				
			||||||
    char name[NAME_SIZE];
 | 
					    char name[NAME_SIZE];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (smp_cpus > FSL_IMX7_NUM_CPUS) {
 | 
				
			||||||
 | 
					        error_setg(errp, "%s: Only %d CPUs are supported (%d requested)",
 | 
				
			||||||
 | 
					                   TYPE_FSL_IMX7, FSL_IMX7_NUM_CPUS, smp_cpus);
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = 0; i < smp_cpus; i++) {
 | 
					    for (i = 0; i < smp_cpus; i++) {
 | 
				
			||||||
        o = OBJECT(&s->cpu[i]);
 | 
					        o = OBJECT(&s->cpu[i]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user