From nobody Sat Dec 13 07:25:02 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=fail(p=none dis=none) header.from=arm.com Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 176493131678152.94579268616542; Fri, 5 Dec 2025 02:41:56 -0800 (PST) Received: from list by lists.xenproject.org with outflank-mailman.1178748.1502483 (Exim 4.92) (envelope-from ) id 1vRTFt-0003zn-JR; Fri, 05 Dec 2025 10:41:41 +0000 Received: by outflank-mailman (output) from mailman id 1178748.1502483; Fri, 05 Dec 2025 10:41:41 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1vRTFt-0003zg-Gt; Fri, 05 Dec 2025 10:41:41 +0000 Received: by outflank-mailman (input) for mailman id 1178748; Fri, 05 Dec 2025 10:41:40 +0000 Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254] helo=se1-gles-sth1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1vRTCD-0005j7-Tn for xen-devel@lists.xenproject.org; Fri, 05 Dec 2025 10:37:53 +0000 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by se1-gles-sth1.inumbo.com (Halon) with ESMTP id 7417b842-d1c6-11f0-9d1b-b5c5bf9af7f9; Fri, 05 Dec 2025 11:37:53 +0100 (CET) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 438AD1575; Fri, 5 Dec 2025 02:37:45 -0800 (PST) Received: from C3HXLD123V.arm.com (unknown [10.57.45.211]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 902FC3F86F; Fri, 5 Dec 2025 02:37:51 -0800 (PST) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 7417b842-d1c6-11f0-9d1b-b5c5bf9af7f9 From: Bertrand Marquis To: xen-devel@lists.xenproject.org Cc: jens.wiklander@linaro.org, Volodymyr Babchuk , Stefano Stabellini , Julien Grall , Michal Orzel Subject: [PATCH v1 11/12] xen/arm: ffa: add MSG_SEND_DIRECT_REQ2 support Date: Fri, 5 Dec 2025 11:36:44 +0100 Message-ID: <55a3df6c73581e7e77a76230cd445ccb16608269.1764930353.git.bertrand.marquis@arm.com> X-Mailer: git-send-email 2.51.2 In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1764931317505019200 Extend the direct-request path so FF-A v1.2 guests can issue FFA_MSG_SEND_DIRECT_REQ2 and receive the matching RESP2. The handler now marshals registers x8=E2=80=93x17, and ffa_finish_direct_req_run() copies back the 17-register response used by FFA_MSG_SEND_DIRECT_RESP2. The new opcode is exposed via FFA_FEATURES and gated on guests that negotiated v1.2. Signed-off-by: Bertrand Marquis Reviewed-by: Jens Wiklander --- Changes in v1: - use ACCESS_ONCE to read guest_vers --- xen/arch/arm/tee/ffa.c | 20 +++++++++++++++++++ xen/arch/arm/tee/ffa_msg.c | 39 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/xen/arch/arm/tee/ffa.c b/xen/arch/arm/tee/ffa.c index 0f07efe5a7b3..2c6443a7f6a4 100644 --- a/xen/arch/arm/tee/ffa.c +++ b/xen/arch/arm/tee/ffa.c @@ -237,6 +237,8 @@ out_continue: static void handle_features(struct cpu_user_regs *regs) { uint32_t a1 =3D get_user_reg(regs, 1); + struct domain *d =3D current->domain; + struct ffa_ctx *ctx =3D d->arch.tee; unsigned int n; =20 for ( n =3D 2; n <=3D 7; n++ ) @@ -268,6 +270,16 @@ static void handle_features(struct cpu_user_regs *regs) case FFA_MSG_YIELD: ffa_set_regs_success(regs, 0, 0); break; + case FFA_MSG_SEND_DIRECT_REQ2: + if ( ACCESS_ONCE(ctx->guest_vers) >=3D FFA_VERSION_1_2 ) + { + ffa_set_regs_success(regs, 0, 0); + } + else + { + ffa_set_regs_error(regs, FFA_RET_NOT_SUPPORTED); + } + break; case FFA_MEM_SHARE_64: case FFA_MEM_SHARE_32: /* @@ -353,6 +365,14 @@ static bool ffa_handle_call(struct cpu_user_regs *regs) case FFA_MSG_SEND_DIRECT_REQ_64: ffa_handle_msg_send_direct_req(regs, fid); return true; + case FFA_MSG_SEND_DIRECT_REQ2: + if ( ACCESS_ONCE(ctx->guest_vers) >=3D FFA_VERSION_1_2 ) + { + ffa_handle_msg_send_direct_req(regs, fid); + return true; + } + e =3D FFA_RET_NOT_SUPPORTED; + break; case FFA_RUN: ffa_handle_run(regs, fid); return true; diff --git a/xen/arch/arm/tee/ffa_msg.c b/xen/arch/arm/tee/ffa_msg.c index c3552a3ae36d..4e26596461a9 100644 --- a/xen/arch/arm/tee/ffa_msg.c +++ b/xen/arch/arm/tee/ffa_msg.c @@ -49,6 +49,30 @@ static void ffa_finish_direct_req_run(struct cpu_user_re= gs *regs, case FFA_MSG_YIELD: case FFA_INTERRUPT: break; + case FFA_MSG_SEND_DIRECT_RESP2: + /* + * REQ2 / RESP2 use a 17-register payload (x1=E2=80=93x17). Copy a= ll of them + * back to the guest context. + */ + set_user_reg(regs, 0, resp.a0); + set_user_reg(regs, 1, resp.a1); + set_user_reg(regs, 2, resp.a2); + set_user_reg(regs, 3, resp.a3); + set_user_reg(regs, 4, resp.a4); + set_user_reg(regs, 5, resp.a5); + set_user_reg(regs, 6, resp.a6); + set_user_reg(regs, 7, resp.a7); + set_user_reg(regs, 8, resp.a8); + set_user_reg(regs, 9, resp.a9); + set_user_reg(regs, 10, resp.a10); + set_user_reg(regs, 11, resp.a11); + set_user_reg(regs, 12, resp.a12); + set_user_reg(regs, 13, resp.a13); + set_user_reg(regs, 14, resp.a14); + set_user_reg(regs, 15, resp.a15); + set_user_reg(regs, 16, resp.a16); + set_user_reg(regs, 17, resp.a17); + return; default: /* Bad fid, report back to the caller. */ ffa_set_regs_error(regs, FFA_RET_ABORTED); @@ -107,6 +131,21 @@ void ffa_handle_msg_send_direct_req(struct cpu_user_re= gs *regs, uint32_t fid) arg.a6 =3D get_user_reg(regs, 6) & mask; arg.a7 =3D get_user_reg(regs, 7) & mask; =20 + if ( fid =3D=3D FFA_MSG_SEND_DIRECT_REQ2 ) + { + /* 17 registers are used for REQ2 */ + arg.a8 =3D get_user_reg(regs, 8); + arg.a9 =3D get_user_reg(regs, 9); + arg.a10 =3D get_user_reg(regs, 10); + arg.a11 =3D get_user_reg(regs, 11); + arg.a12 =3D get_user_reg(regs, 12); + arg.a13 =3D get_user_reg(regs, 13); + arg.a14 =3D get_user_reg(regs, 14); + arg.a15 =3D get_user_reg(regs, 15); + arg.a16 =3D get_user_reg(regs, 16); + arg.a17 =3D get_user_reg(regs, 17); + } + ffa_finish_direct_req_run(regs, &arg); return; =20 --=20 2.51.2