From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=38019 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Q8JXX-0002Pr-R3 for qemu-devel@nongnu.org; Fri, 08 Apr 2011 17:48:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Q8JXO-0000dm-B1 for qemu-devel@nongnu.org; Fri, 08 Apr 2011 17:48:27 -0400 Received: from tx2ehsobe004.messaging.microsoft.com ([65.55.88.14]:10473 helo=TX2EHSOBE009.bigfish.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Q8JXO-0000d0-3T for qemu-devel@nongnu.org; Fri, 08 Apr 2011 17:48:18 -0400 Date: Fri, 8 Apr 2011 16:48:10 -0500 From: Scott Wood Message-ID: <20110408214810.GA16631@schlenkerla.am.freescale.net> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline Subject: [Qemu-devel] [PATCH] kvm: ppc: fixes for KVM_SET_SREGS on init List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: agraf@suse.de Cc: qemu-devel@nongnu.org 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 --- target-ppc/kvm.c | 33 ++++++++++++++++++++++++++++++--- 1 files changed, 30 insertions(+), 3 deletions(-) diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c index 2cfb24b..5401536 100644 --- a/target-ppc/kvm.c +++ b/target-ppc/kvm.c @@ -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; + +#ifdef TARGET_PPC +#ifdef KVM_CAP_PPC_SEGSTATE + if (!kvm_check_extension(cenv->kvm_state, KVM_CAP_PPC_SEGSTATE)) { + return 0; + } +#else + return 0; +#endif +#else /* TARGET_PPCEMB */ + 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); -- 1.7.1