From: Fuad Tabba <ta...@google.com>

Filter out advertising unsupported features, and only advertise
features and properties that are supported by the hypervisor proxy.

Signed-off-by: Fuad Tabba <ta...@google.com>
Signed-off-by: Quentin Perret <qper...@google.com>
---
 arch/arm64/kvm/hyp/nvhe/ffa.c | 44 +++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/arch/arm64/kvm/hyp/nvhe/ffa.c b/arch/arm64/kvm/hyp/nvhe/ffa.c
index 969d72390844..d199f868583e 100644
--- a/arch/arm64/kvm/hyp/nvhe/ffa.c
+++ b/arch/arm64/kvm/hyp/nvhe/ffa.c
@@ -45,6 +45,16 @@ static void ffa_to_smccc_error(struct arm_smccc_res *res, 
u64 ffa_errno)
        };
 }
 
+static void ffa_to_smccc_res_prop(struct arm_smccc_res *res, int ret, u64 prop)
+{
+       if (ret == FFA_RET_SUCCESS) {
+               *res = (struct arm_smccc_res) { .a0 = FFA_SUCCESS,
+                                               .a2 = prop };
+       } else {
+               ffa_to_smccc_error(res, ret);
+       }
+}
+
 static void ffa_set_retval(struct kvm_cpu_context *ctxt,
                           struct arm_smccc_res *res)
 {
@@ -89,6 +99,35 @@ static bool ffa_call_unsupported(u64 func_id)
        return false;
 }
 
+static bool do_ffa_features(struct arm_smccc_res *res,
+                           struct kvm_cpu_context *ctxt)
+{
+       DECLARE_REG(u32, id, ctxt, 1);
+       u64 prop = 0;
+       int ret = 0;
+
+       if (ffa_call_unsupported(id)) {
+               ret = FFA_RET_NOT_SUPPORTED;
+               goto out_handled;
+       }
+
+       switch (id) {
+       case FFA_MEM_SHARE:
+       case FFA_FN64_MEM_SHARE:
+       case FFA_MEM_LEND:
+       case FFA_FN64_MEM_LEND:
+               ret = FFA_RET_SUCCESS;
+               prop = 0; /* No support for dynamic buffers */
+               goto out_handled;
+       default:
+               return false;
+       }
+
+out_handled:
+       ffa_to_smccc_res_prop(res, ret, prop);
+       return true;
+}
+
 bool kvm_host_ffa_handler(struct kvm_cpu_context *host_ctxt)
 {
        DECLARE_REG(u64, func_id, host_ctxt, 0);
@@ -98,6 +137,10 @@ bool kvm_host_ffa_handler(struct kvm_cpu_context *host_ctxt)
                return false;
 
        switch (func_id) {
+       case FFA_FEATURES:
+               if (!do_ffa_features(&res, host_ctxt))
+                       return false;
+               goto out_handled;
        /* Memory management */
        case FFA_FN64_RXTX_MAP:
        case FFA_RXTX_UNMAP:
@@ -114,6 +157,7 @@ bool kvm_host_ffa_handler(struct kvm_cpu_context *host_ctxt)
                return false; /* Pass through */
 
        ffa_to_smccc_error(&res, FFA_RET_NOT_SUPPORTED);
+out_handled:
        ffa_set_retval(host_ctxt, &res);
        return true;
 }
-- 
2.38.1.431.g37b22c650d-goog

_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

Reply via email to