diff options
Diffstat (limited to 'arch/s390/kvm/sigp.c')
-rw-r--r-- | arch/s390/kvm/sigp.c | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/arch/s390/kvm/sigp.c b/arch/s390/kvm/sigp.c index 702276f5e2f..2a129bf44b9 100644 --- a/arch/s390/kvm/sigp.c +++ b/arch/s390/kvm/sigp.c | |||
@@ -57,8 +57,8 @@ static int __sigp_sense(struct kvm_vcpu *vcpu, u16 cpu_addr, | |||
57 | spin_lock(&fi->lock); | 57 | spin_lock(&fi->lock); |
58 | if (fi->local_int[cpu_addr] == NULL) | 58 | if (fi->local_int[cpu_addr] == NULL) |
59 | rc = 3; /* not operational */ | 59 | rc = 3; /* not operational */ |
60 | else if (atomic_read(fi->local_int[cpu_addr]->cpuflags) | 60 | else if (!(atomic_read(fi->local_int[cpu_addr]->cpuflags) |
61 | & CPUSTAT_RUNNING) { | 61 | & CPUSTAT_STOPPED)) { |
62 | *reg &= 0xffffffff00000000UL; | 62 | *reg &= 0xffffffff00000000UL; |
63 | rc = 1; /* status stored */ | 63 | rc = 1; /* status stored */ |
64 | } else { | 64 | } else { |
@@ -189,10 +189,8 @@ static int __sigp_set_prefix(struct kvm_vcpu *vcpu, u16 cpu_addr, u32 address, | |||
189 | 189 | ||
190 | /* make sure that the new value is valid memory */ | 190 | /* make sure that the new value is valid memory */ |
191 | address = address & 0x7fffe000u; | 191 | address = address & 0x7fffe000u; |
192 | if ((copy_from_user(&tmp, (void __user *) | 192 | if (copy_from_guest_absolute(vcpu, &tmp, address, 1) || |
193 | (address + vcpu->arch.sie_block->gmsor) , 1)) || | 193 | copy_from_guest_absolute(vcpu, &tmp, address + PAGE_SIZE, 1)) { |
194 | (copy_from_user(&tmp, (void __user *)(address + | ||
195 | vcpu->arch.sie_block->gmsor + PAGE_SIZE), 1))) { | ||
196 | *reg |= SIGP_STAT_INVALID_PARAMETER; | 194 | *reg |= SIGP_STAT_INVALID_PARAMETER; |
197 | return 1; /* invalid parameter */ | 195 | return 1; /* invalid parameter */ |
198 | } | 196 | } |
@@ -214,7 +212,7 @@ static int __sigp_set_prefix(struct kvm_vcpu *vcpu, u16 cpu_addr, u32 address, | |||
214 | 212 | ||
215 | spin_lock_bh(&li->lock); | 213 | spin_lock_bh(&li->lock); |
216 | /* cpu must be in stopped state */ | 214 | /* cpu must be in stopped state */ |
217 | if (atomic_read(li->cpuflags) & CPUSTAT_RUNNING) { | 215 | if (!(atomic_read(li->cpuflags) & CPUSTAT_STOPPED)) { |
218 | rc = 1; /* incorrect state */ | 216 | rc = 1; /* incorrect state */ |
219 | *reg &= SIGP_STAT_INCORRECT_STATE; | 217 | *reg &= SIGP_STAT_INCORRECT_STATE; |
220 | kfree(inti); | 218 | kfree(inti); |