aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kvm/sigp.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/s390/kvm/sigp.c')
-rw-r--r--arch/s390/kvm/sigp.c12
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);