aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2014-01-01 10:47:12 -0500
committerChristian Borntraeger <borntraeger@de.ibm.com>2014-04-22 07:24:42 -0400
commit665170cb47acbddc202df0d8487ca867b64e1604 (patch)
tree05f5034f64d609a977435c940e88c050a5b9dec8 /arch/s390
parentd0bce6054a1759f1b2c86bf553801c77dcaca745 (diff)
KVM: s390: convert __sigp_set_prefix()/handle_set_prefix()
Convert __sigp_set_prefix() and handle_set_prefix() to new guest access functions. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Reviewed-by: Thomas Huth <thuth@linux.vnet.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Diffstat (limited to 'arch/s390')
-rw-r--r--arch/s390/kvm/priv.c20
-rw-r--r--arch/s390/kvm/sigp.c12
2 files changed, 19 insertions, 13 deletions
diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c
index 7066fc5bf48a..dd6ad8445608 100644
--- a/arch/s390/kvm/priv.c
+++ b/arch/s390/kvm/priv.c
@@ -65,8 +65,8 @@ static int handle_set_clock(struct kvm_vcpu *vcpu)
65static int handle_set_prefix(struct kvm_vcpu *vcpu) 65static int handle_set_prefix(struct kvm_vcpu *vcpu)
66{ 66{
67 u64 operand2; 67 u64 operand2;
68 u32 address = 0; 68 u32 address;
69 u8 tmp; 69 int rc;
70 70
71 vcpu->stat.instruction_spx++; 71 vcpu->stat.instruction_spx++;
72 72
@@ -80,14 +80,18 @@ static int handle_set_prefix(struct kvm_vcpu *vcpu)
80 return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION); 80 return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
81 81
82 /* get the value */ 82 /* get the value */
83 if (get_guest(vcpu, address, (u32 __user *) operand2)) 83 rc = read_guest(vcpu, operand2, &address, sizeof(address));
84 return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING); 84 if (rc)
85 return kvm_s390_inject_prog_cond(vcpu, rc);
85 86
86 address = address & 0x7fffe000u; 87 address &= 0x7fffe000u;
87 88
88 /* make sure that the new value is valid memory */ 89 /*
89 if (copy_from_guest_absolute(vcpu, &tmp, address, 1) || 90 * Make sure the new value is valid memory. We only need to check the
90 (copy_from_guest_absolute(vcpu, &tmp, address + PAGE_SIZE, 1))) 91 * first page, since address is 8k aligned and memory pieces are always
92 * at least 1MB aligned and have at least a size of 1MB.
93 */
94 if (kvm_is_error_gpa(vcpu->kvm, address))
91 return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING); 95 return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
92 96
93 kvm_s390_set_prefix(vcpu, address); 97 kvm_s390_set_prefix(vcpu, address);
diff --git a/arch/s390/kvm/sigp.c b/arch/s390/kvm/sigp.c
index 26caeb530a78..c0b99e0f6b63 100644
--- a/arch/s390/kvm/sigp.c
+++ b/arch/s390/kvm/sigp.c
@@ -235,7 +235,6 @@ static int __sigp_set_prefix(struct kvm_vcpu *vcpu, u16 cpu_addr, u32 address,
235 struct kvm_vcpu *dst_vcpu = NULL; 235 struct kvm_vcpu *dst_vcpu = NULL;
236 struct kvm_s390_interrupt_info *inti; 236 struct kvm_s390_interrupt_info *inti;
237 int rc; 237 int rc;
238 u8 tmp;
239 238
240 if (cpu_addr < KVM_MAX_VCPUS) 239 if (cpu_addr < KVM_MAX_VCPUS)
241 dst_vcpu = kvm_get_vcpu(vcpu->kvm, cpu_addr); 240 dst_vcpu = kvm_get_vcpu(vcpu->kvm, cpu_addr);
@@ -243,10 +242,13 @@ static int __sigp_set_prefix(struct kvm_vcpu *vcpu, u16 cpu_addr, u32 address,
243 return SIGP_CC_NOT_OPERATIONAL; 242 return SIGP_CC_NOT_OPERATIONAL;
244 li = &dst_vcpu->arch.local_int; 243 li = &dst_vcpu->arch.local_int;
245 244
246 /* make sure that the new value is valid memory */ 245 /*
247 address = address & 0x7fffe000u; 246 * Make sure the new value is valid memory. We only need to check the
248 if (copy_from_guest_absolute(vcpu, &tmp, address, 1) || 247 * first page, since address is 8k aligned and memory pieces are always
249 copy_from_guest_absolute(vcpu, &tmp, address + PAGE_SIZE, 1)) { 248 * at least 1MB aligned and have at least a size of 1MB.
249 */
250 address &= 0x7fffe000u;
251 if (kvm_is_error_gpa(vcpu->kvm, address)) {
250 *reg &= 0xffffffff00000000UL; 252 *reg &= 0xffffffff00000000UL;
251 *reg |= SIGP_STATUS_INVALID_PARAMETER; 253 *reg |= SIGP_STATUS_INVALID_PARAMETER;
252 return SIGP_CC_STATUS_STORED; 254 return SIGP_CC_STATUS_STORED;