When we do the initial CPU reset we must not only clear the registers in the internal data structures but also in kvm_run sync_regs. For modern userspace sync_regs is the only place that it looks at.
Cc: stable@vger.kernel.org Signed-off-by: Christian Borntraeger borntraeger@de.ibm.com --- arch/s390/kvm/kvm-s390.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index d7ff30e45589..c2e6d4ba4e23 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c @@ -3268,7 +3268,10 @@ static void kvm_arch_vcpu_ioctl_initial_reset(struct kvm_vcpu *vcpu) /* Initial reset is a superset of the normal reset */ kvm_arch_vcpu_ioctl_normal_reset(vcpu);
- /* this equals initial cpu reset in pop, but we don't switch to ESA */ + /* + * This equals initial cpu reset in pop, but we don't switch to ESA. + * We do not only reset the internal data, but also ... + */ vcpu->arch.sie_block->gpsw.mask = 0; vcpu->arch.sie_block->gpsw.addr = 0; kvm_s390_set_prefix(vcpu, 0); @@ -3278,6 +3281,19 @@ static void kvm_arch_vcpu_ioctl_initial_reset(struct kvm_vcpu *vcpu) memset(vcpu->arch.sie_block->gcr, 0, sizeof(vcpu->arch.sie_block->gcr)); vcpu->arch.sie_block->gcr[0] = CR0_INITIAL_MASK; vcpu->arch.sie_block->gcr[14] = CR14_INITIAL_MASK; + + /* ... the data in sync regs */ + memset(vcpu->run->s.regs.crs, 0, sizeof(vcpu->run->s.regs.crs)); + vcpu->run->s.regs.ckc = 0; + vcpu->run->s.regs.crs[0] = CR0_INITIAL_MASK; + vcpu->run->s.regs.crs[14] = CR14_INITIAL_MASK; + vcpu->run->psw_addr = 0; + vcpu->run->psw_mask = 0; + vcpu->run->s.regs.todpr = 0; + vcpu->run->s.regs.cputm = 0; + vcpu->run->s.regs.ckc = 0; + vcpu->run->s.regs.pp = 0; + vcpu->run->s.regs.gbea = 1; vcpu->run->s.regs.fpc = 0; vcpu->arch.sie_block->gbea = 1; vcpu->arch.sie_block->pp = 0;
On 10.03.20 14:12, Christian Borntraeger wrote:
When we do the initial CPU reset we must not only clear the registers in the internal data structures but also in kvm_run sync_regs. For modern userspace sync_regs is the only place that it looks at.
Cc: stable@vger.kernel.org
# v?
Signed-off-by: Christian Borntraeger borntraeger@de.ibm.com
arch/s390/kvm/kvm-s390.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index d7ff30e45589..c2e6d4ba4e23 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c @@ -3268,7 +3268,10 @@ static void kvm_arch_vcpu_ioctl_initial_reset(struct kvm_vcpu *vcpu) /* Initial reset is a superset of the normal reset */ kvm_arch_vcpu_ioctl_normal_reset(vcpu);
- /* this equals initial cpu reset in pop, but we don't switch to ESA */
- /*
* This equals initial cpu reset in pop, but we don't switch to ESA.
* We do not only reset the internal data, but also ...
vcpu->arch.sie_block->gpsw.mask = 0; vcpu->arch.sie_block->gpsw.addr = 0; kvm_s390_set_prefix(vcpu, 0);*/
@@ -3278,6 +3281,19 @@ static void kvm_arch_vcpu_ioctl_initial_reset(struct kvm_vcpu *vcpu) memset(vcpu->arch.sie_block->gcr, 0, sizeof(vcpu->arch.sie_block->gcr)); vcpu->arch.sie_block->gcr[0] = CR0_INITIAL_MASK; vcpu->arch.sie_block->gcr[14] = CR14_INITIAL_MASK;
- /* ... the data in sync regs */
- memset(vcpu->run->s.regs.crs, 0, sizeof(vcpu->run->s.regs.crs));
- vcpu->run->s.regs.ckc = 0;
- vcpu->run->s.regs.crs[0] = CR0_INITIAL_MASK;
- vcpu->run->s.regs.crs[14] = CR14_INITIAL_MASK;
- vcpu->run->psw_addr = 0;
- vcpu->run->psw_mask = 0;
- vcpu->run->s.regs.todpr = 0;
- vcpu->run->s.regs.cputm = 0;
- vcpu->run->s.regs.ckc = 0;
- vcpu->run->s.regs.pp = 0;
- vcpu->run->s.regs.gbea = 1; vcpu->run->s.regs.fpc = 0; vcpu->arch.sie_block->gbea = 1; vcpu->arch.sie_block->pp = 0;
Acked-by: David Hildenbrand david@redhat.com
However, I do wonder if that ioctl *originally* was designed for that - IOW if this is rally a stable patch or just some change that makes sense. IIRC, userspace/QEMU always did the right thing, no? There was no documentation about the guarantees AFAIK.
On 10.03.20 14:21, David Hildenbrand wrote:
On 10.03.20 14:12, Christian Borntraeger wrote:
When we do the initial CPU reset we must not only clear the registers in the internal data structures but also in kvm_run sync_regs. For modern userspace sync_regs is the only place that it looks at.
Cc: stable@vger.kernel.org
# v?
Signed-off-by: Christian Borntraeger borntraeger@de.ibm.com
arch/s390/kvm/kvm-s390.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index d7ff30e45589..c2e6d4ba4e23 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c @@ -3268,7 +3268,10 @@ static void kvm_arch_vcpu_ioctl_initial_reset(struct kvm_vcpu *vcpu) /* Initial reset is a superset of the normal reset */ kvm_arch_vcpu_ioctl_normal_reset(vcpu);
- /* this equals initial cpu reset in pop, but we don't switch to ESA */
- /*
* This equals initial cpu reset in pop, but we don't switch to ESA.
* We do not only reset the internal data, but also ...
vcpu->arch.sie_block->gpsw.mask = 0; vcpu->arch.sie_block->gpsw.addr = 0; kvm_s390_set_prefix(vcpu, 0);*/
@@ -3278,6 +3281,19 @@ static void kvm_arch_vcpu_ioctl_initial_reset(struct kvm_vcpu *vcpu) memset(vcpu->arch.sie_block->gcr, 0, sizeof(vcpu->arch.sie_block->gcr)); vcpu->arch.sie_block->gcr[0] = CR0_INITIAL_MASK; vcpu->arch.sie_block->gcr[14] = CR14_INITIAL_MASK;
- /* ... the data in sync regs */
- memset(vcpu->run->s.regs.crs, 0, sizeof(vcpu->run->s.regs.crs));
- vcpu->run->s.regs.ckc = 0;
- vcpu->run->s.regs.crs[0] = CR0_INITIAL_MASK;
- vcpu->run->s.regs.crs[14] = CR14_INITIAL_MASK;
- vcpu->run->psw_addr = 0;
- vcpu->run->psw_mask = 0;
- vcpu->run->s.regs.todpr = 0;
- vcpu->run->s.regs.cputm = 0;
- vcpu->run->s.regs.ckc = 0;
- vcpu->run->s.regs.pp = 0;
- vcpu->run->s.regs.gbea = 1; vcpu->run->s.regs.fpc = 0; vcpu->arch.sie_block->gbea = 1; vcpu->arch.sie_block->pp = 0;
Acked-by: David Hildenbrand david@redhat.com
However, I do wonder if that ioctl *originally* was designed for that - IOW if this is rally a stable patch or just some change that makes sense. IIRC, userspace/QEMU always did the right thing, no? There was no documentation about the guarantees AFAIK.
Yes, I moved forth and back. Maybe removing cc stable and just adding Fixes: 7de3f1423ff ("KVM: s390: Add new reset vcpu API") is better then.
On 10.03.20 14:23, Christian Borntraeger wrote:
On 10.03.20 14:21, David Hildenbrand wrote:
On 10.03.20 14:12, Christian Borntraeger wrote:
When we do the initial CPU reset we must not only clear the registers in the internal data structures but also in kvm_run sync_regs. For modern userspace sync_regs is the only place that it looks at.
Cc: stable@vger.kernel.org
# v?
Signed-off-by: Christian Borntraeger borntraeger@de.ibm.com
arch/s390/kvm/kvm-s390.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index d7ff30e45589..c2e6d4ba4e23 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c @@ -3268,7 +3268,10 @@ static void kvm_arch_vcpu_ioctl_initial_reset(struct kvm_vcpu *vcpu) /* Initial reset is a superset of the normal reset */ kvm_arch_vcpu_ioctl_normal_reset(vcpu);
- /* this equals initial cpu reset in pop, but we don't switch to ESA */
- /*
* This equals initial cpu reset in pop, but we don't switch to ESA.
* We do not only reset the internal data, but also ...
vcpu->arch.sie_block->gpsw.mask = 0; vcpu->arch.sie_block->gpsw.addr = 0; kvm_s390_set_prefix(vcpu, 0);*/
@@ -3278,6 +3281,19 @@ static void kvm_arch_vcpu_ioctl_initial_reset(struct kvm_vcpu *vcpu) memset(vcpu->arch.sie_block->gcr, 0, sizeof(vcpu->arch.sie_block->gcr)); vcpu->arch.sie_block->gcr[0] = CR0_INITIAL_MASK; vcpu->arch.sie_block->gcr[14] = CR14_INITIAL_MASK;
- /* ... the data in sync regs */
- memset(vcpu->run->s.regs.crs, 0, sizeof(vcpu->run->s.regs.crs));
- vcpu->run->s.regs.ckc = 0;
- vcpu->run->s.regs.crs[0] = CR0_INITIAL_MASK;
- vcpu->run->s.regs.crs[14] = CR14_INITIAL_MASK;
- vcpu->run->psw_addr = 0;
- vcpu->run->psw_mask = 0;
- vcpu->run->s.regs.todpr = 0;
- vcpu->run->s.regs.cputm = 0;
- vcpu->run->s.regs.ckc = 0;
- vcpu->run->s.regs.pp = 0;
- vcpu->run->s.regs.gbea = 1; vcpu->run->s.regs.fpc = 0; vcpu->arch.sie_block->gbea = 1; vcpu->arch.sie_block->pp = 0;
Acked-by: David Hildenbrand david@redhat.com
However, I do wonder if that ioctl *originally* was designed for that - IOW if this is rally a stable patch or just some change that makes sense. IIRC, userspace/QEMU always did the right thing, no? There was no documentation about the guarantees AFAIK.
Yes, I moved forth and back. Maybe removing cc stable and just adding Fixes: 7de3f1423ff ("KVM: s390: Add new reset vcpu API") is better then.
Makes sense.
On Tue, 10 Mar 2020 14:21:23 +0100 David Hildenbrand david@redhat.com wrote:
On 10.03.20 14:12, Christian Borntraeger wrote:
When we do the initial CPU reset we must not only clear the registers in the internal data structures but also in kvm_run sync_regs. For modern userspace sync_regs is the only place that it looks at.
Cc: stable@vger.kernel.org
# v?
Signed-off-by: Christian Borntraeger borntraeger@de.ibm.com
arch/s390/kvm/kvm-s390.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-)
However, I do wonder if that ioctl *originally* was designed for that - IOW if this is rally a stable patch or just some change that makes sense. IIRC, userspace/QEMU always did the right thing, no? There was no documentation about the guarantees AFAIK.
The documentation only refers to the PoP for what is actually reset... should it also mention the sync regs?
linux-stable-mirror@lists.linaro.org