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>
This commit is contained in:
parent
d0bce6054a
commit
665170cb47
2 changed files with 19 additions and 13 deletions
|
@ -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)
|
||||||
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,
|
||||||
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,
|
||||||
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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue