mirror of https://gitee.com/openkylin/qemu.git
target/ppc: Proper cleanup when ppc_cpu_realizefn fails
If ppc_cpu_realizefn() fails after cpu_exec_realizefn() has been called, we will have to undo whatever cpu_exec_realizefn() did by explicitly calling cpu_exec_unrealizeffn() which is currently missing. Failure to do this proper cleanup will result in CPU which was never fully realized to linger on the cpus list causing SIGSEGV later (for eg when running "info cpus"). Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com> Reviewed-by: Greg Kurz <groug@kaod.org> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
46f7afa370
commit
fd35656368
|
@ -9825,14 +9825,14 @@ static void ppc_cpu_realizefn(DeviceState *dev, Error **errp)
|
||||||
error_append_hint(errp, "Adjust the number of cpus to %d "
|
error_append_hint(errp, "Adjust the number of cpus to %d "
|
||||||
"or try to raise the number of threads per core\n",
|
"or try to raise the number of threads per core\n",
|
||||||
cpu->cpu_dt_id * smp_threads / max_smt);
|
cpu->cpu_dt_id * smp_threads / max_smt);
|
||||||
return;
|
goto unrealize;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (tcg_enabled()) {
|
if (tcg_enabled()) {
|
||||||
if (ppc_fixup_cpu(cpu) != 0) {
|
if (ppc_fixup_cpu(cpu) != 0) {
|
||||||
error_setg(errp, "Unable to emulate selected CPU with TCG");
|
error_setg(errp, "Unable to emulate selected CPU with TCG");
|
||||||
return;
|
goto unrealize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9841,14 +9841,14 @@ static void ppc_cpu_realizefn(DeviceState *dev, Error **errp)
|
||||||
error_setg(errp, "CPU does not possess a BookE or 4xx MMU. "
|
error_setg(errp, "CPU does not possess a BookE or 4xx MMU. "
|
||||||
"Please use qemu-system-ppc or qemu-system-ppc64 instead "
|
"Please use qemu-system-ppc or qemu-system-ppc64 instead "
|
||||||
"or choose another CPU model.");
|
"or choose another CPU model.");
|
||||||
return;
|
goto unrealize;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
create_ppc_opcodes(cpu, &local_err);
|
create_ppc_opcodes(cpu, &local_err);
|
||||||
if (local_err != NULL) {
|
if (local_err != NULL) {
|
||||||
error_propagate(errp, local_err);
|
error_propagate(errp, local_err);
|
||||||
return;
|
goto unrealize;
|
||||||
}
|
}
|
||||||
init_ppc_proc(cpu);
|
init_ppc_proc(cpu);
|
||||||
|
|
||||||
|
@ -10033,6 +10033,10 @@ static void ppc_cpu_realizefn(DeviceState *dev, Error **errp)
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
return;
|
||||||
|
|
||||||
|
unrealize:
|
||||||
|
cpu_exec_unrealizefn(cs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ppc_cpu_unrealizefn(DeviceState *dev, Error **errp)
|
static void ppc_cpu_unrealizefn(DeviceState *dev, Error **errp)
|
||||||
|
|
Loading…
Reference in New Issue