On Tue, 03 Sep 2013 03:56:06 +0100
Ben Hutchings <[email protected]> wrote:

> commit 2b29a9fdcb92bfc6b6f4c412d71505869de61a56 upstream.
> 
> Any uaccess between guest_enter and guest_exit could trigger a page fault,
> the page fault handler would handle it as a guest fault and translate a
> user address as guest address.
> 
> Signed-off-by: Dominik Dingel <[email protected]>
> Signed-off-by: Christian Borntraeger <[email protected]>
> Signed-off-by: Paolo Bonzini <[email protected]>
> [bwh: Backported to 3.2: adjust context and add the rc variable]
> Signed-off-by: Ben Hutchings <[email protected]>
> ---
> This is a blind backport, not even compile-tested, but I think it does
> logically the same thing as your fix and would apply to 3.0.y and 3.2.y.
> 3.4.y would need a different version again.
> 
> Ben.

Reviewed-by: Dominik Dingel <[email protected]>

Dominik

> 
>  arch/s390/kvm/kvm-s390.c | 21 ++++++++++++++-------
>  1 file changed, 14 insertions(+), 7 deletions(-)
> 
> --- a/arch/s390/kvm/kvm-s390.c
> +++ b/arch/s390/kvm/kvm-s390.c
> @@ -469,6 +469,8 @@ int kvm_arch_vcpu_ioctl_set_mpstate(stru
>  
>  static void __vcpu_run(struct kvm_vcpu *vcpu)
>  {
> +     int rc;
> +
>       memcpy(&vcpu->arch.sie_block->gg14, &vcpu->arch.guest_gprs[14], 16);
>  
>       if (need_resched())
> @@ -479,21 +481,24 @@ static void __vcpu_run(struct kvm_vcpu *
>  
>       kvm_s390_deliver_pending_interrupts(vcpu);
>  
> +     VCPU_EVENT(vcpu, 6, "entering sie flags %x",
> +                atomic_read(&vcpu->arch.sie_block->cpuflags));
> +
>       vcpu->arch.sie_block->icptcode = 0;
>       local_irq_disable();
>       kvm_guest_enter();
>       local_irq_enable();
> -     VCPU_EVENT(vcpu, 6, "entering sie flags %x",
> -                atomic_read(&vcpu->arch.sie_block->cpuflags));
> -     if (sie64a(vcpu->arch.sie_block, vcpu->arch.guest_gprs)) {
> +     rc = sie64a(vcpu->arch.sie_block, vcpu->arch.guest_gprs);
> +     local_irq_disable();
> +     kvm_guest_exit();
> +     local_irq_enable();
> +
> +     if (rc) {
>               VCPU_EVENT(vcpu, 3, "%s", "fault in sie instruction");
>               kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
>       }
>       VCPU_EVENT(vcpu, 6, "exit sie icptcode %d",
>                  vcpu->arch.sie_block->icptcode);
> -     local_irq_disable();
> -     kvm_guest_exit();
> -     local_irq_enable();
>  
>       memcpy(&vcpu->arch.guest_gprs[14], &vcpu->arch.sie_block->gg14, 16);
>  }
> 
> 

--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to