[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 08/10] xen/arm: ffa: add v1.2 SEND2 header layout


  • To: Jens Wiklander <jens.wiklander@xxxxxxxxxx>
  • From: Bertrand Marquis <Bertrand.Marquis@xxxxxxx>
  • Date: Thu, 4 Dec 2025 09:04:25 +0000
  • Accept-language: en-GB, en-US
  • Arc-authentication-results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 4.158.2.129) smtp.rcpttodomain=linaro.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=pass (signature was verified) header.d=arm.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dkim=[1,1,header.d=arm.com] dmarc=[1,1,header.from=arm.com])
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none
  • Arc-message-signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=zHWEXAD6RCbnQoRj9KlX2IrqkoFJrOxOWkpVO8W/bVE=; b=Ap4j60IQ6wta9FAtYw+uaphUXQKP5H7lrWqFyZs20ZnwDUW6EoY8Lqq16mQbTHs+Oe+Yi9T4P4+Uzvx1JksJMFmD5XuFPAldv6BpgeE8UJZBLVtUVNuV5g3s42sLJQc/1GQb0+rReFUsS26sd0AbbdVCKiPldPxcTdh1+V9CePkfhy31qxjtbG7julyq1IPlGLgKTl1KcjjTdUUm1rOlaAykpab+pbm7LvKF5h0Prgqqj0oRGqvu9wjqwCowB02XEnIEFqyjpqPPg0MuEg4/fPffkrkxVxL8ae+WqgL69M74ZRSf4udZhH7+f9FZdKdFzf09pAPoDDTdruxyA3j6BA==
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=zHWEXAD6RCbnQoRj9KlX2IrqkoFJrOxOWkpVO8W/bVE=; b=tolRNWOiuDLhNIm/tCQcbE8IzMvVVaYOMsrN+E0HkL4y4EkakM0/CoPY9G8oB3iDmn5KM+Hpp9ViixdlanYueL59h67hhiybFFGitp/k0r1f3Zt3osZrGc+/ru6+2+rPYzRlIJrhq4JIEX/q5/HQ2knqlYnz2NSIKBUjYoKjzHwoWvr+DFRchtdndPJYA8EVCop5/8wXPUIauS46qATvjKeitz+MgKNYetdB3UdQ8z+dxGHt1ih9HhqgTbc2I31pX4HM262yomRLpvmP41UUO1QAKFhfpH7iWbCEUXi2b95bkUIPhzhX+NnfawHccYL8mfJSWxdAaYp4fRE1I4aQSg==
  • Arc-seal: i=2; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=pass; b=CaOyQzN7kqsRnHjNqqniBBHifUT+6Oz8Bu3jCU1IlEsNzEff5AW8K9i6k17arqKoh7cg+wL3s5VR7xhWlKVSkLnV1BDsWOAS23kyEEwofhb1P0YDKPRqGJByhiSLRV+ecuctP93HGoA8ReytXDRf983NQQNKRx/COpRmZmgBgkqxCXPhwHDK/Xl8MTbYTvPMNyS00yc4MTJrQqFnigxcr534hZKTgyhw+zG5d9sbZdGutUb43Gcx7lmdKOgShZwwXxwbaNiuOsQf/S2sZMP4YgSxET9DdIs/sQf4Mrpjo5rS8MZZFmbx5h2MV8SWYAQ3V4Qg/SVh4LD3RjRWUhOtvg==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=TxMG7l8mW+dtGouuiIxQJVzAFKqfEwBy9wu7cX9mqAuBY8uvv+JhR4T6JtDEltiguPV1Wy+4a6SRtOfYzIFeykNuTc6edjyZu/JkPSCeEqilNkkKfr59mlkIPq69L1BphFvgE6nDu9fSnDAUgSDfmoljYVHXP/EmYyetyU98OFhD9WOKQvlga7TidSEJdA88f/P0WlVPsLsk9Lxf0f6FRFfYA5+Ig20EjLQEPZdETcaEtEtnKgPJNNzQoALASVyaazwhyUU0axWiVZLaz3CBgpajoQoQdOEV7ArFF3/cSXMzr6X/r7QEJKXyNkDVhDhTOI1yMTZtqsEZaqnouUoxgQ==
  • Authentication-results-original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com;
  • Cc: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>, Volodymyr Babchuk <volodymyr_babchuk@xxxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>
  • Delivery-date: Thu, 04 Dec 2025 09:05:55 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Nodisclaimer: true
  • Thread-index: AQHcX7chemRTAZm0AECGA5ix0BasKrUQJx4AgAETYYA=
  • Thread-topic: [PATCH 08/10] xen/arm: ffa: add v1.2 SEND2 header layout

