PPC: KVM: Add support for EPR with KVM
This patch links KVM EPR support to the existing TCG support we have now. Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
e49798b1bd
commit
5b95b8b9c1
6
hw/ppc.c
6
hw/ppc.c
|
@ -435,7 +435,13 @@ void ppce500_set_mpic_proxy(bool enabled)
|
||||||
CPUPPCState *env;
|
CPUPPCState *env;
|
||||||
|
|
||||||
for (env = first_cpu; env != NULL; env = env->next_cpu) {
|
for (env = first_cpu; env != NULL; env = env->next_cpu) {
|
||||||
|
PowerPCCPU *cpu = ppc_env_get_cpu(env);
|
||||||
|
CPUState *cs = CPU(cpu);
|
||||||
|
|
||||||
env->mpic_proxy = enabled;
|
env->mpic_proxy = enabled;
|
||||||
|
if (kvm_enabled()) {
|
||||||
|
kvmppc_set_mpic_proxy(POWERPC_CPU(cs), enabled);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -846,6 +846,11 @@ int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
|
||||||
ret = 0;
|
ret = 0;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
case KVM_EXIT_EPR:
|
||||||
|
dprintf("handle epr\n");
|
||||||
|
run->epr.epr = ldl_phys(env->mpic_iack);
|
||||||
|
ret = 0;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(stderr, "KVM: unknown exit reason %d\n", run->exit_reason);
|
fprintf(stderr, "KVM: unknown exit reason %d\n", run->exit_reason);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
|
@ -1057,6 +1062,22 @@ void kvmppc_set_papr(PowerPCCPU *cpu)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void kvmppc_set_mpic_proxy(PowerPCCPU *cpu, int mpic_proxy)
|
||||||
|
{
|
||||||
|
CPUPPCState *env = &cpu->env;
|
||||||
|
CPUState *cs = CPU(cpu);
|
||||||
|
struct kvm_enable_cap cap = {};
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
cap.cap = KVM_CAP_PPC_EPR;
|
||||||
|
cap.args[0] = mpic_proxy;
|
||||||
|
ret = kvm_vcpu_ioctl(cs, KVM_ENABLE_CAP, &cap);
|
||||||
|
|
||||||
|
if (ret && mpic_proxy) {
|
||||||
|
cpu_abort(env, "This KVM version does not support EPR\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int kvmppc_smt_threads(void)
|
int kvmppc_smt_threads(void)
|
||||||
{
|
{
|
||||||
return cap_ppc_smt ? cap_ppc_smt : 1;
|
return cap_ppc_smt ? cap_ppc_smt : 1;
|
||||||
|
|
|
@ -25,6 +25,7 @@ int kvmppc_get_hasidle(CPUPPCState *env);
|
||||||
int kvmppc_get_hypercall(CPUPPCState *env, uint8_t *buf, int buf_len);
|
int kvmppc_get_hypercall(CPUPPCState *env, uint8_t *buf, int buf_len);
|
||||||
int kvmppc_set_interrupt(PowerPCCPU *cpu, int irq, int level);
|
int kvmppc_set_interrupt(PowerPCCPU *cpu, int irq, int level);
|
||||||
void kvmppc_set_papr(PowerPCCPU *cpu);
|
void kvmppc_set_papr(PowerPCCPU *cpu);
|
||||||
|
void kvmppc_set_mpic_proxy(PowerPCCPU *cpu, int mpic_proxy);
|
||||||
int kvmppc_smt_threads(void);
|
int kvmppc_smt_threads(void);
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
off_t kvmppc_alloc_rma(const char *name, MemoryRegion *sysmem);
|
off_t kvmppc_alloc_rma(const char *name, MemoryRegion *sysmem);
|
||||||
|
@ -81,6 +82,10 @@ static inline void kvmppc_set_papr(PowerPCCPU *cpu)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void kvmppc_set_mpic_proxy(PowerPCCPU *cpu, int mpic_proxy)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
static inline int kvmppc_smt_threads(void)
|
static inline int kvmppc_smt_threads(void)
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
|
|
Loading…
Reference in a new issue