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];
|
||||
int i;
|
||||
|
||||
if (smp_cpus > FSL_IMX6_NUM_CPUS) {
|
||||
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++) {
|
||||
for (i = 0; i < MIN(smp_cpus, FSL_IMX6_NUM_CPUS); i++) {
|
||||
object_initialize(&s->cpu[i], sizeof(s->cpu[i]),
|
||||
"cortex-a9-" TYPE_ARM_CPU);
|
||||
snprintf(name, NAME_SIZE, "cpu%d", i);
|
||||
@ -119,6 +113,12 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp)
|
||||
uint16_t i;
|
||||
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++) {
|
||||
|
||||
/* On uniprocessor, the CBAR is set to 0 */
|
||||
|
@ -35,13 +35,8 @@ static void fsl_imx7_init(Object *obj)
|
||||
char name[NAME_SIZE];
|
||||
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]),
|
||||
ARM_CPU_TYPE_NAME("cortex-a7"));
|
||||
snprintf(name, NAME_SIZE, "cpu%d", i);
|
||||
@ -197,6 +192,12 @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
|
||||
qemu_irq irq;
|
||||
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++) {
|
||||
o = OBJECT(&s->cpu[i]);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user