kvm: ppc: fixes for KVM_SET_SREGS on init
Classic/server ppc has had SREGS for a while now (though I think not always?), but it's still missing for booke. Check the capability before calling KVM_SET_SREGS. Without this, booke kvm fails to boot as of commit 84b4915dd2c0eaa86c970ffc42a68ea8ba9e48b5 (kvm: Handle kvm_init_vcpu errors). Also, don't write random stack state into the non-PVR sregs fields -- have kvm fill it in first. Eventually booke will have sregs and it will have its own capability to be tested here. However, we will want a way for platform code to request to look like the actual CPU we're running on, especially if SoC devices are being directly assigned. Signed-off-by: Scott Wood <scottwood@freescale.com> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
d0384d1d38
commit
5666ca4ae0
@ -77,13 +77,40 @@ int kvm_arch_init(KVMState *s)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int kvm_arch_init_vcpu(CPUState *cenv)
|
static int kvm_arch_sync_sregs(CPUState *cenv)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
|
||||||
struct kvm_sregs sregs;
|
struct kvm_sregs sregs;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (cenv->excp_model == POWERPC_EXCP_BOOKE) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
#ifdef KVM_CAP_PPC_SEGSTATE
|
||||||
|
if (!kvm_check_extension(cenv->kvm_state, KVM_CAP_PPC_SEGSTATE)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = kvm_vcpu_ioctl(cenv, KVM_GET_SREGS, &sregs);
|
||||||
|
if (ret) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
sregs.pvr = cenv->spr[SPR_PVR];
|
sregs.pvr = cenv->spr[SPR_PVR];
|
||||||
ret = kvm_vcpu_ioctl(cenv, KVM_SET_SREGS, &sregs);
|
return kvm_vcpu_ioctl(cenv, KVM_SET_SREGS, &sregs);
|
||||||
|
}
|
||||||
|
|
||||||
|
int kvm_arch_init_vcpu(CPUState *cenv)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = kvm_arch_sync_sregs(cenv);
|
||||||
|
if (ret) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
idle_timer = qemu_new_timer_ns(vm_clock, kvm_kick_env, cenv);
|
idle_timer = qemu_new_timer_ns(vm_clock, kvm_kick_env, cenv);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user