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

> From: Heiko Carstens <[email protected]>
> 
> 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 <[email protected]>
> Signed-off-by: Cornelia Huck <[email protected]>

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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to