feat(dir_msg) extend FFA_MSG_SEND_DIRECT_REQ2 registers
Allow FF-A v1.2 ABI FFA_MSG_SEND_DIRECT_REQ2 to use extended set of
implementation-defined register values (x4-x17 instead of x4-x7).
Signed-off-by: Kathleen Capella <kathleen.capella@arm.com>
Change-Id: I2aaa4269b32632b8e4ac4ad2e5319520be2a69e6
diff --git a/src/api.c b/src/api.c
index bf29458..de3a763 100644
--- a/src/api.c
+++ b/src/api.c
@@ -1082,6 +1082,22 @@
return true;
}
+/*
+ * Helper to check if extended arguments (corresponding to regs x8-x17)
+ * are zeroed out.
+ */
+static bool api_extended_args_are_zero(struct ffa_value *args)
+{
+ if (args->extended_val.arg8 != 0U || args->extended_val.arg9 != 0U ||
+ args->extended_val.arg10 != 0U || args->extended_val.arg11 != 0U ||
+ args->extended_val.arg12 != 0U || args->extended_val.arg13 != 0U ||
+ args->extended_val.arg14 != 0U || args->extended_val.arg15 != 0U ||
+ args->extended_val.arg16 != 0U || args->extended_val.arg17 != 0U) {
+ return false;
+ }
+ return true;
+}
+
struct ffa_value api_ffa_msg_wait(struct vcpu *current, struct vcpu **next,
struct ffa_value *args)
{
@@ -1098,6 +1114,11 @@
return ffa_error(FFA_INVALID_PARAMETERS);
}
+ if (current->vm->ffa_version >= MAKE_FFA_VERSION(1, 2) &&
+ !api_extended_args_are_zero(args)) {
+ return ffa_error(FFA_INVALID_PARAMETERS);
+ }
+
current_locked = vcpu_lock(current);
if (!plat_ffa_check_runtime_state_transition(
current_locked, current->vm->id, HF_INVALID_VM_ID,
@@ -2546,6 +2567,10 @@
args.arg2 = 0;
}
+ if (args.func == FFA_MSG_SEND_DIRECT_REQ2_64) {
+ args.extended_val.valid = true;
+ }
+
return args;
}
@@ -2719,10 +2744,6 @@
receiver_vcpu->regs_available = false;
receiver_vcpu->direct_request_origin_vm_id = sender_vm_id;
- /*
- * TODO: when extending registers, have to set extended_val.valid before
- * this call.
- */
arch_regs_set_retval(&receiver_vcpu->regs, api_ffa_dir_msg_value(args));
assert(!vm_id_is_current_world(current->vm->id) ||