Commit 665170cb authored by Heiko Carstens's avatar Heiko Carstens Committed by Christian Borntraeger

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: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Reviewed-by: default avatarThomas Huth <thuth@linux.vnet.ibm.com>
Signed-off-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
parent d0bce605
...@@ -65,8 +65,8 @@ static int handle_set_clock(struct kvm_vcpu *vcpu) ...@@ -65,8 +65,8 @@ static int handle_set_clock(struct kvm_vcpu *vcpu)
static int handle_set_prefix(struct kvm_vcpu *vcpu) static int handle_set_prefix(struct kvm_vcpu *vcpu)
{ {
u64 operand2; u64 operand2;
u32 address = 0; u32 address;
u8 tmp; int rc;
vcpu->stat.instruction_spx++; vcpu->stat.instruction_spx++;
...@@ -80,14 +80,18 @@ static int handle_set_prefix(struct kvm_vcpu *vcpu) ...@@ -80,14 +80,18 @@ static int handle_set_prefix(struct kvm_vcpu *vcpu)
return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION); return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
/* get the value */ /* get the value */
if (get_guest(vcpu, address, (u32 __user *) operand2)) rc = read_guest(vcpu, operand2, &address, sizeof(address));
return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING); if (rc)
return kvm_s390_inject_prog_cond(vcpu, rc);
address = address & 0x7fffe000u; address &= 0x7fffe000u;
/* make sure that the new value is valid memory */ /*
if (copy_from_guest_absolute(vcpu, &tmp, address, 1) || * Make sure the new value is valid memory. We only need to check the
(copy_from_guest_absolute(vcpu, &tmp, address + PAGE_SIZE, 1))) * first page, since address is 8k aligned and memory pieces are always
* at least 1MB aligned and have at least a size of 1MB.
*/
if (kvm_is_error_gpa(vcpu->kvm, address))
return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING); return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
kvm_s390_set_prefix(vcpu, address); kvm_s390_set_prefix(vcpu, address);
......
...@@ -235,7 +235,6 @@ static int __sigp_set_prefix(struct kvm_vcpu *vcpu, u16 cpu_addr, u32 address, ...@@ -235,7 +235,6 @@ static int __sigp_set_prefix(struct kvm_vcpu *vcpu, u16 cpu_addr, u32 address,
struct kvm_vcpu *dst_vcpu = NULL; struct kvm_vcpu *dst_vcpu = NULL;
struct kvm_s390_interrupt_info *inti; struct kvm_s390_interrupt_info *inti;
int rc; int rc;
u8 tmp;
if (cpu_addr < KVM_MAX_VCPUS) if (cpu_addr < KVM_MAX_VCPUS)
dst_vcpu = kvm_get_vcpu(vcpu->kvm, cpu_addr); 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,10 +242,13 @@ static int __sigp_set_prefix(struct kvm_vcpu *vcpu, u16 cpu_addr, u32 address,
return SIGP_CC_NOT_OPERATIONAL; return SIGP_CC_NOT_OPERATIONAL;
li = &dst_vcpu->arch.local_int; li = &dst_vcpu->arch.local_int;
/* make sure that the new value is valid memory */ /*
address = address & 0x7fffe000u; * Make sure the new value is valid memory. We only need to check the
if (copy_from_guest_absolute(vcpu, &tmp, address, 1) || * first page, since address is 8k aligned and memory pieces are always
copy_from_guest_absolute(vcpu, &tmp, address + PAGE_SIZE, 1)) { * at least 1MB aligned and have at least a size of 1MB.
*/
address &= 0x7fffe000u;
if (kvm_is_error_gpa(vcpu->kvm, address)) {
*reg &= 0xffffffff00000000UL; *reg &= 0xffffffff00000000UL;
*reg |= SIGP_STATUS_INVALID_PARAMETER; *reg |= SIGP_STATUS_INVALID_PARAMETER;
return SIGP_CC_STATUS_STORED; return SIGP_CC_STATUS_STORED;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment