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
84b4915dd2 (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:
Scott Wood 2011-04-11 18:34:34 -05:00 committed by Alexander Graf
parent d0384d1d38
commit 5666ca4ae0
1 changed files with 30 additions and 3 deletions

View File

@ -77,13 +77,40 @@ int kvm_arch_init(KVMState *s)
return 0;
}
int kvm_arch_init_vcpu(CPUState *cenv)
static int kvm_arch_sync_sregs(CPUState *cenv)
{
int ret = 0;
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];
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);