Re: [PATCH 3.2] KVM: s390: move kvm_guest_enter,exit closer to sie

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

 



On Tue, 03 Sep 2013 03:56:06 +0100
Ben Hutchings <ben@xxxxxxxxxxxxxxx> 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 <dingel@xxxxxxxxxxxxxxxxxx>
> Signed-off-by: Christian Borntraeger <borntraeger@xxxxxxxxxx>
> Signed-off-by: Paolo Bonzini <pbonzini@xxxxxxxxxx>
> [bwh: Backported to 3.2: adjust context and add the rc variable]
> Signed-off-by: Ben Hutchings <ben@xxxxxxxxxxxxxxx>
> ---
> 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 <dingel@xxxxxxxxxxxxxxxxxx>

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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]