diff options
author | Anton Vorontsov <cbouatmailru@gmail.com> | 2012-01-10 20:55:11 +0400 |
---|---|---|
committer | Anton Vorontsov <cbouatmailru@gmail.com> | 2012-01-10 20:55:11 +0400 |
commit | 913272b3864d6da89c70d9fc2c30ccb57794b369 (patch) | |
tree | 4fb0a8ab1b53623d2a8ea200b80a3ace2d271471 /arch/s390/kvm/priv.c | |
parent | 6cfc2a23540667cff6da6e41d1f1167a9a45aa9a (diff) | |
parent | 629bcb4b72d49b3631ae3dd0fe1d345820fadfcc (diff) | |
download | linux-913272b3864d6da89c70d9fc2c30ccb57794b369.tar.bz2 |
Merge git://git.infradead.org/users/cbou/battery-urgent
Diffstat (limited to 'arch/s390/kvm/priv.c')
-rw-r--r-- | arch/s390/kvm/priv.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c index 391626361084..d02638959922 100644 --- a/arch/s390/kvm/priv.c +++ b/arch/s390/kvm/priv.c @@ -336,6 +336,7 @@ static int handle_tprot(struct kvm_vcpu *vcpu) u64 address1 = disp1 + base1 ? vcpu->arch.guest_gprs[base1] : 0; u64 address2 = disp2 + base2 ? vcpu->arch.guest_gprs[base2] : 0; struct vm_area_struct *vma; + unsigned long user_address; vcpu->stat.instruction_tprot++; @@ -349,9 +350,14 @@ static int handle_tprot(struct kvm_vcpu *vcpu) return -EOPNOTSUPP; + /* we must resolve the address without holding the mmap semaphore. + * This is ok since the userspace hypervisor is not supposed to change + * the mapping while the guest queries the memory. Otherwise the guest + * might crash or get wrong info anyway. */ + user_address = (unsigned long) __guestaddr_to_user(vcpu, address1); + down_read(¤t->mm->mmap_sem); - vma = find_vma(current->mm, - (unsigned long) __guestaddr_to_user(vcpu, address1)); + vma = find_vma(current->mm, user_address); if (!vma) { up_read(¤t->mm->mmap_sem); return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING); |