|
@@ -158,7 +158,7 @@ bool ppc_type_check_compat(const char *cputype, uint32_t compat_pvr,
|
|
|
return pcc_compat(pcc, compat_pvr, min_compat_pvr, max_compat_pvr);
|
|
|
}
|
|
|
|
|
|
-void ppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr, Error **errp)
|
|
|
+int ppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr, Error **errp)
|
|
|
{
|
|
|
const CompatInfo *compat = compat_by_pvr(compat_pvr);
|
|
|
CPUPPCState *env = &cpu->env;
|
|
@@ -169,11 +169,11 @@ void ppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr, Error **errp)
|
|
|
pcr = 0;
|
|
|
} else if (!compat) {
|
|
|
error_setg(errp, "Unknown compatibility PVR 0x%08"PRIx32, compat_pvr);
|
|
|
- return;
|
|
|
+ return -EINVAL;
|
|
|
} else if (!ppc_check_compat(cpu, compat_pvr, 0, 0)) {
|
|
|
error_setg(errp, "Compatibility PVR 0x%08"PRIx32" not valid for CPU",
|
|
|
compat_pvr);
|
|
|
- return;
|
|
|
+ return -EINVAL;
|
|
|
} else {
|
|
|
pcr = compat->pcr;
|
|
|
}
|
|
@@ -185,17 +185,19 @@ void ppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr, Error **errp)
|
|
|
if (ret < 0) {
|
|
|
error_setg_errno(errp, -ret,
|
|
|
"Unable to set CPU compatibility mode in KVM");
|
|
|
- return;
|
|
|
+ return ret;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
cpu->compat_pvr = compat_pvr;
|
|
|
env->spr[SPR_PCR] = pcr & pcc->pcr_mask;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
typedef struct {
|
|
|
uint32_t compat_pvr;
|
|
|
- Error *err;
|
|
|
+ Error **errp;
|
|
|
+ int ret;
|
|
|
} SetCompatState;
|
|
|
|
|
|
static void do_set_compat(CPUState *cs, run_on_cpu_data arg)
|
|
@@ -203,26 +205,28 @@ static void do_set_compat(CPUState *cs, run_on_cpu_data arg)
|
|
|
PowerPCCPU *cpu = POWERPC_CPU(cs);
|
|
|
SetCompatState *s = arg.host_ptr;
|
|
|
|
|
|
- ppc_set_compat(cpu, s->compat_pvr, &s->err);
|
|
|
+ s->ret = ppc_set_compat(cpu, s->compat_pvr, s->errp);
|
|
|
}
|
|
|
|
|
|
-void ppc_set_compat_all(uint32_t compat_pvr, Error **errp)
|
|
|
+int ppc_set_compat_all(uint32_t compat_pvr, Error **errp)
|
|
|
{
|
|
|
CPUState *cs;
|
|
|
|
|
|
CPU_FOREACH(cs) {
|
|
|
SetCompatState s = {
|
|
|
.compat_pvr = compat_pvr,
|
|
|
- .err = NULL,
|
|
|
+ .errp = errp,
|
|
|
+ .ret = 0,
|
|
|
};
|
|
|
|
|
|
run_on_cpu(cs, do_set_compat, RUN_ON_CPU_HOST_PTR(&s));
|
|
|
|
|
|
- if (s.err) {
|
|
|
- error_propagate(errp, s.err);
|
|
|
- return;
|
|
|
+ if (s.ret < 0) {
|
|
|
+ return s.ret;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
int ppc_compat_max_vthreads(PowerPCCPU *cpu)
|