Re: [PATCH 4/6] KVM: s390: fix sigp set prefix status stored cases

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 26.06.2012, at 16:06, Cornelia Huck wrote:

> From: Heiko Carstens <heiko.carstens@xxxxxxxxxx>
> 
> If an invalid parameter is passed or the addressed cpu is in an
> incorrect state sigp set prefix will store a status.
> This status must only have bits set as defined by the architecture.
> The current kvm implementation missed to clear bits and also did
> not set the intended status bit ("and" instead of "or" operation).
> 
> Signed-off-by: Heiko Carstens <heiko.carstens@xxxxxxxxxx>
> Signed-off-by: Cornelia Huck <cornelia.huck@xxxxxxxxxx>

What was the net effect of this for a guest? Any problems rising from it?


Alex

> ---
> arch/s390/kvm/sigp.c |    7 +++++--
> 1 file changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/s390/kvm/sigp.c b/arch/s390/kvm/sigp.c
> index caccc0e..ca544d5 100644
> --- a/arch/s390/kvm/sigp.c
> +++ b/arch/s390/kvm/sigp.c
> @@ -207,6 +207,7 @@ static int __sigp_set_prefix(struct kvm_vcpu *vcpu, u16 cpu_addr, u32 address,
> 	address = address & 0x7fffe000u;
> 	if (copy_from_guest_absolute(vcpu, &tmp, address, 1) ||
> 	   copy_from_guest_absolute(vcpu, &tmp, address + PAGE_SIZE, 1)) {
> +		*reg &= 0xffffffff00000000UL;
> 		*reg |= SIGP_STATUS_INVALID_PARAMETER;
> 		return 1; /* invalid parameter */
> 	}
> @@ -220,8 +221,9 @@ static int __sigp_set_prefix(struct kvm_vcpu *vcpu, u16 cpu_addr, u32 address,
> 		li = fi->local_int[cpu_addr];
> 
> 	if (li == NULL) {
> +		*reg &= 0xffffffff00000000UL;
> +		*reg |= SIGP_STATUS_INCORRECT_STATE;
> 		rc = 1; /* incorrect state */
> -		*reg &= SIGP_STATUS_INCORRECT_STATE;
> 		kfree(inti);
> 		goto out_fi;
> 	}
> @@ -229,8 +231,9 @@ static int __sigp_set_prefix(struct kvm_vcpu *vcpu, u16 cpu_addr, u32 address,
> 	spin_lock_bh(&li->lock);
> 	/* cpu must be in stopped state */
> 	if (!(atomic_read(li->cpuflags) & CPUSTAT_STOPPED)) {
> +		*reg &= 0xffffffff00000000UL;
> +		*reg |= SIGP_STATUS_INCORRECT_STATE;
> 		rc = 1; /* incorrect state */
> -		*reg &= SIGP_STATUS_INCORRECT_STATE;
> 		kfree(inti);
> 		goto out_li;
> 	}
> -- 
> 1.7.10.4
> 

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux