Re: [PATCH v4 06/17] KVM: arm64: Add pkvm_hyp_req infrastructure

Fuad Tabba <[email protected]>
Newsgroups dev.linux.lists.sashiko-reviews,dev.linux.lists.kvmarm
Message-ID <CA+EHjTx0hjergdVY9QA_oprver04ZDEDzt4aV=Jp_pVCpkssCw@mail.gmail.com>
On Fri, 31 Jul 2026 at 16:06, <[email protected]> wrote:
>
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [High] Phantom hypervisor requests leading to infinite loop and memory leak on hypercall errors.
> --
>
> --- Patch [6]: [PATCH v4 06/17] KVM: arm64: Add pkvm_hyp_req infrastructure ---
> commit ec846697735578e1b5a4e25b88e07602c29ae6a2
> Author: Vincent Donnefort <[email protected]>
>
> KVM: arm64: Add pkvm_hyp_req infrastructure
>
> Introduce a struct pkvm_hyp_req to enable the pKVM hypervisor to request
> resources from the host. Provide serialisation helpers to transport these
> requests via SMCCC registers and a macro to automate HVC retries.
>
> > diff --git a/arch/arm64/include/asm/kvm_pkvm.h b/arch/arm64/include/asm/kvm_pkvm.h
> > index 74fedd9c5ff02..6c2497047f8d8 100644
> > --- a/arch/arm64/include/asm/kvm_pkvm.h
> > +++ b/arch/arm64/include/asm/kvm_pkvm.h
>
> [ ... ]
>
> > +/* Return true if a pkvm_hyp_req has been decoded from the SMCCC args */
> > +static inline bool smccc_to_pkvm_hyp_req(struct pkvm_hyp_req *req, struct arm_smccc_res *res)
> > +{
> > +     u8 *src = (u8 *)res + offsetof(struct arm_smccc_res, a2);
> > +     u8 type = *src;
> > +
> > +     if (type == PKVM_HYP_NO_REQ || type >= __PKVM_HYP_REQ_TYPE_MAX)
> > +             return false;
> > +
> > +     req->type = type;
> > +     memcpy(&req->args, src + 1, pkvm_hyp_req_arg_size(type));
> > +
> > +     return true;
> > +}
> > +
> > +int __pkvm_handle_smccc_req(struct arm_smccc_res *res);
> > +
> > +#define pkvm_call_hyp_req(f, ...)                                                            \
> > +({                                                                                           \
> > +     struct arm_smccc_res __res;                                                             \
> > +     int __ret;                                                                              \
> > +     do {                                                                                    \
> > +             __ret = -1;                                                                     \
> > +             arm_smccc_1_1_hvc(KVM_HOST_SMCCC_FUNC(f), ##__VA_ARGS__, &__res);               \
> > +             if (WARN_ON(__res.a0 != SMCCC_RET_SUCCESS))                                     \
> > +                     break;                                                                  \
> > +             __ret = __res.a1;                                                               \
> > +             if (!__ret)                                                                     \
> > +                     break;                                                                  \
> > +             __ret = __pkvm_handle_smccc_req(&__res);                                        \
> > +     } while (!__ret);                                                                       \
> > +     __ret;                                                                                  \
> > +})
>
> [Severity: High]
> Can this sequence lead to an infinite loop and memory leak on hypercall errors?

This does not happen. Every handler reachable through
pkvm_call_hyp_req() goes via errno_to_smccc(), which always calls
pkvm_hyp_req_to_smccc(), and that writes 0 to x2 when there is no
request to pass back. So the decode never sees a stale argument.

/fuad

>
> When the hypercall fails and returns a non-zero error in __res.a1, the macro
> passes the result to __pkvm_handle_smccc_req() to check for a piggybacked
> request in __res.a2.
>
> Standard EL2 handlers typically do not clear the x2 register (which maps to a2)
> on error; they set x1 to the error code and return. This means a2 retains the
> original second hypercall argument passed by the host.
>
> If the least significant byte of that original host argument happens to match
> a valid request type, smccc_to_pkvm_hyp_req() would mistakenly decode a phantom
> request. The host would handle this phantom request, return success, and the
> macro would then infinitely retry the failing hypercall.
>
> Is there a way to explicitly distinguish a hypercall error from a legitimate
> hypervisor request, perhaps using a specific return code in a1 to indicate when
> a2 actually contains a request?
>
> --
> Sashiko AI review · https://sashiko.dev/#/patchset/[email protected]?part=6
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.