diff options
author | Heiko Carstens <heiko.carstens@de.ibm.com> | 2014-01-01 10:47:12 -0500 |
---|---|---|
committer | Christian Borntraeger <borntraeger@de.ibm.com> | 2014-04-22 07:24:42 -0400 |
commit | 665170cb47acbddc202df0d8487ca867b64e1604 (patch) | |
tree | 05f5034f64d609a977435c940e88c050a5b9dec8 /arch/s390 | |
parent | d0bce6054a1759f1b2c86bf553801c77dcaca745 (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.c | 20 | ||||
-rw-r--r-- | arch/s390/kvm/sigp.c | 12 |
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) | |||
65 | static int handle_set_prefix(struct kvm_vcpu *vcpu) | 65 | static 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; |