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