|
@@ -64,12 +64,12 @@ static int __diag_page_ref_service(struct kvm_vcpu *vcpu)
|
|
int rc;
|
|
int rc;
|
|
u16 rx = (vcpu->arch.sie_block->ipa & 0xf0) >> 4;
|
|
u16 rx = (vcpu->arch.sie_block->ipa & 0xf0) >> 4;
|
|
u16 ry = (vcpu->arch.sie_block->ipa & 0x0f);
|
|
u16 ry = (vcpu->arch.sie_block->ipa & 0x0f);
|
|
- unsigned long hva_token = KVM_HVA_ERR_BAD;
|
|
|
|
|
|
|
|
if (vcpu->run->s.regs.gprs[rx] & 7)
|
|
if (vcpu->run->s.regs.gprs[rx] & 7)
|
|
return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
|
|
return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
|
|
- if (copy_from_guest(vcpu, &parm, vcpu->run->s.regs.gprs[rx], sizeof(parm)))
|
|
|
|
- return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
|
|
|
|
|
|
+ rc = read_guest(vcpu, vcpu->run->s.regs.gprs[rx], &parm, sizeof(parm));
|
|
|
|
+ if (rc)
|
|
|
|
+ return kvm_s390_inject_prog_cond(vcpu, rc);
|
|
if (parm.parm_version != 2 || parm.parm_len < 5 || parm.code != 0x258)
|
|
if (parm.parm_version != 2 || parm.parm_len < 5 || parm.code != 0x258)
|
|
return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
|
|
return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
|
|
|
|
|
|
@@ -89,8 +89,7 @@ static int __diag_page_ref_service(struct kvm_vcpu *vcpu)
|
|
parm.token_addr & 7 || parm.zarch != 0x8000000000000000ULL)
|
|
parm.token_addr & 7 || parm.zarch != 0x8000000000000000ULL)
|
|
return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
|
|
return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION);
|
|
|
|
|
|
- hva_token = gfn_to_hva(vcpu->kvm, gpa_to_gfn(parm.token_addr));
|
|
|
|
- if (kvm_is_error_hva(hva_token))
|
|
|
|
|
|
+ if (kvm_is_error_gpa(vcpu->kvm, parm.token_addr))
|
|
return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
|
|
return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
|
|
|
|
|
|
vcpu->arch.pfault_token = parm.token_addr;
|
|
vcpu->arch.pfault_token = parm.token_addr;
|