HI Jens,

> On 3 Dec 2025, at 17:38, Jens Wiklander <jens.wiklander@xxxxxxxxxx> wrote:
> 
> Hi Bertrand,
> 
> On Thu, Nov 27, 2025 at 4:53 PM Bertrand Marquis
> <bertrand.marquis@xxxxxxx> wrote:
>> 
>> Teach the SEND2 path about the distinct FF-A v1.1 and v1.2 RX/TX header
>> layouts so we can propagate the 128-bit UUIDs introduced in v1.2.
>> 
>> VM-to-VM SEND2 calls now build the larger v1.2 header, zeroing the UUID
>> fields for v1.1 senders, and the dispatcher validates messages using
>> the v1.1 header layout to keep legacy guests working.
>> 
>> Signed-off-by: Bertrand Marquis <bertrand.marquis@xxxxxxx>
>> ---
>> xen/arch/arm/tee/ffa_msg.c | 55 +++++++++++++++++++++++++++++---------
>> 1 file changed, 42 insertions(+), 13 deletions(-)
>> 
>> diff --git a/xen/arch/arm/tee/ffa_msg.c b/xen/arch/arm/tee/ffa_msg.c
>> index 8bb4bd93f724..472bfad79dd3 100644
>> --- a/xen/arch/arm/tee/ffa_msg.c
>> +++ b/xen/arch/arm/tee/ffa_msg.c
>> @@ -13,7 +13,7 @@
>> #include "ffa_private.h"
>> 
>> /* Encoding of partition message in RX/TX buffer */
>> -struct ffa_part_msg_rxtx {
>> +struct ffa_part_msg_rxtx_1_1 {
>>     uint32_t flags;
>>     uint32_t reserved;
>>     uint32_t msg_offset;
>> @@ -21,6 +21,16 @@ struct ffa_part_msg_rxtx {
>>     uint32_t msg_size;
>> };
>> 
>> +struct ffa_part_msg_rxtx_1_2 {
>> +    uint32_t flags;
>> +    uint32_t reserved;
>> +    uint32_t msg_offset;
>> +    uint32_t send_recv_id;
>> +    uint32_t msg_size;
>> +    uint32_t reserved2;
>> +    uint64_t uuid[2];
>> +};
>> +
>> static void ffa_finish_direct_req_run(struct cpu_user_regs *regs,
>>                                       struct arm_smccc_1_2_regs *req)
>> {
>> @@ -104,12 +114,12 @@ out:
>>     ffa_set_regs_error(regs, ret);
>> }
>> 
>> -static int32_t ffa_msg_send2_vm(uint16_t dst_id, const void *src_buf,
>> -                                struct ffa_part_msg_rxtx *src_msg)
>> +static int32_t ffa_msg_send2_vm(struct ffa_ctx *src_ctx, uint16_t dst_id,
>> +                                struct ffa_part_msg_rxtx_1_2 *src_msg)
>> {
>>     struct domain *dst_d;
>>     struct ffa_ctx *dst_ctx;
>> -    struct ffa_part_msg_rxtx *dst_msg;
>> +    struct ffa_part_msg_rxtx_1_2 *dst_msg;
>>     int err;
>>     int32_t ret;
>> 
>> @@ -142,7 +152,7 @@ static int32_t ffa_msg_send2_vm(uint16_t dst_id, const 
>> void *src_buf,
>> 
>>     /* we need to have enough space in the destination buffer */
>>     if ( (dst_ctx->page_count * FFA_PAGE_SIZE -
>> -          sizeof(struct ffa_part_msg_rxtx)) < src_msg->msg_size )
>> +          sizeof(struct ffa_part_msg_rxtx_1_2)) < src_msg->msg_size )
>>     {
>>         ret = FFA_RET_NO_MEMORY;
>>         ffa_rx_release(dst_d);
>> @@ -154,12 +164,24 @@ static int32_t ffa_msg_send2_vm(uint16_t dst_id, const 
>> void *src_buf,
>>     /* prepare destination header */
>>     dst_msg->flags = 0;
>>     dst_msg->reserved = 0;
>> -    dst_msg->msg_offset = sizeof(struct ffa_part_msg_rxtx);
>> +    dst_msg->msg_offset = sizeof(struct ffa_part_msg_rxtx_1_2);
>>     dst_msg->send_recv_id = src_msg->send_recv_id;
>>     dst_msg->msg_size = src_msg->msg_size;
>> +    dst_msg->reserved2 = 0;
>> 
>> -    memcpy(dst_ctx->rx + sizeof(struct ffa_part_msg_rxtx),
>> -           src_buf + src_msg->msg_offset, src_msg->msg_size);
>> +    if ( src_ctx->guest_vers < FFA_VERSION_1_2 )
>> +    {
>> +        dst_msg->uuid[0] = 0;
>> +        dst_msg->uuid[1] = 0;
>> +    }
>> +    else
>> +    {
>> +        dst_msg->uuid[0] = src_msg->uuid[0];
>> +        dst_msg->uuid[1] = src_msg->uuid[1];
>> +    }
>> +
>> +    memcpy(dst_ctx->rx + sizeof(struct ffa_part_msg_rxtx_1_2),
>> +           src_ctx->tx + src_msg->msg_offset, src_msg->msg_size);
>> 
>>     /* receiver rx buffer will be released by the receiver*/
>> 
>> @@ -175,11 +197,17 @@ int32_t ffa_handle_msg_send2(struct cpu_user_regs 
>> *regs)
>> {
>>     struct domain *src_d = current->domain;
>>     struct ffa_ctx *src_ctx = src_d->arch.tee;
>> -    struct ffa_part_msg_rxtx src_msg;
>> +    /*
>> +     * src_msg is interpreted as v1.2 header, but:
>> +     * - for v1.1 guests, uuid[] is ignored and may contain payload bytes
>> +     * - for v1.2 guests, uuid[] carries the FF-A v1.2 UUID fields
>> +     */
>> +    struct ffa_part_msg_rxtx_1_2 src_msg;
>>     uint16_t dst_id, src_id;
>>     int32_t ret;
>> 
>> -    BUILD_BUG_ON(sizeof(struct ffa_part_msg_rxtx) >= FFA_PAGE_SIZE);
>> +    BUILD_BUG_ON(sizeof(struct ffa_part_msg_rxtx_1_1) >= FFA_PAGE_SIZE);
>> +    BUILD_BUG_ON(sizeof(struct ffa_part_msg_rxtx_1_2) >= FFA_PAGE_SIZE);
>> 
>>     if ( !spin_trylock(&src_ctx->tx_lock) )
>>         return FFA_RET_BUSY;
>> @@ -190,14 +218,15 @@ int32_t ffa_handle_msg_send2(struct cpu_user_regs 
>> *regs)
>>     src_id = src_msg.send_recv_id >> 16;
>>     dst_id = src_msg.send_recv_id & GENMASK(15,0);
>> 
>> -    if ( src_id != ffa_get_vm_id(src_d) )
>> +    if ( src_id != ffa_get_vm_id(src_d) ||
>> +         dst_id == ffa_get_vm_id(src_d) )
> 
> It might be worth mentioning in the commit message that we're making
> it a bit more robust.

Ack i will add this in the commit message.

> 
>>     {
>>         ret = FFA_RET_INVALID_PARAMETERS;
>>         goto out;
>>     }
>> 
>>     /* check source message fits in buffer */
>> -    if ( src_msg.msg_offset < sizeof(struct ffa_part_msg_rxtx) ||
>> +    if ( src_msg.msg_offset < sizeof(struct ffa_part_msg_rxtx_1_1) ||
> 
> This is for FF-A version 1.1; for version 1.2, the minimal offset must
> be larger.

Yes you are right.

I will update the check and optimize things a little bit setting here the
uuid to 0 in src_msg if sender is < 1.1. This will remove the need to 
transfer the context to test the version to ffa_msg_send2_vm.

Thanks for the finding :-)

Cheers
Bertrand


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.