|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v5 6/6] xen/arm: ffa: Enable VM to VM without firmware
Hi Bertrand,
On Thu, May 22, 2025 at 11:11 AM Bertrand Marquis
<Bertrand.Marquis@xxxxxxx> wrote:
>
> Hi Jens,
>
> > On 22 May 2025, at 10:30, Jens Wiklander <jens.wiklander@xxxxxxxxxx> wrote:
> >
> > Hi,
> >
> > On Thu, May 22, 2025 at 10:18 AM Bertrand Marquis
> > <Bertrand.Marquis@xxxxxxx> wrote:
> >>
> >> Hi Jens,
> >>
> >>> On 22 May 2025, at 10:00, Jens Wiklander <jens.wiklander@xxxxxxxxxx>
> >>> wrote:
> >>>
> >>> Hi Bertrand,
> >>>
> >>> On Wed, Apr 16, 2025 at 9:40 AM Bertrand Marquis
> >>> <bertrand.marquis@xxxxxxx> wrote:
> >>>>
> >>>> When VM to VM support is activated and there is no suitable FF-A support
> >>>> in the firmware, enable FF-A support for VMs to allow using it for VM to
> >>>> VM communications.
> >>>> If there is OP-TEE running in the secure world and using the non FF-A
> >>>> communication system, having CONFIG_FFA_VM_TO_VM could be non functional
> >>>> (if optee is probed first) or OP-TEE could be non functional (if FF-A is
> >>>> probed first) so it is not recommended to activate the configuration
> >>>> option for such systems.
> >>>>
> >>>> To make buffer full notification work between VMs when there is no
> >>>> firmware, rework the notification handling and modify the global flag to
> >>>> only be used as check for firmware notification support instead.
> >>>>
> >>>> Signed-off-by: Bertrand Marquis <bertrand.marquis@xxxxxxx>
> >>>> ---
> >>>> Changes in v5:
> >>>> - init ctx list when there is no firmware
> >>>> - rework init a bit to prevent duplicates
> >>>> - Remove Jens R-b due to changes done
> >>>> Changes in v4:
> >>>> - Fix Optee to OP-TEE in commit message
> >>>> - Add Jens R-b
> >>>> Changes in v3:
> >>>> - fix typos in commit message
> >>>> - add spaces around <<
> >>>> - move notification id fix back into buffer full patch
> >>>> - fix | position in if
> >>>> Changes in v2:
> >>>> - replace ifdef with IS_ENABLED when possible
> >>>> ---
> >>>> xen/arch/arm/tee/ffa.c | 24 ++++++--
> >>>> xen/arch/arm/tee/ffa_notif.c | 104 ++++++++++++++++-------------------
> >>>> 2 files changed, 67 insertions(+), 61 deletions(-)
> >>>>
> >>>> diff --git a/xen/arch/arm/tee/ffa.c b/xen/arch/arm/tee/ffa.c
> >>>> index c1c4c0957091..b86c88cefa8c 100644
> >>>> --- a/xen/arch/arm/tee/ffa.c
> >>>> +++ b/xen/arch/arm/tee/ffa.c
> >>>> @@ -342,8 +342,9 @@ static int ffa_domain_init(struct domain *d)
> >>>> struct ffa_ctx *ctx;
> >>>> int ret;
> >>>>
> >>>> - if ( !ffa_fw_version )
> >>>> + if ( !IS_ENABLED(CONFIG_FFA_VM_TO_VM) && !ffa_fw_version )
> >>>> return -ENODEV;
> >>>> +
> >>>> /*
> >>>> * We are using the domain_id + 1 as the FF-A ID for VMs as FF-A ID 0
> >>>> is
> >>>> * reserved for the hypervisor and we only support secure endpoints
> >>>> using
> >>>> @@ -579,11 +580,8 @@ static bool ffa_probe(void)
> >>>> goto err_rxtx_destroy;
> >>>>
> >>>> ffa_notif_init();
> >>>> - INIT_LIST_HEAD(&ffa_teardown_head);
> >>>> - INIT_LIST_HEAD(&ffa_ctx_head);
> >>>> - init_timer(&ffa_teardown_timer, ffa_teardown_timer_callback, NULL,
> >>>> 0);
> >>>>
> >>>> - return true;
> >>>> + goto exit;
> >>>>
> >>>> err_rxtx_destroy:
> >>>> ffa_rxtx_destroy();
> >>>> @@ -592,6 +590,22 @@ err_no_fw:
> >>>> bitmap_zero(ffa_fw_abi_supported, FFA_ABI_BITMAP_SIZE);
> >>>> printk(XENLOG_WARNING "ARM FF-A No firmware support\n");
> >>>>
> >>>> +exit:
> >>>> + if ( IS_ENABLED(CONFIG_FFA_VM_TO_VM) || ffa_fw_version )
> >>>> + {
> >>>> + INIT_LIST_HEAD(&ffa_teardown_head);
> >>>> + INIT_LIST_HEAD(&ffa_ctx_head);
> >>>> + init_timer(&ffa_teardown_timer, ffa_teardown_timer_callback,
> >>>> NULL, 0);
> >>>> + }
> >>>> +
> >>>> + if ( IS_ENABLED(CONFIG_FFA_VM_TO_VM) )
> >>>> + {
> >>>> + printk(XENLOG_INFO "ARM FF-A only available between VMs\n");
> >>>
> >>> This should only be printed if ffa_fw_version == 0
> >>
> >> Right i will fix but ...
> >>
> >>>
> >>>> + return true;
> >>>> + }
> >>>> + else if ( ffa_fw_version )
> >>>
> >>> The else isn't needed.
> >>
> >> the else is needed so that we return true and not false.
> >
> > I meant the "else" isn't needed, the "if" is still needed, as you explain.
> >
> >>
> >> We have 3 cases:
> >> - firmware is there: return true
> >> - firmware not there but vm to vm enable: return true
> >> - otherwise: return false
> >>
> >> I will modify it like this to make it clearer:
> >> diff --git a/xen/arch/arm/tee/ffa.c b/xen/arch/arm/tee/ffa.c
> >> index 57b648a22840..768b4e9ec968 100644
> >> --- a/xen/arch/arm/tee/ffa.c
> >> +++ b/xen/arch/arm/tee/ffa.c
> >> @@ -601,13 +601,13 @@ exit:
> >> init_timer(&ffa_teardown_timer, ffa_teardown_timer_callback, NULL,
> >> 0);
> >> }
> >>
> >> - if ( IS_ENABLED(CONFIG_FFA_VM_TO_VM) )
> >> + if ( ffa_fw_version )
> >> + return true;
> >> + else if ( IS_ENABLED(CONFIG_FFA_VM_TO_VM) )
> >> {
> >> printk(XENLOG_INFO "ARM FF-A only available between VMs\n");
> >> return true;
> >> }
> >> - else if ( ffa_fw_version )
> >> - return true;
> >>
> >> return false;
> >> }
> >>
> >> Tell me if you agree.
> >
> > Yes, this is an improvement. A return at the end of an if block makes
> > the eventual following "else" redundant. I suppose there are coding
> > styles where it's still preferred. I'm not sure if that applies in
> > Xen, though.
>
> I now get what you mean and you would like the return false to be in a else.
>
> Relooking at the code, i actually do not like the fact that we do so much in
> exit and i think i can move a bit the code to be clearer:
> - put the fw init in a sub function
> - create a vm_to_vm init function
> - in probe call both functions and do the common init part if at least one
> succeded
I was starting to think along those lines, too. :-)
>
> Something like this:
> diff --git a/xen/arch/arm/tee/ffa.c b/xen/arch/arm/tee/ffa.c
> index 57b648a22840..42dfc71a12d7 100644
> --- a/xen/arch/arm/tee/ffa.c
> +++ b/xen/arch/arm/tee/ffa.c
> @@ -478,38 +478,12 @@ static void ffa_init_secondary(void)
> ffa_notif_init_interrupt();
> }
>
> -static bool ffa_probe(void)
> +static bool ffa_probe_fw(void)
> {
> uint32_t vers;
> unsigned int major_vers;
> unsigned int minor_vers;
>
> - /*
> - * FF-A often works in units of 4K pages and currently it's assumed
> - * that we can map memory using that granularity. See also the comment
> - * above the FFA_PAGE_SIZE define.
> - *
> - * It is possible to support a PAGE_SIZE larger than 4K in Xen, but
> - * until that is fully handled in this code make sure that we only use
> - * 4K page sizes.
> - */
> - BUILD_BUG_ON(PAGE_SIZE != FFA_PAGE_SIZE);
> -
> - printk(XENLOG_INFO "ARM FF-A Mediator version %u.%u\n",
> - FFA_MY_VERSION_MAJOR, FFA_MY_VERSION_MINOR);
> -
> - if ( IS_ENABLED(CONFIG_FFA_VM_TO_VM) )
> - {
> - /*
> - * When FFA VM to VM is enabled, the current implementation does not
> - * offer any way to limit which VM can communicate with which VM
> using
> - * FF-A.
> - * Signal this in the xen console and taint the system as insecure.
> - * TODO: Introduce a solution to limit what a VM can do through FFA.
> - */
> - printk(XENLOG_ERR "ffa: VM to VM is enabled, system is insecure
> !!\n");
> - add_taint(TAINT_MACHINE_INSECURE);
> - }
> /*
> * psci_init_smccc() updates this value with what's reported by EL-3
> * or secure world.
> @@ -528,11 +502,6 @@ static bool ffa_probe(void)
> goto err_no_fw;
> }
>
> - /* Some sanity check in case we update the version we support */
> - BUILD_BUG_ON(FFA_MIN_SPMC_VERSION > FFA_MY_VERSION);
> - BUILD_BUG_ON(FFA_VERSION_MAJOR(FFA_MIN_SPMC_VERSION) !=
> - FFA_MY_VERSION_MAJOR);
> -
> major_vers = FFA_VERSION_MAJOR(vers);
> minor_vers = FFA_VERSION_MINOR(vers);
>
> @@ -584,7 +553,7 @@ static bool ffa_probe(void)
>
> ffa_notif_init();
>
> - goto exit;
> + return true;
>
> err_rxtx_destroy:
> ffa_rxtx_destroy();
> @@ -593,23 +562,59 @@ err_no_fw:
> bitmap_zero(ffa_fw_abi_supported, FFA_ABI_BITMAP_SIZE);
> printk(XENLOG_WARNING "ARM FF-A No firmware support\n");
>
> -exit:
> - if ( IS_ENABLED(CONFIG_FFA_VM_TO_VM) || ffa_fw_version )
> - {
> - INIT_LIST_HEAD(&ffa_teardown_head);
> - INIT_LIST_HEAD(&ffa_ctx_head);
> - init_timer(&ffa_teardown_timer, ffa_teardown_timer_callback, NULL,
> 0);
> - }
> + return false;
> +}
>
> - if ( IS_ENABLED(CONFIG_FFA_VM_TO_VM) )
> - {
> +static bool ffa_probe_vm_to_vm(void)
> +{
> + if ( !IS_ENABLED(CONFIG_FFA_VM_TO_VM) )
> + return false;
> +
> + /*
> + * When FFA VM to VM is enabled, the current implementation does not
> + * offer any way to limit which VM can communicate with which VM using
> + * FF-A.
> + * Signal this in the xen console and taint the system as insecure.
> + * TODO: Introduce a solution to limit what a VM can do through FFA.
> + */
> + printk(XENLOG_ERR "ffa: VM to VM is enabled, system is insecure !!\n");
> + add_taint(TAINT_MACHINE_INSECURE);
> +
> + return true;
> +}
> +
> +static bool ffa_probe(void)
> +{
> + /*
> + * FF-A often works in units of 4K pages and currently it's assumed
> + * that we can map memory using that granularity. See also the comment
> + * above the FFA_PAGE_SIZE define.
> + *
> + * It is possible to support a PAGE_SIZE larger than 4K in Xen, but
> + * until that is fully handled in this code make sure that we only use
> + * 4K page sizes.
> + */
> + BUILD_BUG_ON(PAGE_SIZE != FFA_PAGE_SIZE);
> +
> + /* Some sanity check in case we update the version we support */
> + BUILD_BUG_ON(FFA_MIN_SPMC_VERSION > FFA_MY_VERSION);
> + BUILD_BUG_ON(FFA_VERSION_MAJOR(FFA_MIN_SPMC_VERSION) !=
> + FFA_MY_VERSION_MAJOR);
> +
> + printk(XENLOG_INFO "ARM FF-A Mediator version %u.%u\n",
> + FFA_MY_VERSION_MAJOR, FFA_MY_VERSION_MINOR);
> +
> + if ( !ffa_probe_fw() && !ffa_probe_vm_to_vm() )
> + return false;
> +
> + if ( !ffa_fw_version )
> printk(XENLOG_INFO "ARM FF-A only available between VMs\n");
> - return true;
> - }
> - else if ( ffa_fw_version )
> - return true;
>
> - return false;
> + INIT_LIST_HEAD(&ffa_teardown_head);
> + INIT_LIST_HEAD(&ffa_ctx_head);
> + init_timer(&ffa_teardown_timer, ffa_teardown_timer_callback, NULL, 0);
> +
> + return true;
> }
>
> static const struct tee_mediator_ops ffa_ops =
>
> I think this makes the code cleaner as we also get the proper error handling
> with goto
> inside the fw probe instead of the previous one which was trying to handle
> both cases.
>
> What do you think ?
This is good. It's much easier to follow.
Cheers,
Jens
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |