Message ID | 1393414708-37739-2-git-send-email-borntraeger@de.ibm.com |
---|---|
State | New |
Headers | show |
On 26.02.14 12:38, Christian Borntraeger wrote: > From: Thomas Huth <thuth@linux.vnet.ibm.com> > > Some of the state in the kernel can not be reset from QEMU yet. > For this we've got to use the KVM_S390_INITIAL_RESET ioctl to make > sure that the state in the kernel is set to the right values during > initial CPU reset, too. > > Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com> > Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com> > Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> > --- > target-s390x/cpu.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/target-s390x/cpu.c b/target-s390x/cpu.c > index f1319e5..1a8c1cc 100644 > --- a/target-s390x/cpu.c > +++ b/target-s390x/cpu.c > @@ -108,6 +108,15 @@ static void s390_cpu_initial_reset(CPUState *s) > env->cregs[14] = CR14_RESET; > > env->pfault_token = -1UL; > + > +#if defined(CONFIG_KVM) > + /* Reset state inside the kernel that we cannot access yet from QEMU. */ > + if (kvm_enabled()) { > + if (kvm_vcpu_ioctl(s, KVM_S390_INITIAL_RESET, NULL)) { Could we put this into the vcpu register sync function? It gets a parameter that indicates when we are on RESET level, right? That way we don't have to put kvm-only code in cpu.c :). Alex
On Mon, 14 Apr 2014 12:14:49 +0200 Alexander Graf <agraf@suse.de> wrote: > > On 26.02.14 12:38, Christian Borntraeger wrote: > > From: Thomas Huth <thuth@linux.vnet.ibm.com> > > > > Some of the state in the kernel can not be reset from QEMU yet. > > For this we've got to use the KVM_S390_INITIAL_RESET ioctl to make > > sure that the state in the kernel is set to the right values during > > initial CPU reset, too. > > > > Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com> > > Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com> > > Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> > > --- > > target-s390x/cpu.c | 9 +++++++++ > > 1 file changed, 9 insertions(+) > > > > diff --git a/target-s390x/cpu.c b/target-s390x/cpu.c > > index f1319e5..1a8c1cc 100644 > > --- a/target-s390x/cpu.c > > +++ b/target-s390x/cpu.c > > @@ -108,6 +108,15 @@ static void s390_cpu_initial_reset(CPUState *s) > > env->cregs[14] = CR14_RESET; > > > > env->pfault_token = -1UL; > > + > > +#if defined(CONFIG_KVM) > > + /* Reset state inside the kernel that we cannot access yet from QEMU. */ > > + if (kvm_enabled()) { > > + if (kvm_vcpu_ioctl(s, KVM_S390_INITIAL_RESET, NULL)) { > > Could we put this into the vcpu register sync function? It gets a > parameter that indicates when we are on RESET level, right? No, sorry, as far as I can see, this is not that easily possible: On S390, we've got five different levels of reset (CPU reset, Initial CPU reset, Subsystem reset, Clear reset & Power-on reset). The ioctl is about initial CPU reset only, while the register sync function flag is rather only used by system/clear reset instead. So for example when the guest OS sends a SIGP INITIAL CPU RESET from one CPU to another, only the s390_cpu_initial_reset() will be called, but not the register sync with KVM_PUT_RESET_STATE. Thomas
On 14.04.14 13:54, Thomas Huth wrote: > On Mon, 14 Apr 2014 12:14:49 +0200 > Alexander Graf <agraf@suse.de> wrote: > >> On 26.02.14 12:38, Christian Borntraeger wrote: >>> From: Thomas Huth <thuth@linux.vnet.ibm.com> >>> >>> Some of the state in the kernel can not be reset from QEMU yet. >>> For this we've got to use the KVM_S390_INITIAL_RESET ioctl to make >>> sure that the state in the kernel is set to the right values during >>> initial CPU reset, too. >>> >>> Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com> >>> Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com> >>> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> >>> --- >>> target-s390x/cpu.c | 9 +++++++++ >>> 1 file changed, 9 insertions(+) >>> >>> diff --git a/target-s390x/cpu.c b/target-s390x/cpu.c >>> index f1319e5..1a8c1cc 100644 >>> --- a/target-s390x/cpu.c >>> +++ b/target-s390x/cpu.c >>> @@ -108,6 +108,15 @@ static void s390_cpu_initial_reset(CPUState *s) >>> env->cregs[14] = CR14_RESET; >>> >>> env->pfault_token = -1UL; >>> + >>> +#if defined(CONFIG_KVM) >>> + /* Reset state inside the kernel that we cannot access yet from QEMU. */ >>> + if (kvm_enabled()) { >>> + if (kvm_vcpu_ioctl(s, KVM_S390_INITIAL_RESET, NULL)) { >> Could we put this into the vcpu register sync function? It gets a >> parameter that indicates when we are on RESET level, right? > No, sorry, as far as I can see, this is not that easily possible: > > On S390, we've got five different levels of reset (CPU reset, > Initial CPU reset, Subsystem reset, Clear reset & Power-on reset). > The ioctl is about initial CPU reset only, while the register sync > function flag is rather only used by system/clear reset instead. > > So for example when the guest OS sends a SIGP INITIAL CPU RESET from > one CPU to another, only the s390_cpu_initial_reset() will be called, > but not the register sync with KVM_PUT_RESET_STATE. Right, I keep forgetting these details :) Alex
diff --git a/target-s390x/cpu.c b/target-s390x/cpu.c index f1319e5..1a8c1cc 100644 --- a/target-s390x/cpu.c +++ b/target-s390x/cpu.c @@ -108,6 +108,15 @@ static void s390_cpu_initial_reset(CPUState *s) env->cregs[14] = CR14_RESET; env->pfault_token = -1UL; + +#if defined(CONFIG_KVM) + /* Reset state inside the kernel that we cannot access yet from QEMU. */ + if (kvm_enabled()) { + if (kvm_vcpu_ioctl(s, KVM_S390_INITIAL_RESET, NULL)) { + perror("Initial CPU reset failed"); + } + } +#endif } /* CPUClass:reset() */