[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [XEN PATCH v8 09/22] xen/arm: ffa: add direct request support
On Thu, Apr 13, 2023 at 3:44 PM Bertrand Marquis <Bertrand.Marquis@xxxxxxx> wrote: > > Hi, > > > On 13 Apr 2023, at 15:27, Julien Grall <julien@xxxxxxx> wrote: > > > > > > > > On 13/04/2023 14:20, Bertrand Marquis wrote: > >> Hi Julien, > >>> On 13 Apr 2023, at 15:15, Julien Grall <julien@xxxxxxx> wrote: > >>> > >>> Hi, > >>> > >>> On 13/04/2023 08:14, Jens Wiklander wrote: > >>>> Adds support for sending a FF-A direct request. Checks that the SP also > >>>> supports handling a 32-bit direct request. 64-bit direct requests are > >>>> not used by the mediator itself so there is not need to check for that. > >>>> Signed-off-by: Jens Wiklander <jens.wiklander@xxxxxxxxxx> > >>>> --- > >>>> xen/arch/arm/tee/ffa.c | 112 +++++++++++++++++++++++++++++++++++++++++ > >>>> 1 file changed, 112 insertions(+) > >>>> diff --git a/xen/arch/arm/tee/ffa.c b/xen/arch/arm/tee/ffa.c > >>>> index f129879c5b81..f2cce955d981 100644 > >>>> --- a/xen/arch/arm/tee/ffa.c > >>>> +++ b/xen/arch/arm/tee/ffa.c > >>>> @@ -181,6 +181,56 @@ static bool ffa_get_version(uint32_t *vers) > >>>> return true; > >>>> } > >>>> +static int32_t get_ffa_ret_code(const struct arm_smccc_1_2_regs *resp) > >>>> +{ > >>>> + switch ( resp->a0 ) > >>>> + { > >>>> + case FFA_ERROR: > >>>> + if ( resp->a2 ) > >>>> + return resp->a2; > >>>> + else > >>>> + return FFA_RET_NOT_SUPPORTED; > >>>> + case FFA_SUCCESS_32: > >>>> + case FFA_SUCCESS_64: > >>>> + return FFA_RET_OK; > >>>> + default: > >>>> + return FFA_RET_NOT_SUPPORTED; > >>>> + } > >>>> +} > >>>> + > >>>> +static int32_t ffa_simple_call(uint32_t fid, register_t a1, register_t > >>>> a2, > >>>> + register_t a3, register_t a4) > >>>> +{ > >>>> + const struct arm_smccc_1_2_regs arg = { > >>>> + .a0 = fid, > >>>> + .a1 = a1, > >>>> + .a2 = a2, > >>>> + .a3 = a3, > >>>> + .a4 = a4, > >>>> + }; > >>>> + struct arm_smccc_1_2_regs resp; > >>>> + > >>>> + arm_smccc_1_2_smc(&arg, &resp); > >>>> + > >>>> + return get_ffa_ret_code(&resp); > >>>> +} > >>>> + > >>>> +static int32_t ffa_features(uint32_t id) > >>>> +{ > >>>> + return ffa_simple_call(FFA_FEATURES, id, 0, 0, 0); > >>>> +} > >>>> + > >>>> +static bool check_mandatory_feature(uint32_t id) > >>>> +{ > >>>> + int32_t ret = ffa_features(id); > >>>> + > >>>> + if (ret) > >>>> + printk(XENLOG_ERR "ffa: mandatory feature id %#x missing: error > >>>> %d\n", > >>>> + id, ret); > >>>> + > >>>> + return !ret; > >>>> +} > >>>> + > >>>> static uint16_t get_vm_id(const struct domain *d) > >>>> { > >>>> /* +1 since 0 is reserved for the hypervisor in FF-A */ > >>>> @@ -222,6 +272,57 @@ static void handle_version(struct cpu_user_regs > >>>> *regs) > >>>> set_regs(regs, vers, 0, 0, 0, 0, 0, 0, 0); > >>>> } > >>>> +static void handle_msg_send_direct_req(struct cpu_user_regs *regs, > >>>> uint32_t fid) > >>>> +{ > >>>> + struct arm_smccc_1_2_regs arg = { .a0 = fid, }; > >>>> + struct arm_smccc_1_2_regs resp = { }; > >>>> + struct domain *d = current->domain; > >>>> + uint32_t src_dst; > >>>> + uint64_t mask; > >>>> + > >>>> + if ( smccc_is_conv_64(fid) ) > >>>> + mask = GENMASK_ULL(63, 0); > >>>> + else > >>>> + mask = GENMASK_ULL(31, 0); > >>>> + > >>>> + src_dst = get_user_reg(regs, 1); > >>>> + if ( (src_dst >> 16) != get_vm_id(d) ) > >>>> + { > >>>> + resp.a0 = FFA_ERROR; > >>>> + resp.a2 = FFA_RET_INVALID_PARAMETERS; > >>>> + goto out; > >>>> + } > >>>> + > >>>> + arg.a1 = src_dst; > >>>> + arg.a2 = get_user_reg(regs, 2) & mask; > >>>> + arg.a3 = get_user_reg(regs, 3) & mask; > >>>> + arg.a4 = get_user_reg(regs, 4) & mask; > >>>> + arg.a5 = get_user_reg(regs, 5) & mask; > >>>> + arg.a6 = get_user_reg(regs, 6) & mask; > >>>> + arg.a7 = get_user_reg(regs, 7) & mask; > >>>> + > >>>> + arm_smccc_1_2_smc(&arg, &resp); > >>>> + switch ( resp.a0 ) > >>>> + { > >>>> + case FFA_ERROR: > >>>> + case FFA_SUCCESS_32: > >>>> + case FFA_SUCCESS_64: > >>>> + case FFA_MSG_SEND_DIRECT_RESP_32: > >>>> + case FFA_MSG_SEND_DIRECT_RESP_64: > >>>> + break; > >>>> + default: > >>>> + /* Bad fid, report back. */ > >>>> + memset(&arg, 0, sizeof(arg)); > >>>> + arg.a0 = FFA_ERROR; > >>>> + arg.a1 = src_dst; > >>>> + arg.a2 = FFA_RET_ABORTED; > >>>> + } > >>>> + > >>>> +out: > >>>> + set_regs(regs, resp.a0, resp.a1 & mask, resp.a2 & mask, resp.a3 & > >>>> mask, > >>>> + resp.a4 & mask, resp.a5 & mask, resp.a6 & mask, resp.a7 & > >>>> mask); > >>>> +} > >>>> + > >>>> static bool ffa_handle_call(struct cpu_user_regs *regs) > >>>> { > >>>> uint32_t fid = get_user_reg(regs, 0); > >>>> @@ -239,6 +340,10 @@ static bool ffa_handle_call(struct cpu_user_regs > >>>> *regs) > >>>> case FFA_ID_GET: > >>>> set_regs_success(regs, get_vm_id(d), 0); > >>>> return true; > >>>> + case FFA_MSG_SEND_DIRECT_REQ_32: > >>>> + case FFA_MSG_SEND_DIRECT_REQ_64: > >>>> + handle_msg_send_direct_req(regs, fid); > >>>> + return true; > >>>> default: > >>>> gprintk(XENLOG_ERR, "ffa: unhandled fid 0x%x\n", fid); > >>>> @@ -326,6 +431,13 @@ static bool ffa_probe(void) > >>>> printk(XENLOG_INFO "ARM FF-A Firmware version %u.%u\n", > >>>> major_vers, minor_vers); > >>>> + /* > >>>> + * TODO save result of checked features and use that information to > >>>> + * accept or reject requests from guests. > >>>> + */ > >>> > >>> I am not entirely sure I understand this TODO. Does it mean a guest can > >>> currently use a request that is not supported by FFA? > >> In fact this is a bit the opposite: in the following patch we check that > >> all features we could need are supported but if a guest is only using a > >> subset we might not need to have all of them. > >> Idea of this TODO would be to save the features supported and refuse guest > >> requests depending on the features needed for them. > > > > Thanks. I would suggest the following comment: > > > > /* > > * At the moment domains must supports the same features used by Xen. > > * TODO: Rework the code to allow domain to use a subset of the features > > * supported. > > */ > > > > Note that I am using "domains" rather than "guests" because the latter > > doesn't include dom0. > > Makes sense and new comment is nice. That's better, I'll update it. Thanks, Jens > > Up to Jens to say if he is ok with it. > > Cheers > Bertrand > > > > > Cheers, > > > > -- > > Julien Grall > >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |