Hi Bertrand,

On Fri, Dec 5, 2025 at 11:37 AM Bertrand Marquis
<[email protected]> wrote:
>
> Expose the RX/TX MAP capacity field only once a guest has
> negotiated FF-A v1.2.
>
> While there, drop the stale <asm/tee/ffa.h> include.
>
> To comply with the wider v1.2 register ABI, zero registers x8–x17 when
> responding to a v1.2 VM. The dispatcher also rejects SMCCC64 calls from
> AArch32 guests.
>
> Finally, bump Xen's FF-A version to 1.2.
>
> Signed-off-by: Bertrand Marquis <[email protected]>
> ---
> Changes in v1:
> - Remove advertising of YIELD/INTERRUPT/RUN which has now moved to patch
>   adding FFA_RUN support and adapt commit message
> - Use ACCESS_ONCE to read guest_vers
> - Use is_64bit_domain instead of ctx->is_64bit
> ---
>  xen/arch/arm/tee/ffa.c         | 19 +++++++++++++++++--
>  xen/arch/arm/tee/ffa_private.h | 29 ++++++++++++++++++++---------
>  2 files changed, 37 insertions(+), 11 deletions(-)

Looks good.
Reviewed-by: Jens Wiklander <[email protected]>

Cheers,
Jens

>
> diff --git a/xen/arch/arm/tee/ffa.c b/xen/arch/arm/tee/ffa.c
> index 2c6443a7f6a4..ed18e76080d0 100644
> --- a/xen/arch/arm/tee/ffa.c
> +++ b/xen/arch/arm/tee/ffa.c
> @@ -65,7 +65,6 @@
>  #include <asm/event.h>
>  #include <asm/regs.h>
>  #include <asm/smccc.h>
> -#include <asm/tee/ffa.h>
>  #include <asm/tee/tee.h>
>
>  #include "ffa_private.h"
> @@ -296,7 +295,16 @@ static void handle_features(struct cpu_user_regs *regs)
>           * differs from FFA_PAGE_SIZE (SZ_4K).
>           */
>          BUILD_BUG_ON(PAGE_SIZE != FFA_PAGE_SIZE);
> -        ffa_set_regs_success(regs, 0, 0);
> +
> +        /*
> +         * From FFA v1.2, we can give the maximum number of pages we support
> +         * for the RX/TX buffers.
> +         */
> +        if ( ACCESS_ONCE(ctx->guest_vers) < FFA_VERSION_1_2 )
> +            ffa_set_regs_success(regs, 0, 0);
> +        else
> +            ffa_set_regs_success(regs, FFA_MAX_RXTX_PAGE_COUNT << 16, 0);
> +
>          break;
>      case FFA_FEATURE_NOTIF_PEND_INTR:
>          ffa_set_regs_success(regs, GUEST_FFA_NOTIF_PEND_INTR_ID, 0);
> @@ -329,6 +337,13 @@ static bool ffa_handle_call(struct cpu_user_regs *regs)
>      if ( !ctx )
>          return false;
>
> +    if ( !is_64bit_domain(d) && smccc_is_conv_64(fid) )
> +    {
> +        /* 32bit guests should only use 32bit convention calls */
> +        ffa_set_regs_error(regs, FFA_RET_NOT_SUPPORTED);
> +        return true;
> +    }
> +
>      /* A version must be negotiated first */
>      if ( !ACCESS_ONCE(ctx->guest_vers) )
>      {
> diff --git a/xen/arch/arm/tee/ffa_private.h b/xen/arch/arm/tee/ffa_private.h
> index 030e6724743c..1b5aebd6ef6b 100644
> --- a/xen/arch/arm/tee/ffa_private.h
> +++ b/xen/arch/arm/tee/ffa_private.h
> @@ -53,7 +53,7 @@
>   * that particular guest or SP.
>   */
>  #define FFA_MY_VERSION_MAJOR    1U
> -#define FFA_MY_VERSION_MINOR    1U
> +#define FFA_MY_VERSION_MINOR    2U
>  #define FFA_MY_VERSION          MAKE_FFA_VERSION(FFA_MY_VERSION_MAJOR, \
>                                                   FFA_MY_VERSION_MINOR)
>
> @@ -518,14 +518,25 @@ static inline void ffa_set_regs(struct cpu_user_regs 
> *regs, register_t v0,
>                                  register_t v4, register_t v5, register_t v6,
>                                  register_t v7)
>  {
> -        set_user_reg(regs, 0, v0);
> -        set_user_reg(regs, 1, v1);
> -        set_user_reg(regs, 2, v2);
> -        set_user_reg(regs, 3, v3);
> -        set_user_reg(regs, 4, v4);
> -        set_user_reg(regs, 5, v5);
> -        set_user_reg(regs, 6, v6);
> -        set_user_reg(regs, 7, v7);
> +    struct domain *d = current->domain;
> +    struct ffa_ctx *ctx = d->arch.tee;
> +    int i;
> +
> +    set_user_reg(regs, 0, v0);
> +    set_user_reg(regs, 1, v1);
> +    set_user_reg(regs, 2, v2);
> +    set_user_reg(regs, 3, v3);
> +    set_user_reg(regs, 4, v4);
> +    set_user_reg(regs, 5, v5);
> +    set_user_reg(regs, 6, v6);
> +    set_user_reg(regs, 7, v7);
> +
> +    if ( ctx && ACCESS_ONCE(ctx->guest_vers) >= FFA_VERSION_1_2 &&
> +         is_64bit_domain(d) )
> +    {
> +        for (i = 8; i <= 17; i++)
> +            set_user_reg(regs, i, 0);
> +    }
>  }
>
>  static inline void ffa_set_regs_error(struct cpu_user_regs *regs,
> --
> 2.51.2
>

Reply via email to