On Fri, 1 Dec 2023 19:16:57 +0100 Eric Farman <farman@xxxxxxxxxxxxx> wrote: > The various errors that are possible when processing a PQAP > instruction (the absence of a driver hook, an error FROM that > hook), all correctly set the PSW condition code to 3. But if > that processing works successfully, CC0 needs to be set to > convey that everything was fine. > > Fix the check so that the guest can examine the condition code > to determine whether GPR1 has meaningful data. > > Fixes: e5282de93105 ("s390: ap: kvm: add PQAP interception for AQIC") > Signed-off-by: Eric Farman <farman@xxxxxxxxxxxxx> Reviewed-by: Halil Pasic <pasic@xxxxxxxxxxxxx> > --- > arch/s390/kvm/priv.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c > index 621a17fd1a1b..f875a404a0a0 100644 > --- a/arch/s390/kvm/priv.c > +++ b/arch/s390/kvm/priv.c > @@ -676,8 +676,12 @@ static int handle_pqap(struct kvm_vcpu *vcpu) > if (vcpu->kvm->arch.crypto.pqap_hook) { > pqap_hook = *vcpu->kvm->arch.crypto.pqap_hook; > ret = pqap_hook(vcpu); > - if (!ret && vcpu->run->s.regs.gprs[1] & 0x00ff0000) > - kvm_s390_set_psw_cc(vcpu, 3); Maybe a comment that tells pqap_hook() returns 0 or -EOPNOTSUPP that singnals this should be handled by QEMU. But that can certainly be done on top, and it is not a part of a minimal fix. > + if (!ret) { > + if (vcpu->run->s.regs.gprs[1] & 0x00ff0000) > + kvm_s390_set_psw_cc(vcpu, 3); > + else > + kvm_s390_set_psw_cc(vcpu, 0); > + } > up_read(&vcpu->kvm->arch.crypto.pqap_hook_rwsem); > return ret; > }